@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,125 @@
|
|
|
1
|
+
/** Exact IPC validation for immutable scratch run-root intents. */
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Whether an object has exactly the declared own string keys.
|
|
5
|
+
* @param value - Candidate object
|
|
6
|
+
* @param keys - Required exact keys
|
|
7
|
+
* @returns Whether the keys match exactly
|
|
8
|
+
*/
|
|
9
|
+
function hasExactKeys(value, keys) {
|
|
10
|
+
const actual = Object.keys(value).sort((left, right) => left.localeCompare(right));
|
|
11
|
+
const expected = [...keys].sort((left, right) => left.localeCompare(right));
|
|
12
|
+
return (actual.length === expected.length &&
|
|
13
|
+
actual.every((key, index) => key === expected[index]));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Whether a value contains an ASCII control code.
|
|
17
|
+
* @param value - Candidate string
|
|
18
|
+
* @returns Whether a control code is present
|
|
19
|
+
*/
|
|
20
|
+
function hasControlCode(value) {
|
|
21
|
+
return [...value].some(character => {
|
|
22
|
+
const codePoint = character.codePointAt(0) ?? 0;
|
|
23
|
+
return codePoint <= 31 || codePoint === 127;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Whether one value is a bounded, control-free direct basename.
|
|
28
|
+
* @param value - Candidate basename
|
|
29
|
+
* @returns Whether the basename is inert and bounded
|
|
30
|
+
*/
|
|
31
|
+
function validBasename(value) {
|
|
32
|
+
return (typeof value === "string" &&
|
|
33
|
+
value !== "" &&
|
|
34
|
+
value !== "." &&
|
|
35
|
+
value !== ".." &&
|
|
36
|
+
path.basename(value) === value &&
|
|
37
|
+
!value.includes("/") &&
|
|
38
|
+
!value.includes("\\") &&
|
|
39
|
+
Buffer.byteLength(value, "utf8") <= 1_024 &&
|
|
40
|
+
!hasControlCode(value));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Whether one namespace identity has exact bounded fields.
|
|
44
|
+
* @param value - Candidate identity
|
|
45
|
+
* @returns Whether the identity is exact and typed
|
|
46
|
+
*/
|
|
47
|
+
function validNamespaceIdentity(value) {
|
|
48
|
+
if (typeof value !== "object" || value === null)
|
|
49
|
+
return false;
|
|
50
|
+
const candidate = value;
|
|
51
|
+
const keys = Object.hasOwn(candidate, "uid")
|
|
52
|
+
? ["canonicalPath", "dev", "ino", "uid"]
|
|
53
|
+
: ["canonicalPath", "dev", "ino"];
|
|
54
|
+
return (hasExactKeys(candidate, keys) &&
|
|
55
|
+
typeof candidate["canonicalPath"] === "string" &&
|
|
56
|
+
path.isAbsolute(candidate["canonicalPath"]) &&
|
|
57
|
+
Number.isSafeInteger(candidate["dev"]) &&
|
|
58
|
+
Number.isSafeInteger(candidate["ino"]) &&
|
|
59
|
+
(!Object.hasOwn(candidate, "uid") || Number.isSafeInteger(candidate["uid"])));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Whether the scalar and collection fields of one root intent are valid.
|
|
63
|
+
* @param intent - Candidate intent object
|
|
64
|
+
* @param prefixes - Candidate prefix registry
|
|
65
|
+
* @returns Whether every field is bounded and typed
|
|
66
|
+
*/
|
|
67
|
+
function validIntentFields(intent, prefixes) {
|
|
68
|
+
return (Number.isSafeInteger(intent["pid"]) &&
|
|
69
|
+
intent["pid"] > 0 &&
|
|
70
|
+
typeof intent["processBirthFingerprint"] === "string" &&
|
|
71
|
+
intent["processBirthFingerprint"] !== "" &&
|
|
72
|
+
Buffer.byteLength(intent["processBirthFingerprint"], "utf8") <= 256 &&
|
|
73
|
+
typeof intent["createdAt"] === "string" &&
|
|
74
|
+
!Number.isNaN(Date.parse(intent["createdAt"])) &&
|
|
75
|
+
typeof intent["token"] === "string" &&
|
|
76
|
+
/^[a-f0-9]{32}$/u.test(intent["token"]) &&
|
|
77
|
+
typeof intent["suiteLabel"] === "string" &&
|
|
78
|
+
intent["suiteLabel"] !== "" &&
|
|
79
|
+
Buffer.byteLength(intent["suiteLabel"], "utf8") <= 256 &&
|
|
80
|
+
Array.isArray(prefixes) &&
|
|
81
|
+
prefixes.length <= 64 &&
|
|
82
|
+
prefixes.every(validBasename));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Validate an inert scratch-root intent received over IPC.
|
|
86
|
+
* @param value - Candidate intent
|
|
87
|
+
* @returns Schema-validated intent
|
|
88
|
+
*/
|
|
89
|
+
export function validateScratchRunRootIntent(value) {
|
|
90
|
+
if (typeof value !== "object" || value === null) {
|
|
91
|
+
throw new Error("Scratch root intent must be an object");
|
|
92
|
+
}
|
|
93
|
+
const intent = value;
|
|
94
|
+
const authority = intent["authority"];
|
|
95
|
+
const namespace = authority?.["namespace"];
|
|
96
|
+
const validAuthority = authority !== undefined &&
|
|
97
|
+
authority !== null &&
|
|
98
|
+
hasExactKeys(authority, ["baseCanonicalPath", "namespace"]) &&
|
|
99
|
+
typeof authority["baseCanonicalPath"] === "string" &&
|
|
100
|
+
validNamespaceIdentity(namespace);
|
|
101
|
+
const validPath = validAuthority &&
|
|
102
|
+
validBasename(intent["basename"]) &&
|
|
103
|
+
typeof intent["rootPath"] === "string" &&
|
|
104
|
+
intent["rootPath"] ===
|
|
105
|
+
path.join(namespace.canonicalPath, intent["basename"]);
|
|
106
|
+
if (intent["schema"] !== 1 ||
|
|
107
|
+
!hasExactKeys(intent, [
|
|
108
|
+
"schema",
|
|
109
|
+
"authority",
|
|
110
|
+
"basename",
|
|
111
|
+
"rootPath",
|
|
112
|
+
"pid",
|
|
113
|
+
"processBirthFingerprint",
|
|
114
|
+
"createdAt",
|
|
115
|
+
"token",
|
|
116
|
+
"suiteLabel",
|
|
117
|
+
"registeredPrefixes",
|
|
118
|
+
]) ||
|
|
119
|
+
!validPath ||
|
|
120
|
+
!validIntentFields(intent, intent["registeredPrefixes"])) {
|
|
121
|
+
throw new Error("Invalid scratch root intent schema");
|
|
122
|
+
}
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=scratch-supervision-intent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-supervision-intent.js","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-supervision-intent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Versioned IPC envelope after bounded structural validation. */
|
|
2
|
+
export interface ScratchProtocolMessageV1 extends Record<string, unknown> {
|
|
3
|
+
readonly schema: 1;
|
|
4
|
+
readonly type: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Validate a bounded version-one IPC message against the closed vocabulary.
|
|
8
|
+
* @param value - Candidate message
|
|
9
|
+
* @returns Validated message envelope
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseScratchProtocolMessage(value: unknown): ScratchProtocolMessageV1;
|
|
12
|
+
//# sourceMappingURL=scratch-supervision-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-supervision-protocol.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-supervision-protocol.ts"],"names":[],"mappings":"AA8CA,kEAAkE;AAClE,MAAM,WAAW,wBAAyB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAoND;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,OAAO,GACb,wBAAwB,CA8B1B"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/** Bounded, exact IPC envelopes shared by the test-run protocol processes. */
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { validateScratchRunRootIntent } from "./scratch-supervision-intent.js";
|
|
4
|
+
/** Maximum serialized IPC envelope accepted by a protocol process. */
|
|
5
|
+
const MAX_PROTOCOL_BYTES = 128 * 1_024;
|
|
6
|
+
/** Empty message types whose exact schema has no payload fields. */
|
|
7
|
+
const EMPTY_TYPES = new Set([
|
|
8
|
+
"REAPER_READY",
|
|
9
|
+
"COMMAND_READY",
|
|
10
|
+
"GO",
|
|
11
|
+
"STOP",
|
|
12
|
+
"CLEANED",
|
|
13
|
+
"DISARMED",
|
|
14
|
+
]);
|
|
15
|
+
/** Correlated acknowledgement types carrying only the intent token. */
|
|
16
|
+
const CORRELATED_TYPES = new Set([
|
|
17
|
+
"ROOT_INTENT_ARMED",
|
|
18
|
+
"TARGET_ARMED",
|
|
19
|
+
"MATERIALIZE_ROOT",
|
|
20
|
+
]);
|
|
21
|
+
/** Closed protocol message vocabulary. */
|
|
22
|
+
const PROTOCOL_TYPES = new Set([
|
|
23
|
+
...EMPTY_TYPES,
|
|
24
|
+
...CORRELATED_TYPES,
|
|
25
|
+
"ROOT_INTENT",
|
|
26
|
+
"ROOT_ARMED",
|
|
27
|
+
"BOOTSTRAP_READY",
|
|
28
|
+
"COMMAND",
|
|
29
|
+
"TARGET_INTENT",
|
|
30
|
+
"SIGNAL",
|
|
31
|
+
"PAYLOAD_EXIT",
|
|
32
|
+
"PAYLOAD_ERROR",
|
|
33
|
+
]);
|
|
34
|
+
/** Catchable signals accepted by the forwarding protocol. */
|
|
35
|
+
const PROTOCOL_SIGNALS = new Set([
|
|
36
|
+
"SIGINT",
|
|
37
|
+
"SIGTERM",
|
|
38
|
+
"SIGHUP",
|
|
39
|
+
]);
|
|
40
|
+
/**
|
|
41
|
+
* Whether an object has exactly the declared own string keys.
|
|
42
|
+
* @param value - Candidate object
|
|
43
|
+
* @param keys - Required exact keys
|
|
44
|
+
* @returns Whether the keys match exactly
|
|
45
|
+
*/
|
|
46
|
+
function hasExactKeys(value, keys) {
|
|
47
|
+
const actual = Object.keys(value).sort((left, right) => left.localeCompare(right));
|
|
48
|
+
const expected = [...keys].sort((left, right) => left.localeCompare(right));
|
|
49
|
+
return (actual.length === expected.length &&
|
|
50
|
+
actual.every((key, index) => key === expected[index]));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Whether a correlation is one exact root-intent token.
|
|
54
|
+
* @param value - Candidate correlation
|
|
55
|
+
* @returns Whether it is one exact token
|
|
56
|
+
*/
|
|
57
|
+
function validCorrelation(value) {
|
|
58
|
+
return typeof value === "string" && /^[a-f0-9]{32}$/u.test(value);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Whether a bootstrap command is exact, bounded, and inert.
|
|
62
|
+
* @param value - Candidate command
|
|
63
|
+
* @returns Whether the command contract is valid
|
|
64
|
+
*/
|
|
65
|
+
function validBootstrapCommand(value) {
|
|
66
|
+
if (typeof value !== "object" || value === null)
|
|
67
|
+
return false;
|
|
68
|
+
const command = value;
|
|
69
|
+
const argv = command["argv"];
|
|
70
|
+
const commandEnv = command["env"];
|
|
71
|
+
return (hasExactKeys(command, ["schema", "argv", "env"]) &&
|
|
72
|
+
command["schema"] === 1 &&
|
|
73
|
+
Array.isArray(argv) &&
|
|
74
|
+
argv.length > 0 &&
|
|
75
|
+
argv.length <= 4_096 &&
|
|
76
|
+
argv.every(argument => typeof argument === "string" &&
|
|
77
|
+
Buffer.byteLength(argument, "utf8") <= 16 * 1_024) &&
|
|
78
|
+
typeof commandEnv === "object" &&
|
|
79
|
+
commandEnv !== null &&
|
|
80
|
+
Object.keys(commandEnv).length <= 4_096 &&
|
|
81
|
+
Object.entries(commandEnv).every(([key, entry]) => key !== "" &&
|
|
82
|
+
Buffer.byteLength(key, "utf8") <= 1_024 &&
|
|
83
|
+
typeof entry === "string" &&
|
|
84
|
+
Buffer.byteLength(entry, "utf8") <= 64 * 1_024));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Whether a target is one exact, birth-bound process-group leader.
|
|
88
|
+
* @param value - Candidate target
|
|
89
|
+
* @returns Whether the target contract is valid
|
|
90
|
+
*/
|
|
91
|
+
function validTargetIntent(value) {
|
|
92
|
+
if (typeof value !== "object" || value === null)
|
|
93
|
+
return false;
|
|
94
|
+
const target = value;
|
|
95
|
+
return (hasExactKeys(target, ["pid", "pgid", "processBirthFingerprint"]) &&
|
|
96
|
+
Number.isSafeInteger(target["pid"]) &&
|
|
97
|
+
target["pid"] > 0 &&
|
|
98
|
+
target["pgid"] === target["pid"] &&
|
|
99
|
+
typeof target["processBirthFingerprint"] === "string" &&
|
|
100
|
+
target["processBirthFingerprint"] !== "" &&
|
|
101
|
+
Buffer.byteLength(target["processBirthFingerprint"], "utf8") <= 256);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Whether a root identity carries only exact canonical inode authority.
|
|
105
|
+
* @param value - Candidate root identity
|
|
106
|
+
* @returns Whether the value is exact and bounded
|
|
107
|
+
*/
|
|
108
|
+
function validRootIdentity(value) {
|
|
109
|
+
if (typeof value !== "object" || value === null)
|
|
110
|
+
return false;
|
|
111
|
+
const root = value;
|
|
112
|
+
return (hasExactKeys(root, ["canonicalPath", "dev", "ino"]) &&
|
|
113
|
+
typeof root["canonicalPath"] === "string" &&
|
|
114
|
+
path.isAbsolute(root["canonicalPath"]) &&
|
|
115
|
+
Buffer.byteLength(root["canonicalPath"], "utf8") <= 4_096 &&
|
|
116
|
+
Number.isSafeInteger(root["dev"]) &&
|
|
117
|
+
Number.isSafeInteger(root["ino"]));
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Exact-key helper specialized to one protocol message.
|
|
121
|
+
* @param message - Candidate message
|
|
122
|
+
* @param keys - Message-specific keys
|
|
123
|
+
* @returns Whether the complete key set matches
|
|
124
|
+
*/
|
|
125
|
+
function exactMessageKeys(message, keys) {
|
|
126
|
+
return hasExactKeys(message, ["schema", "type", ...keys]);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Validate one correlated ROOT_INTENT message.
|
|
130
|
+
* @param message - Candidate message
|
|
131
|
+
* @returns Whether the root intent is exact
|
|
132
|
+
*/
|
|
133
|
+
function validRootIntentMessage(message) {
|
|
134
|
+
return (exactMessageKeys(message, ["correlation", "intent"]) &&
|
|
135
|
+
validCorrelation(message["correlation"]) &&
|
|
136
|
+
validateScratchRunRootIntent(message["intent"]).token ===
|
|
137
|
+
message["correlation"]);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Validate one birth-bound TARGET_INTENT message.
|
|
141
|
+
* @param message - Candidate message
|
|
142
|
+
* @returns Whether the target intent is exact
|
|
143
|
+
*/
|
|
144
|
+
function validTargetIntentMessage(message) {
|
|
145
|
+
return (exactMessageKeys(message, ["correlation", "target"]) &&
|
|
146
|
+
validCorrelation(message["correlation"]) &&
|
|
147
|
+
validTargetIntent(message["target"]));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Validate one terminal payload result.
|
|
151
|
+
* @param message - Candidate message
|
|
152
|
+
* @returns Whether the result is exact
|
|
153
|
+
*/
|
|
154
|
+
function validPayloadExitMessage(message) {
|
|
155
|
+
return (exactMessageKeys(message, ["code", "signal"]) &&
|
|
156
|
+
(message["code"] === null || Number.isInteger(message["code"])) &&
|
|
157
|
+
(message["signal"] === null ||
|
|
158
|
+
(typeof message["signal"] === "string" &&
|
|
159
|
+
/^SIG[A-Z0-9]+$/u.test(message["signal"]))));
|
|
160
|
+
}
|
|
161
|
+
/** Message-specific validators outside the empty/correlation families. */
|
|
162
|
+
const BODY_VALIDATORS = {
|
|
163
|
+
BOOTSTRAP_READY: message => exactMessageKeys(message, ["pid"]) &&
|
|
164
|
+
Number.isSafeInteger(message["pid"]) &&
|
|
165
|
+
message["pid"] > 0,
|
|
166
|
+
ROOT_INTENT: validRootIntentMessage,
|
|
167
|
+
TARGET_INTENT: validTargetIntentMessage,
|
|
168
|
+
ROOT_ARMED: message => exactMessageKeys(message, ["correlation", "root"]) &&
|
|
169
|
+
validCorrelation(message["correlation"]) &&
|
|
170
|
+
validRootIdentity(message["root"]),
|
|
171
|
+
COMMAND: message => exactMessageKeys(message, ["command"]) &&
|
|
172
|
+
validBootstrapCommand(message["command"]),
|
|
173
|
+
SIGNAL: message => exactMessageKeys(message, ["signal"]) &&
|
|
174
|
+
typeof message["signal"] === "string" &&
|
|
175
|
+
PROTOCOL_SIGNALS.has(message["signal"]),
|
|
176
|
+
PAYLOAD_ERROR: message => exactMessageKeys(message, ["message"]) &&
|
|
177
|
+
typeof message["message"] === "string" &&
|
|
178
|
+
message["message"] !== "" &&
|
|
179
|
+
Buffer.byteLength(message["message"], "utf8") <= 4_096,
|
|
180
|
+
PAYLOAD_EXIT: validPayloadExitMessage,
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* Whether one exact message-specific body matches its declared type.
|
|
184
|
+
* @param message - Candidate message
|
|
185
|
+
* @param type - Declared protocol type
|
|
186
|
+
* @returns Whether the message-specific shape is exact
|
|
187
|
+
*/
|
|
188
|
+
function validMessageBody(message, type) {
|
|
189
|
+
if (EMPTY_TYPES.has(type))
|
|
190
|
+
return exactMessageKeys(message, []);
|
|
191
|
+
if (CORRELATED_TYPES.has(type)) {
|
|
192
|
+
return (exactMessageKeys(message, ["correlation"]) &&
|
|
193
|
+
validCorrelation(message["correlation"]));
|
|
194
|
+
}
|
|
195
|
+
return BODY_VALIDATORS[type]?.(message) ?? false;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Validate a bounded version-one IPC message against the closed vocabulary.
|
|
199
|
+
* @param value - Candidate message
|
|
200
|
+
* @returns Validated message envelope
|
|
201
|
+
*/
|
|
202
|
+
export function parseScratchProtocolMessage(value) {
|
|
203
|
+
const serialized = (() => {
|
|
204
|
+
try {
|
|
205
|
+
return JSON.stringify(value);
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
throw new Error("Scratch protocol message must be serializable");
|
|
209
|
+
}
|
|
210
|
+
})();
|
|
211
|
+
if (serialized === undefined ||
|
|
212
|
+
Buffer.byteLength(serialized, "utf8") > MAX_PROTOCOL_BYTES) {
|
|
213
|
+
throw new Error("Scratch protocol message exceeds its byte bound");
|
|
214
|
+
}
|
|
215
|
+
if (typeof value !== "object" || value === null) {
|
|
216
|
+
throw new Error("Scratch protocol message must be an object");
|
|
217
|
+
}
|
|
218
|
+
const message = value;
|
|
219
|
+
const type = message["type"];
|
|
220
|
+
if (message["schema"] !== 1 ||
|
|
221
|
+
typeof type !== "string" ||
|
|
222
|
+
!PROTOCOL_TYPES.has(type)) {
|
|
223
|
+
throw new Error("Invalid scratch protocol message schema");
|
|
224
|
+
}
|
|
225
|
+
if (!validMessageBody(message, type)) {
|
|
226
|
+
throw new Error(`Invalid ${type} scratch protocol message`);
|
|
227
|
+
}
|
|
228
|
+
return value;
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=scratch-supervision-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-supervision-protocol.js","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-supervision-protocol.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAE/E,sEAAsE;AACtE,MAAM,kBAAkB,GAAG,GAAG,GAAG,KAAK,CAAC;AAEvC,oEAAoE;AACpE,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC;IAC/C,cAAc;IACd,eAAe;IACf,IAAI;IACJ,MAAM;IACN,SAAS;IACT,UAAU;CACX,CAAC,CAAC;AAEH,uEAAuE;AACvE,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC;IACpD,mBAAmB;IACnB,cAAc;IACd,kBAAkB;CACnB,CAAC,CAAC;AAEH,0CAA0C;AAC1C,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC;IAClD,GAAG,WAAW;IACd,GAAG,gBAAgB;IACnB,aAAa;IACb,YAAY;IACZ,iBAAiB;IACjB,SAAS;IACT,eAAe;IACf,QAAQ;IACR,cAAc;IACd,eAAe;CAChB,CAAC,CAAC;AAEH,6DAA6D;AAC7D,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC;IACpD,QAAQ;IACR,SAAS;IACT,QAAQ;CACT,CAAC,CAAC;AAQH;;;;;GAKG;AACH,SAAS,YAAY,CACnB,KAAwC,EACxC,IAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACrD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAC1B,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5E,OAAO,CACL,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QACjC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC,CACtD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,OAAO,GAAG,KAAgC,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,CACL,YAAY,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,IAAI,KAAK;QACpB,IAAI,CAAC,KAAK,CACR,QAAQ,CAAC,EAAE,CACT,OAAO,QAAQ,KAAK,QAAQ;YAC5B,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,KAAK,CACpD;QACD,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,IAAI,KAAK;QACvC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAC9B,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CACf,GAAG,KAAK,EAAE;YACV,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,KAAK;YACvC,OAAO,KAAK,KAAK,QAAQ;YACzB,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,KAAK,CACjD,CACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,OAAO,CACL,YAAY,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,yBAAyB,CAAC,CAAC;QAChE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAY,GAAG,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC;QAChC,OAAO,MAAM,CAAC,yBAAyB,CAAC,KAAK,QAAQ;QACrD,MAAM,CAAC,yBAAyB,CAAC,KAAK,EAAE;QACxC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,CACpE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,IAAI,GAAG,KAAgC,CAAC;IAC9C,OAAO,CACL,YAAY,CAAC,IAAI,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,QAAQ;QACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACtC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,IAAI,KAAK;QACzD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAClC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CACvB,OAA0C,EAC1C,IAAuB;IAEvB,OAAO,YAAY,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB,CAC7B,OAA0C;IAE1C,OAAO,CACL,gBAAgB,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QACpD,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACxC,4BAA4B,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;YACnD,OAAO,CAAC,aAAa,CAAC,CACzB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,wBAAwB,CAC/B,OAA0C;IAE1C,OAAO,CACL,gBAAgB,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QACpD,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACxC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CACrC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAC9B,OAA0C;IAE1C,OAAO,CACL,gBAAgB,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/D,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI;YACzB,CAAC,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,QAAQ;gBACpC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAChD,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,eAAe,GAEjB;IACF,eAAe,EAAE,OAAO,CAAC,EAAE,CACzB,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,CAAC,KAAK,CAAY,GAAG,CAAC;IAChC,WAAW,EAAE,sBAAsB;IACnC,aAAa,EAAE,wBAAwB;IACvC,UAAU,EAAE,OAAO,CAAC,EAAE,CACpB,gBAAgB,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAClD,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACxC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC,EAAE,CACjB,gBAAgB,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACtC,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,EAAE,OAAO,CAAC,EAAE,CAChB,gBAAgB,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;QACrC,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,QAAQ;QACrC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,aAAa,EAAE,OAAO,CAAC,EAAE,CACvB,gBAAgB,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACtC,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ;QACtC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE;QACzB,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,IAAI,KAAK;IACxD,YAAY,EAAE,uBAAuB;CACtC,CAAC;AAEF;;;;;GAKG;AACH,SAAS,gBAAgB,CACvB,OAA0C,EAC1C,IAAY;IAEZ,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAChE,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,CACL,gBAAgB,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,CAAC;YAC1C,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CACzC,CAAC;IACJ,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAc;IAEd,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE;QACvB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,IACE,UAAU,KAAK,SAAS;QACxB,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,kBAAkB,EAC1D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,OAAO,GAAG,KAAgC,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,IACE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,IAAI,KAAK,QAAQ;QACxB,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EACzB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,2BAA2B,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,KAAiC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { removeAuthorizedScratchChild } from "./scratch-authority.js";
|
|
2
|
+
import { writeScratchOwnerRecord, type ScratchOwnerRecordV1, type ScratchPathIdentity } from "./scratch-owner.js";
|
|
3
|
+
import { type ScratchRunRootIntentV1 } from "./scratch.js";
|
|
4
|
+
/** Private environment variable inherited only by a supervised test payload. */
|
|
5
|
+
export declare const SCRATCH_SUPERVISION_LEASE_ENV = "LISA_TEST_RUN_LEASE";
|
|
6
|
+
/** Version-one lease: basenames and identities, never a free-form root path. */
|
|
7
|
+
export interface ScratchSupervisionLeaseV1 {
|
|
8
|
+
readonly schema: 1;
|
|
9
|
+
readonly token: string;
|
|
10
|
+
readonly suiteRootBasename: string;
|
|
11
|
+
readonly baseCanonicalPath: string;
|
|
12
|
+
readonly namespace: ScratchPathIdentity;
|
|
13
|
+
readonly suiteRoot: ScratchPathIdentity;
|
|
14
|
+
readonly suiteLabel: string;
|
|
15
|
+
readonly registeredPrefixes: readonly string[];
|
|
16
|
+
}
|
|
17
|
+
/** Durable handle for one worker scope nested inside the supervised suite root. */
|
|
18
|
+
export interface SupervisedWorkerScope {
|
|
19
|
+
readonly path: string;
|
|
20
|
+
readonly basename: string;
|
|
21
|
+
readonly parent: ScratchPathIdentity;
|
|
22
|
+
readonly suiteToken: string;
|
|
23
|
+
readonly owner: ScratchOwnerRecordV1;
|
|
24
|
+
}
|
|
25
|
+
/** Deterministic seams for worker-scope allocation failure controls. */
|
|
26
|
+
export interface SupervisedWorkerScopeOptions {
|
|
27
|
+
readonly removeAuthorizedChild?: typeof removeAuthorizedScratchChild;
|
|
28
|
+
readonly writeOwnerRecord?: typeof writeScratchOwnerRecord;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Construct a bounded lease only after the suite root has been independently opened.
|
|
32
|
+
* @param intent - Armed suite-root intent
|
|
33
|
+
* @param configuration - Suite attribution captured before collection
|
|
34
|
+
* @param configuration.suiteLabel - Opaque suite label
|
|
35
|
+
* @param configuration.registeredPrefixes - Pre-collection prefix registry
|
|
36
|
+
* @returns Immutable lease
|
|
37
|
+
*/
|
|
38
|
+
export declare function createScratchSupervisionLease(intent: ScratchRunRootIntentV1, configuration: {
|
|
39
|
+
readonly suiteLabel: string;
|
|
40
|
+
readonly registeredPrefixes: readonly string[];
|
|
41
|
+
}): ScratchSupervisionLeaseV1;
|
|
42
|
+
/**
|
|
43
|
+
* Parse and validate the private bounded lease contract.
|
|
44
|
+
* @param raw - Serialized lease
|
|
45
|
+
* @returns Validated version-one lease
|
|
46
|
+
*/
|
|
47
|
+
export declare function parseScratchSupervisionLease(raw: string): ScratchSupervisionLeaseV1;
|
|
48
|
+
/**
|
|
49
|
+
* Allocate one random worker scope under a token-validated suite root.
|
|
50
|
+
* @param lease - Validated suite lease
|
|
51
|
+
* @param options - Optional deterministic persistence seam
|
|
52
|
+
* @returns Durable worker-scope handle
|
|
53
|
+
*/
|
|
54
|
+
export declare function createSupervisedWorkerScope(lease: ScratchSupervisionLeaseV1, options?: SupervisedWorkerScopeOptions): SupervisedWorkerScope;
|
|
55
|
+
/**
|
|
56
|
+
* Remove one worker scope while revalidating its parent lease around deletion.
|
|
57
|
+
* @param scope - Durable worker handle
|
|
58
|
+
* @param lease - Optional parent lease for pre/post validation
|
|
59
|
+
*/
|
|
60
|
+
export declare function removeSupervisedWorkerScope(scope: SupervisedWorkerScope, lease?: ScratchSupervisionLeaseV1): void;
|
|
61
|
+
export { parseScratchProtocolMessage } from "./scratch-supervision-protocol.js";
|
|
62
|
+
export { validateScratchRunRootIntent } from "./scratch-supervision-intent.js";
|
|
63
|
+
export type { ScratchProtocolMessageV1 } from "./scratch-supervision-protocol.js";
|
|
64
|
+
//# sourceMappingURL=scratch-supervision.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-supervision.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-supervision.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAIL,uBAAuB,EACvB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,cAAc,CAAC;AAEtB,gFAAgF;AAChF,eAAO,MAAM,6BAA6B,wBAAwB,CAAC;AAKnE,gFAAgF;AAChF,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD;AAED,mFAAmF;AACnF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;CACtC;AAED,wEAAwE;AACxE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,4BAA4B,CAAC;IACrE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,uBAAuB,CAAC;CAC5D;AAiDD;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,sBAAsB,EAC9B,aAAa,EAAE;IACb,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD,GACA,yBAAyB,CAa3B;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,MAAM,GACV,yBAAyB,CAkC3B;AAkCD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,yBAAyB,EAChC,OAAO,GAAE,4BAAiC,GACzC,qBAAqB,CAmCvB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,qBAAqB,EAC5B,KAAK,CAAC,EAAE,yBAAyB,GAChC,IAAI,CAmBN;AAED,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,YAAY,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC"}
|