@codyswann/lisa 4.28.4 → 4.29.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 +3 -1
- package/all/copy-overwrite/scripts/lisa-gates.mjs +2 -1
- package/all/copy-overwrite/scripts/lisa-hooks/sonar-secrets.sh +3 -2
- package/all/copy-overwrite/scripts/lisa-postinstall.mjs +6 -2
- package/cdk/create-only/vitest.config.local.ts +5 -1
- package/cdk/package-lisa/package.lisa.json +14 -7
- package/dist/cli/apply.d.ts +20 -0
- package/dist/cli/apply.d.ts.map +1 -1
- package/dist/cli/apply.js +70 -3
- package/dist/cli/apply.js.map +1 -1
- package/dist/cli/doctor-apply-freshness.d.ts.map +1 -1
- package/dist/cli/doctor-apply-freshness.js +10 -4
- package/dist/cli/doctor-apply-freshness.js.map +1 -1
- 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/cli/shared-options.d.ts +11 -4
- package/dist/cli/shared-options.d.ts.map +1 -1
- package/dist/cli/shared-options.js +8 -8
- package/dist/cli/shared-options.js.map +1 -1
- 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/apply-mode.d.ts +80 -29
- package/dist/core/apply-mode.d.ts.map +1 -1
- package/dist/core/apply-mode.js +23 -2
- package/dist/core/apply-mode.js.map +1 -1
- package/dist/core/apply-receipt.d.ts +5 -1
- package/dist/core/apply-receipt.d.ts.map +1 -1
- package/dist/core/apply-receipt.js.map +1 -1
- package/dist/core/config.d.ts +24 -12
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +8 -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 +63 -15
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/migrations/ensure-lisa-postinstall.d.ts +1 -1
- package/dist/migrations/ensure-lisa-postinstall.d.ts.map +1 -1
- package/dist/migrations/ensure-lisa-postinstall.js +28 -5
- package/dist/migrations/ensure-lisa-postinstall.js.map +1 -1
- package/dist/utils/postinstall-trampoline-source.js +10 -1
- package/dist/utils/postinstall-trampoline-source.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/scripts/install-claude-plugins.sh +7 -2
- package/typescript/create-only/vitest.config.local.ts +5 -1
- package/typescript/package-lisa/package.lisa.json +14 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scratch-global-setup.js","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-global-setup.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scratch-global-setup.js","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-global-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-leak-setup.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-leak-setup.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-suite backstop that makes a leaked fixture fail the suite that leaked it.
|
|
3
|
+
*
|
|
4
|
+
* The worker-wide run root is still removed wholesale on exit and reclaimed by
|
|
5
|
+
* a successor after SIGKILL. This hook is the attribution layer: it snapshots
|
|
6
|
+
* the run-root children before collection, runs last after every user
|
|
7
|
+
* `afterAll`, removes anything added by the suite, and fails on additions whose
|
|
8
|
+
* prefix was not registered before collection.
|
|
9
|
+
* @module configs/vitest/scratch-leak-setup
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from "node:fs";
|
|
12
|
+
import { tmpdir } from "node:os";
|
|
13
|
+
import * as path from "node:path";
|
|
14
|
+
import { afterAll } from "vitest";
|
|
15
|
+
import { readBoundedScratchNames, removeAuthorizedScratchChildren, } from "./scratch-authority.js";
|
|
16
|
+
import { SCRATCH_OWNER_FILE, readScratchOwnerRecord } from "./scratch-owner.js";
|
|
17
|
+
/** Run root whose children this suite owns. */
|
|
18
|
+
const runRoot = tmpdir();
|
|
19
|
+
/** Fail immediately if the setup order did not install scratch first. */
|
|
20
|
+
if (!path.basename(runRoot).startsWith("worker-")) {
|
|
21
|
+
throw new Error(`Scratch leak guard started before scratch redirection: ${runRoot}`);
|
|
22
|
+
}
|
|
23
|
+
/** Owner record binds the prefix registry and path identity to this root. */
|
|
24
|
+
const owner = readScratchOwnerRecord(runRoot);
|
|
25
|
+
/** Direct children present before this suite imports any test module. */
|
|
26
|
+
const baseline = new Set([
|
|
27
|
+
...readBoundedScratchNames(runRoot),
|
|
28
|
+
SCRATCH_OWNER_FILE,
|
|
29
|
+
]);
|
|
30
|
+
/**
|
|
31
|
+
* Render the prefix a mkdtemp-shaped basename came from.
|
|
32
|
+
* @param name - Direct scratch child basename
|
|
33
|
+
* @returns Display prefix
|
|
34
|
+
*/
|
|
35
|
+
function displayedPrefix(name) {
|
|
36
|
+
return /^[\s\S]*[A-Za-z0-9]{6}$/u.test(name) ? `${name.slice(0, -6)}*` : name;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Remove every classified addition through one inode-bound cleanup process.
|
|
40
|
+
* @param names - Direct scratch child basenames
|
|
41
|
+
*/
|
|
42
|
+
function removeInternalChildren(names) {
|
|
43
|
+
for (const name of names) {
|
|
44
|
+
if (path.basename(name) !== name || name === "." || name === "..") {
|
|
45
|
+
throw new Error(`Scratch leak guard refused non-basename child: ${name}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const before = fs.lstatSync(runRoot);
|
|
49
|
+
if (before.dev !== owner.root.dev ||
|
|
50
|
+
before.ino !== owner.root.ino ||
|
|
51
|
+
fs.realpathSync(runRoot) !== owner.root.canonicalPath) {
|
|
52
|
+
throw new Error("Scratch run-root identity changed before leak cleanup");
|
|
53
|
+
}
|
|
54
|
+
const marker = readScratchOwnerRecord(runRoot);
|
|
55
|
+
if (marker.token !== owner.token) {
|
|
56
|
+
throw new Error("Scratch owner marker changed before leak cleanup");
|
|
57
|
+
}
|
|
58
|
+
removeAuthorizedScratchChildren({
|
|
59
|
+
parent: owner.root,
|
|
60
|
+
basenames: names,
|
|
61
|
+
});
|
|
62
|
+
if (readScratchOwnerRecord(runRoot).token !== owner.token) {
|
|
63
|
+
throw new Error("Scratch owner marker changed during leak cleanup");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Read the run root or throw a suite-attributed diagnostic.
|
|
68
|
+
* @returns Current direct-child basenames
|
|
69
|
+
*/
|
|
70
|
+
function readRunRootNames() {
|
|
71
|
+
try {
|
|
72
|
+
return readBoundedScratchNames(runRoot);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
throw new Error(`Scratch leak guard could not read suite root ${runRoot}: ${String(error)}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Whether one addition belongs to a prefix registered before collection.
|
|
80
|
+
* @param name - Added direct-child basename
|
|
81
|
+
* @returns Whether the stack registered ownership
|
|
82
|
+
*/
|
|
83
|
+
function isRegisteredAddition(name) {
|
|
84
|
+
return owner.registeredPrefixes.some(prefix => name.startsWith(prefix));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Audit direct additions after user hooks, clean every one, and fail on any
|
|
88
|
+
* prefix the stack did not register before collection.
|
|
89
|
+
*/
|
|
90
|
+
afterAll(() => {
|
|
91
|
+
const names = readRunRootNames();
|
|
92
|
+
const additions = names.filter(name => !baseline.has(name));
|
|
93
|
+
const unregistered = additions.filter(name => !isRegisteredAddition(name));
|
|
94
|
+
try {
|
|
95
|
+
removeInternalChildren(additions);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
throw new Error(`Scratch leak guard could not clean ${additions.join(", ")} for suite ${owner.suiteLabel}: ${String(error)}`);
|
|
99
|
+
}
|
|
100
|
+
if (unregistered.length > 0) {
|
|
101
|
+
const details = [...unregistered]
|
|
102
|
+
.sort((left, right) => left.localeCompare(right))
|
|
103
|
+
.map(name => `${name} (${displayedPrefix(name)})`)
|
|
104
|
+
.join(", ");
|
|
105
|
+
throw new Error(`Suite ${owner.suiteLabel} leaked ${String(unregistered.length)} unregistered scratch fixture(s): ${details}`);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=scratch-leak-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-leak-setup.js","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-leak-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EACL,uBAAuB,EACvB,+BAA+B,GAChC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEhF,+CAA+C;AAC/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;AAEzB,yEAAyE;AACzE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;IAClD,MAAM,IAAI,KAAK,CACb,0DAA0D,OAAO,EAAE,CACpE,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,KAAK,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAE9C,yEAAyE;AACzE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACvB,GAAG,uBAAuB,CAAC,OAAO,CAAC;IACnC,kBAAkB;CACnB,CAAC,CAAC;AAEH;;;;GAIG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAChF,CAAC;AAED;;;GAGG;AACH,SAAS,sBAAsB,CAAC,KAAwB;IACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,IACE,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG;QAC7B,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG;QAC7B,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,aAAa,EACrD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,+BAA+B,CAAC;QAC9B,MAAM,EAAE,KAAK,CAAC,IAAI;QAClB,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;IACH,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB;IACvB,IAAI,CAAC;QACH,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,gDAAgD,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5E,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,IAAY;IACxC,OAAO,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;;GAGG;AACH,QAAQ,CAAC,GAAG,EAAE;IACZ,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC;QACH,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,sCAAsC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,UAAU,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAC7G,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,CAAC,GAAG,YAAY,CAAC;aAC9B,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;aAChD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;aACjD,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CACb,SAAS,KAAK,CAAC,UAAU,WAAW,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,qCAAqC,OAAO,EAAE,CAC9G,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { parseScratchRunRootName, scratchRunRootName, type ScratchPathIdentity } from "./scratch-owner.js";
|
|
2
|
+
/** Public compatibility name for the exact managed namespace. */
|
|
3
|
+
export declare const SCRATCH_NAMESPACE = "lisa-scratch";
|
|
4
|
+
/** Prefix identifying a per-process run root inside the namespace. */
|
|
5
|
+
export declare const RUN_ROOT_PREFIX = "run-";
|
|
6
|
+
/** Legacy default retained for callers; age alone never authorizes deletion. */
|
|
7
|
+
export declare const DEFAULT_RECLAIM_AGE_MS: number;
|
|
8
|
+
/** Absolute cap shared by startup inspection and destructive sweeps. */
|
|
9
|
+
export declare const MAX_SCRATCH_NAMESPACE_SCAN_ENTRIES = 120000;
|
|
10
|
+
/** Maximum UTF-8 bytes accepted in one direct namespace basename. */
|
|
11
|
+
export declare const MAX_SCRATCH_NAMESPACE_NAME_BYTES = 1024;
|
|
12
|
+
/** Maximum direct entries one already-authorized suite audit may retain. */
|
|
13
|
+
export declare const SCRATCH_DIRECT_ENTRY_LIMIT = 100000;
|
|
14
|
+
/** Maximum UTF-8 bytes in one authorized direct-child basename. */
|
|
15
|
+
export declare const SCRATCH_DIRECT_NAME_BYTES = 1024;
|
|
16
|
+
/** Recognisable quarantine prefix, with a random suffix per removal. */
|
|
17
|
+
export declare const SCRATCH_QUARANTINE_PREFIX = ".lisa-quarantine-";
|
|
18
|
+
/** Namespace identity plus local ownership facts. */
|
|
19
|
+
export interface ScratchNamespaceIdentity extends ScratchPathIdentity {
|
|
20
|
+
readonly uid: number | undefined;
|
|
21
|
+
}
|
|
22
|
+
/** Authority required before any destructive scratch operation. */
|
|
23
|
+
export interface ScratchNamespaceAuthority {
|
|
24
|
+
readonly baseCanonicalPath: string;
|
|
25
|
+
readonly namespace: ScratchNamespaceIdentity;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolve the only public platform-temp authority.
|
|
29
|
+
* @returns Logical platform temp root
|
|
30
|
+
*/
|
|
31
|
+
export declare const scratchBaseDir: () => string;
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the shared namespace directory.
|
|
34
|
+
* @returns Managed namespace path
|
|
35
|
+
*/
|
|
36
|
+
export declare const scratchNamespaceDir: () => string;
|
|
37
|
+
/** Build one unique direct run-root basename. */
|
|
38
|
+
export declare const runRootName: typeof scratchRunRootName;
|
|
39
|
+
/** Parse one recognized direct run-root basename. */
|
|
40
|
+
export declare const parseRunRootName: typeof parseScratchRunRootName;
|
|
41
|
+
/**
|
|
42
|
+
* Consume injected direct namespace basenames under the 120k hard bound.
|
|
43
|
+
* @param names - Direct namespace basenames
|
|
44
|
+
* @returns Deterministically sorted names
|
|
45
|
+
*/
|
|
46
|
+
export declare function collectBoundedScratchNamespaceNames(names: Iterable<string>): readonly string[];
|
|
47
|
+
/**
|
|
48
|
+
* Stream one real namespace without following direct children.
|
|
49
|
+
* @param dir - Namespace path
|
|
50
|
+
* @returns Validated direct basenames
|
|
51
|
+
*/
|
|
52
|
+
export declare function readBoundedScratchNamespace(dir: string): readonly string[];
|
|
53
|
+
/**
|
|
54
|
+
* Validate one direct-name stream under the distinct 100k suite bound.
|
|
55
|
+
* @param names - Direct basename stream
|
|
56
|
+
* @returns Validated names in source order
|
|
57
|
+
*/
|
|
58
|
+
export declare function collectBoundedScratchNames(names: Iterable<string>): readonly string[];
|
|
59
|
+
/**
|
|
60
|
+
* Stream one already-authorized directory under the 100k suite bound.
|
|
61
|
+
* @param directory - Authorized suite directory
|
|
62
|
+
* @returns Validated direct basenames
|
|
63
|
+
*/
|
|
64
|
+
export declare function readBoundedScratchNames(directory: string): readonly string[];
|
|
65
|
+
/**
|
|
66
|
+
* Establish and pin the canonical scratch namespace.
|
|
67
|
+
* @returns Filesystem authority for its exact direct `lisa-scratch` child
|
|
68
|
+
*/
|
|
69
|
+
export declare function createScratchNamespaceAuthority(): ScratchNamespaceAuthority;
|
|
70
|
+
/**
|
|
71
|
+
* Revalidate that the namespace is still the directory authority pinned.
|
|
72
|
+
* @param authority - Captured namespace authority
|
|
73
|
+
*/
|
|
74
|
+
export declare function assertScratchNamespaceAuthority(authority: ScratchNamespaceAuthority): void;
|
|
75
|
+
/**
|
|
76
|
+
* Resolve authority for an existing exact namespace without creating it.
|
|
77
|
+
* @returns Captured authority, or undefined when absent
|
|
78
|
+
*/
|
|
79
|
+
export declare function authorityForExistingScratchNamespace(): ScratchNamespaceAuthority | undefined;
|
|
80
|
+
//# sourceMappingURL=scratch-namespace-authority.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-namespace-authority.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-namespace-authority.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,uBAAuB,EACvB,kBAAkB,EAElB,KAAK,mBAAmB,EACzB,MAAM,oBAAoB,CAAC;AAK5B,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,iBAA+B,CAAC;AAE9D,sEAAsE;AACtE,eAAO,MAAM,eAAe,SAA0B,CAAC;AAEvD,gFAAgF;AAChF,eAAO,MAAM,sBAAsB,QAAqB,CAAC;AAEzD,wEAAwE;AACxE,eAAO,MAAM,kCAAkC,SAAU,CAAC;AAE1D,qEAAqE;AACrE,eAAO,MAAM,gCAAgC,OAAQ,CAAC;AAEtD,4EAA4E;AAC5E,eAAO,MAAM,0BAA0B,SAAU,CAAC;AAElD,mEAAmE;AACnE,eAAO,MAAM,yBAAyB,OAAQ,CAAC;AAE/C,wEAAwE;AACxE,eAAO,MAAM,yBAAyB,sBAAsB,CAAC;AAE7D,qDAAqD;AACrD,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,mEAAmE;AACnE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;CAC9C;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAO,MAAqB,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,QAAO,MACS,CAAC;AAEjD,iDAAiD;AACjD,eAAO,MAAM,WAAW,2BAAqB,CAAC;AAE9C,qDAAqD;AACrD,eAAO,MAAM,gBAAgB,gCAA0B,CAAC;AAWxD;;;;GAIG;AACH,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GACtB,SAAS,MAAM,EAAE,CA0BnB;AAoBD;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAgB1E;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GACtB,SAAS,MAAM,EAAE,CAiBnB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAe5E;AAiFD;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,yBAAyB,CAiB3E;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,yBAAyB,GACnC,IAAI,CAqBN;AAED;;;GAGG;AACH,wBAAgB,oCAAoC,IAChD,yBAAyB,GACzB,SAAS,CAuBZ"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/** Canonical platform-temp namespace capture and immutable identity authority. */
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { SCRATCH_RUN_ROOT_PREFIX, parseScratchRunRootName, scratchRunRootName, scratchPathIdentity, } from "./scratch-owner.js";
|
|
6
|
+
/** Exact shared namespace basename used by the authority implementation. */
|
|
7
|
+
const AUTHORIZED_SCRATCH_NAMESPACE = "lisa-scratch";
|
|
8
|
+
/** Public compatibility name for the exact managed namespace. */
|
|
9
|
+
export const SCRATCH_NAMESPACE = AUTHORIZED_SCRATCH_NAMESPACE;
|
|
10
|
+
/** Prefix identifying a per-process run root inside the namespace. */
|
|
11
|
+
export const RUN_ROOT_PREFIX = SCRATCH_RUN_ROOT_PREFIX;
|
|
12
|
+
/** Legacy default retained for callers; age alone never authorizes deletion. */
|
|
13
|
+
export const DEFAULT_RECLAIM_AGE_MS = 6 * 60 * 60 * 1000;
|
|
14
|
+
/** Absolute cap shared by startup inspection and destructive sweeps. */
|
|
15
|
+
export const MAX_SCRATCH_NAMESPACE_SCAN_ENTRIES = 120_000;
|
|
16
|
+
/** Maximum UTF-8 bytes accepted in one direct namespace basename. */
|
|
17
|
+
export const MAX_SCRATCH_NAMESPACE_NAME_BYTES = 1_024;
|
|
18
|
+
/** Maximum direct entries one already-authorized suite audit may retain. */
|
|
19
|
+
export const SCRATCH_DIRECT_ENTRY_LIMIT = 100_000;
|
|
20
|
+
/** Maximum UTF-8 bytes in one authorized direct-child basename. */
|
|
21
|
+
export const SCRATCH_DIRECT_NAME_BYTES = 1_024;
|
|
22
|
+
/** Recognisable quarantine prefix, with a random suffix per removal. */
|
|
23
|
+
export const SCRATCH_QUARANTINE_PREFIX = ".lisa-quarantine-";
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the only public platform-temp authority.
|
|
26
|
+
* @returns Logical platform temp root
|
|
27
|
+
*/
|
|
28
|
+
export const scratchBaseDir = () => os.tmpdir();
|
|
29
|
+
/**
|
|
30
|
+
* Resolve the shared namespace directory.
|
|
31
|
+
* @returns Managed namespace path
|
|
32
|
+
*/
|
|
33
|
+
export const scratchNamespaceDir = () => path.join(scratchBaseDir(), SCRATCH_NAMESPACE);
|
|
34
|
+
/** Build one unique direct run-root basename. */
|
|
35
|
+
export const runRootName = scratchRunRootName;
|
|
36
|
+
/** Parse one recognized direct run-root basename. */
|
|
37
|
+
export const parseRunRootName = parseScratchRunRootName;
|
|
38
|
+
/**
|
|
39
|
+
* Stable code-point ordering independent of host locale.
|
|
40
|
+
* @param left - Left basename
|
|
41
|
+
* @param right - Right basename
|
|
42
|
+
* @returns Sort comparator result
|
|
43
|
+
*/
|
|
44
|
+
const codePointCompare = (left, right) => left === right ? 0 : left < right ? -1 : 1;
|
|
45
|
+
/**
|
|
46
|
+
* Consume injected direct namespace basenames under the 120k hard bound.
|
|
47
|
+
* @param names - Direct namespace basenames
|
|
48
|
+
* @returns Deterministically sorted names
|
|
49
|
+
*/
|
|
50
|
+
export function collectBoundedScratchNamespaceNames(names) {
|
|
51
|
+
const collected = [];
|
|
52
|
+
for (const name of names) {
|
|
53
|
+
if (name === "" ||
|
|
54
|
+
name === "." ||
|
|
55
|
+
name === ".." ||
|
|
56
|
+
name.includes("/") ||
|
|
57
|
+
name.includes("\\")) {
|
|
58
|
+
throw new Error(`Scratch namespace scan refused non-basename: ${name}`);
|
|
59
|
+
}
|
|
60
|
+
if (Buffer.byteLength(name, "utf8") > MAX_SCRATCH_NAMESPACE_NAME_BYTES) {
|
|
61
|
+
throw new Error(`Scratch namespace name exceeds ${String(MAX_SCRATCH_NAMESPACE_NAME_BYTES)} bytes`);
|
|
62
|
+
}
|
|
63
|
+
if (collected.length >= MAX_SCRATCH_NAMESPACE_SCAN_ENTRIES) {
|
|
64
|
+
throw new Error(`Scratch namespace scan exceeds ${String(MAX_SCRATCH_NAMESPACE_SCAN_ENTRIES)} entries`);
|
|
65
|
+
}
|
|
66
|
+
// eslint-disable-next-line functional/immutable-data -- bounded streaming avoids attacker-sized materialization
|
|
67
|
+
collected.push(name);
|
|
68
|
+
}
|
|
69
|
+
return [...collected].sort(codePointCompare);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Open one real namespace directory while preserving absence.
|
|
73
|
+
* @param dir - Namespace path
|
|
74
|
+
* @returns Open handle, or undefined when absent
|
|
75
|
+
*/
|
|
76
|
+
function openScratchNamespace(dir) {
|
|
77
|
+
try {
|
|
78
|
+
const stat = fs.lstatSync(dir);
|
|
79
|
+
if (stat.isSymbolicLink() || !stat.isDirectory()) {
|
|
80
|
+
throw new Error(`Scratch namespace is not a real directory: ${dir}`);
|
|
81
|
+
}
|
|
82
|
+
return fs.opendirSync(dir);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (error.code === "ENOENT")
|
|
86
|
+
return undefined;
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Stream one real namespace without following direct children.
|
|
92
|
+
* @param dir - Namespace path
|
|
93
|
+
* @returns Validated direct basenames
|
|
94
|
+
*/
|
|
95
|
+
export function readBoundedScratchNamespace(dir) {
|
|
96
|
+
const directory = openScratchNamespace(dir);
|
|
97
|
+
if (directory === undefined)
|
|
98
|
+
return [];
|
|
99
|
+
try {
|
|
100
|
+
return collectBoundedScratchNamespaceNames((function* entries() {
|
|
101
|
+
for (;;) {
|
|
102
|
+
const entry = directory.readSync();
|
|
103
|
+
if (entry === null)
|
|
104
|
+
return;
|
|
105
|
+
yield entry.name;
|
|
106
|
+
}
|
|
107
|
+
})());
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
directory.closeSync();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Validate one direct-name stream under the distinct 100k suite bound.
|
|
115
|
+
* @param names - Direct basename stream
|
|
116
|
+
* @returns Validated names in source order
|
|
117
|
+
*/
|
|
118
|
+
export function collectBoundedScratchNames(names) {
|
|
119
|
+
const collected = [];
|
|
120
|
+
for (const name of names) {
|
|
121
|
+
if (Buffer.byteLength(name, "utf8") > SCRATCH_DIRECT_NAME_BYTES) {
|
|
122
|
+
throw new Error(`Scratch direct basename exceeds ${String(SCRATCH_DIRECT_NAME_BYTES)} bytes`);
|
|
123
|
+
}
|
|
124
|
+
// eslint-disable-next-line functional/immutable-data -- refuse before retaining the 100001st entry
|
|
125
|
+
collected.push(name);
|
|
126
|
+
if (collected.length > SCRATCH_DIRECT_ENTRY_LIMIT) {
|
|
127
|
+
throw new Error(`Scratch direct entry count exceeds ${String(SCRATCH_DIRECT_ENTRY_LIMIT)}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return collected;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Stream one already-authorized directory under the 100k suite bound.
|
|
134
|
+
* @param directory - Authorized suite directory
|
|
135
|
+
* @returns Validated direct basenames
|
|
136
|
+
*/
|
|
137
|
+
export function readBoundedScratchNames(directory) {
|
|
138
|
+
const handle = fs.opendirSync(directory);
|
|
139
|
+
try {
|
|
140
|
+
return collectBoundedScratchNames({
|
|
141
|
+
*[Symbol.iterator]() {
|
|
142
|
+
for (;;) {
|
|
143
|
+
const entry = handle.readSync();
|
|
144
|
+
if (entry === null)
|
|
145
|
+
return;
|
|
146
|
+
yield entry.name;
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
handle.closeSync();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Return the current uid where the platform supplies one.
|
|
157
|
+
* @returns Current uid or undefined on platforms without uid ownership
|
|
158
|
+
*/
|
|
159
|
+
const currentUid = () => process.getuid?.();
|
|
160
|
+
/**
|
|
161
|
+
* Ensure the namespace path exists as a real directory.
|
|
162
|
+
* @param namespacePath - Exact namespace path
|
|
163
|
+
*/
|
|
164
|
+
function assertRealDirectory(namespacePath) {
|
|
165
|
+
const existing = fs.lstatSync(namespacePath);
|
|
166
|
+
if (existing.isSymbolicLink()) {
|
|
167
|
+
throw new Error(`Scratch namespace must not be a symlink: ${namespacePath}`);
|
|
168
|
+
}
|
|
169
|
+
if (!existing.isDirectory()) {
|
|
170
|
+
throw new Error(`Scratch namespace is not a directory: ${namespacePath}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Create the namespace or accept a concurrent creator only after revalidation.
|
|
175
|
+
* @param namespacePath - Exact namespace path
|
|
176
|
+
*/
|
|
177
|
+
function ensureNamespaceDirectory(namespacePath) {
|
|
178
|
+
try {
|
|
179
|
+
assertRealDirectory(namespacePath);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
if (error.code !== "ENOENT")
|
|
183
|
+
throw error;
|
|
184
|
+
try {
|
|
185
|
+
fs.mkdirSync(namespacePath, { mode: 0o700 });
|
|
186
|
+
}
|
|
187
|
+
catch (mkdirError) {
|
|
188
|
+
if (mkdirError.code !== "EEXIST") {
|
|
189
|
+
throw mkdirError;
|
|
190
|
+
}
|
|
191
|
+
assertRealDirectory(namespacePath);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Assert local namespace ownership without silently broadening authority.
|
|
197
|
+
* @param namespacePath - Exact namespace path
|
|
198
|
+
*/
|
|
199
|
+
function enforceNamespaceOwnership(namespacePath) {
|
|
200
|
+
const stat = fs.lstatSync(namespacePath);
|
|
201
|
+
const uid = currentUid();
|
|
202
|
+
if (uid !== undefined && stat.uid !== uid) {
|
|
203
|
+
throw new Error(`Scratch namespace uid ${String(stat.uid)} does not match current uid ${String(uid)}`);
|
|
204
|
+
}
|
|
205
|
+
if ((stat.mode & 0o777) !== 0o700) {
|
|
206
|
+
throw new Error(`Scratch namespace mode must be 0700: ${namespacePath}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Capture the namespace identity after its creation and mode repair.
|
|
211
|
+
* @param namespacePath - Exact namespace path
|
|
212
|
+
* @param baseCanonicalPath - Pinned physical temp base
|
|
213
|
+
* @returns Captured authority
|
|
214
|
+
*/
|
|
215
|
+
function captureNamespaceAuthority(namespacePath, baseCanonicalPath) {
|
|
216
|
+
const uid = currentUid();
|
|
217
|
+
const identity = scratchPathIdentity(namespacePath);
|
|
218
|
+
if (path.dirname(identity.canonicalPath) !== baseCanonicalPath) {
|
|
219
|
+
throw new Error("Scratch namespace escaped its canonical temp base");
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
baseCanonicalPath,
|
|
223
|
+
namespace: { ...identity, uid },
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Establish and pin the canonical scratch namespace.
|
|
228
|
+
* @returns Filesystem authority for its exact direct `lisa-scratch` child
|
|
229
|
+
*/
|
|
230
|
+
export function createScratchNamespaceAuthority() {
|
|
231
|
+
const baseDir = os.tmpdir();
|
|
232
|
+
const baseStat = fs.lstatSync(baseDir);
|
|
233
|
+
if (baseStat.isSymbolicLink()) {
|
|
234
|
+
throw new Error(`Scratch temp base must not be a symlink: ${baseDir}`);
|
|
235
|
+
}
|
|
236
|
+
if (!baseStat.isDirectory()) {
|
|
237
|
+
throw new Error(`Scratch temp base is not a directory: ${baseDir}`);
|
|
238
|
+
}
|
|
239
|
+
const baseCanonicalPath = fs.realpathSync(baseDir);
|
|
240
|
+
const namespacePath = path.join(baseCanonicalPath, AUTHORIZED_SCRATCH_NAMESPACE);
|
|
241
|
+
ensureNamespaceDirectory(namespacePath);
|
|
242
|
+
enforceNamespaceOwnership(namespacePath);
|
|
243
|
+
return captureNamespaceAuthority(namespacePath, baseCanonicalPath);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Revalidate that the namespace is still the directory authority pinned.
|
|
247
|
+
* @param authority - Captured namespace authority
|
|
248
|
+
*/
|
|
249
|
+
export function assertScratchNamespaceAuthority(authority) {
|
|
250
|
+
const current = scratchPathIdentity(authority.namespace.canonicalPath);
|
|
251
|
+
if (current.dev !== authority.namespace.dev ||
|
|
252
|
+
current.ino !== authority.namespace.ino ||
|
|
253
|
+
current.canonicalPath !== authority.namespace.canonicalPath) {
|
|
254
|
+
throw new Error("Scratch namespace identity changed after authority capture");
|
|
255
|
+
}
|
|
256
|
+
const stat = fs.lstatSync(authority.namespace.canonicalPath);
|
|
257
|
+
if ((stat.mode & 0o777) !== 0o700) {
|
|
258
|
+
throw new Error("Scratch namespace mode changed after authority capture");
|
|
259
|
+
}
|
|
260
|
+
if (authority.namespace.uid !== undefined &&
|
|
261
|
+
stat.uid !== authority.namespace.uid) {
|
|
262
|
+
throw new Error("Scratch namespace uid changed after authority capture");
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Resolve authority for an existing exact namespace without creating it.
|
|
267
|
+
* @returns Captured authority, or undefined when absent
|
|
268
|
+
*/
|
|
269
|
+
export function authorityForExistingScratchNamespace() {
|
|
270
|
+
const dir = path.join(os.tmpdir(), AUTHORIZED_SCRATCH_NAMESPACE);
|
|
271
|
+
try {
|
|
272
|
+
const stat = fs.lstatSync(dir);
|
|
273
|
+
if (stat.isSymbolicLink() || !stat.isDirectory()) {
|
|
274
|
+
throw new Error(`Scratch namespace must be a real directory: ${dir}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
if (error.code === "ENOENT")
|
|
279
|
+
return undefined;
|
|
280
|
+
throw error;
|
|
281
|
+
}
|
|
282
|
+
if (path.basename(dir) !== AUTHORIZED_SCRATCH_NAMESPACE) {
|
|
283
|
+
throw new Error(`Scratch namespace must be the exact ${AUTHORIZED_SCRATCH_NAMESPACE} child`);
|
|
284
|
+
}
|
|
285
|
+
const authority = createScratchNamespaceAuthority();
|
|
286
|
+
if (fs.realpathSync(dir) !== authority.namespace.canonicalPath) {
|
|
287
|
+
throw new Error("Scratch namespace path does not match canonical authority");
|
|
288
|
+
}
|
|
289
|
+
return authority;
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=scratch-namespace-authority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-namespace-authority.js","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-namespace-authority.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,oBAAoB,CAAC;AAE5B,4EAA4E;AAC5E,MAAM,4BAA4B,GAAG,cAAc,CAAC;AAEpD,iEAAiE;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,4BAA4B,CAAC;AAE9D,sEAAsE;AACtE,MAAM,CAAC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEvD,gFAAgF;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEzD,wEAAwE;AACxE,MAAM,CAAC,MAAM,kCAAkC,GAAG,OAAO,CAAC;AAE1D,qEAAqE;AACrE,MAAM,CAAC,MAAM,gCAAgC,GAAG,KAAK,CAAC;AAEtD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAAC;AAElD,mEAAmE;AACnE,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAC;AAE/C,wEAAwE;AACxE,MAAM,CAAC,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;AAa7D;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAW,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;AAExD;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAW,EAAE,CAC9C,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAEjD,iDAAiD;AACjD,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAE9C,qDAAqD;AACrD,MAAM,CAAC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAExD;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,KAAa,EAAU,EAAE,CAC/D,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,mCAAmC,CACjD,KAAuB;IAEvB,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IACE,IAAI,KAAK,EAAE;YACX,IAAI,KAAK,GAAG;YACZ,IAAI,KAAK,IAAI;YACb,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EACnB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,gCAAgC,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CACb,kCAAkC,MAAM,CAAC,gCAAgC,CAAC,QAAQ,CACnF,CAAC;QACJ,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,IAAI,kCAAkC,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CACb,kCAAkC,MAAM,CAAC,kCAAkC,CAAC,UAAU,CACvF,CAAC;QACJ,CAAC;QACD,gHAAgH;QAChH,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,8CAA8C,GAAG,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,GAAW;IACrD,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACvC,IAAI,CAAC;QACH,OAAO,mCAAmC,CACxC,CAAC,QAAQ,CAAC,CAAC,OAAO;YAChB,SAAS,CAAC;gBACR,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACnC,IAAI,KAAK,KAAK,IAAI;oBAAE,OAAO;gBAC3B,MAAM,KAAK,CAAC,IAAI,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,EAAE,CACL,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,SAAS,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAuB;IAEvB,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,yBAAyB,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CACb,mCAAmC,MAAM,CAAC,yBAAyB,CAAC,QAAQ,CAC7E,CAAC;QACJ,CAAC;QACD,mGAAmG;QACnG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,SAAS,CAAC,MAAM,GAAG,0BAA0B,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CACb,sCAAsC,MAAM,CAAC,0BAA0B,CAAC,EAAE,CAC3E,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAiB;IACvD,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,0BAA0B,CAAC;YAChC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAChB,SAAS,CAAC;oBACR,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;oBAChC,IAAI,KAAK,KAAK,IAAI;wBAAE,OAAO;oBAC3B,MAAM,KAAK,CAAC,IAAI,CAAC;gBACnB,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AACD;;;GAGG;AACH,MAAM,UAAU,GAAG,GAAuB,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAEhE;;;GAGG;AACH,SAAS,mBAAmB,CAAC,aAAqB;IAChD,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC7C,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,4CAA4C,aAAa,EAAE,CAC5D,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,yCAAyC,aAAa,EAAE,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,wBAAwB,CAAC,aAAqB;IACrD,IAAI,CAAC;QACH,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;QACpE,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,IAAK,UAAoC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5D,MAAM,UAAU,CAAC;YACnB,CAAC;YACD,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,yBAAyB,CAAC,aAAqB;IACtD,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,yBAAyB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,GAAG,CAAC,EAAE,CACtF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,wCAAwC,aAAa,EAAE,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,yBAAyB,CAChC,aAAqB,EACrB,iBAAyB;IAEzB,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACpD,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,iBAAiB,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO;QACL,iBAAiB;QACjB,SAAS,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE;KAChC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,+BAA+B;IAC7C,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,4CAA4C,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,iBAAiB,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,iBAAiB,EACjB,4BAA4B,CAC7B,CAAC;IACF,wBAAwB,CAAC,aAAa,CAAC,CAAC;IACxC,yBAAyB,CAAC,aAAa,CAAC,CAAC;IACzC,OAAO,yBAAyB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,+BAA+B,CAC7C,SAAoC;IAEpC,MAAM,OAAO,GAAG,mBAAmB,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACvE,IACE,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,SAAS,CAAC,GAAG;QACvC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,SAAS,CAAC,GAAG;QACvC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,SAAS,CAAC,aAAa,EAC3D,CAAC;QACD,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,IACE,SAAS,CAAC,SAAS,CAAC,GAAG,KAAK,SAAS;QACrC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,SAAS,CAAC,GAAG,EACpC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oCAAoC;IAGlD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,4BAA4B,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,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,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,4BAA4B,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,uCAAuC,4BAA4B,QAAQ,CAC5E,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,+BAA+B,EAAE,CAAC;IACpD,IAAI,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|