@h-rig/task-sources-plugin 0.0.6-alpha.157 → 0.0.6-alpha.158
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/dist/src/control-plane/native/github-token-env.d.ts +3 -0
- package/dist/src/control-plane/native/github-token-env.js +26 -0
- package/dist/src/control-plane/native/native-git.d.ts +18 -0
- package/dist/src/control-plane/native/native-git.js +291 -0
- package/dist/src/control-plane/native/runtime-binary-build.d.ts +9 -0
- package/dist/src/control-plane/native/runtime-binary-build.js +107 -0
- package/dist/src/control-plane/native/task-ops.d.ts +52 -0
- package/dist/src/control-plane/native/task-ops.js +3192 -0
- package/dist/src/control-plane/native/task-state.d.ts +30 -0
- package/dist/src/control-plane/native/task-state.js +944 -0
- package/dist/src/control-plane/native/utils.d.ts +7 -0
- package/dist/src/control-plane/native/utils.js +110 -0
- package/dist/src/control-plane/native/validator-binaries.d.ts +3 -0
- package/dist/src/control-plane/native/validator-binaries.js +175 -0
- package/dist/src/control-plane/native/validator.d.ts +44 -0
- package/dist/src/control-plane/native/validator.js +979 -0
- package/dist/src/control-plane/state-sync/index.d.ts +4 -0
- package/dist/src/control-plane/state-sync/index.js +1205 -0
- package/dist/src/control-plane/state-sync/native-git.d.ts +1 -0
- package/dist/src/control-plane/state-sync/native-git.js +281 -0
- package/dist/src/control-plane/state-sync/read.d.ts +46 -0
- package/dist/src/control-plane/state-sync/read.js +564 -0
- package/dist/src/control-plane/state-sync/reconcile.d.ts +28 -0
- package/dist/src/control-plane/state-sync/reconcile.js +260 -0
- package/dist/src/control-plane/state-sync/repo.d.ts +1 -0
- package/dist/src/control-plane/state-sync/repo.js +42 -0
- package/dist/src/control-plane/state-sync/types.d.ts +28 -0
- package/dist/src/control-plane/state-sync/types.js +111 -0
- package/dist/src/control-plane/state-sync/write.d.ts +83 -0
- package/dist/src/control-plane/state-sync/write.js +1165 -0
- package/dist/src/control-plane/task-data-service.d.ts +17 -0
- package/dist/src/control-plane/task-data-service.js +3653 -0
- package/dist/src/control-plane/task-fields.d.ts +1 -0
- package/dist/src/control-plane/task-fields.js +6 -0
- package/dist/src/control-plane/task-io-service.d.ts +6 -0
- package/dist/src/control-plane/task-io-service.js +108 -0
- package/dist/src/control-plane/task-source-bootstrap.d.ts +1 -0
- package/dist/src/control-plane/task-source-bootstrap.js +6 -0
- package/dist/src/control-plane/task-source.d.ts +2 -0
- package/dist/src/control-plane/task-source.js +6 -0
- package/dist/src/control-plane/tasks/legacy-task-config-source.d.ts +19 -0
- package/dist/src/control-plane/tasks/legacy-task-config-source.js +124 -0
- package/dist/src/control-plane/tasks/plugin-task-source.d.ts +30 -0
- package/dist/src/control-plane/tasks/plugin-task-source.js +99 -0
- package/dist/src/control-plane/tasks/source-aware-task-config-source.d.ts +28 -0
- package/dist/src/control-plane/tasks/source-aware-task-config-source.js +642 -0
- package/dist/src/control-plane/tasks/source-lifecycle.d.ts +56 -0
- package/dist/src/control-plane/tasks/source-lifecycle.js +834 -0
- package/dist/src/plugin.d.ts +1 -1
- package/dist/src/plugin.js +3927 -64
- package/package.json +57 -4
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { type CaptureResult, runCapture, runCaptureAsync, runInherit, getValidationTimeoutMs, readJsonFile, nowIso, unique, fileLines, } from "@rig/core/exec";
|
|
2
|
+
export { resolveCheckoutRoot as resolveMonorepoRoot } from "@rig/core/checkout-root";
|
|
3
|
+
export { resolveHarnessPaths } from "@rig/core/harness-paths";
|
|
4
|
+
export declare function normalizePathToScope(projectRoot: string, monorepoRoot: string, inputPath: string): string;
|
|
5
|
+
export declare function monorepoSearchCandidates(inputPath: string): string[];
|
|
6
|
+
export declare function scopeGlobToRegex(glob: string): RegExp;
|
|
7
|
+
export declare function scopeMatches(path: string, scopes: string[]): boolean;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// packages/task-sources-plugin/src/control-plane/native/utils.ts
|
|
3
|
+
import { getScopeRules } from "@rig/core/scope-rules";
|
|
4
|
+
import { unique } from "@rig/core/exec";
|
|
5
|
+
import {
|
|
6
|
+
runCapture,
|
|
7
|
+
runCaptureAsync,
|
|
8
|
+
runInherit,
|
|
9
|
+
getValidationTimeoutMs,
|
|
10
|
+
readJsonFile,
|
|
11
|
+
nowIso,
|
|
12
|
+
unique as unique2,
|
|
13
|
+
fileLines
|
|
14
|
+
} from "@rig/core/exec";
|
|
15
|
+
import { resolveCheckoutRoot } from "@rig/core/checkout-root";
|
|
16
|
+
import { resolveHarnessPaths } from "@rig/core/harness-paths";
|
|
17
|
+
var scopeRegexCache = new Map;
|
|
18
|
+
function normalizeRelativeScopePath(inputPath) {
|
|
19
|
+
let normalized = inputPath.replace(/^\.\//, "");
|
|
20
|
+
const rules = getScopeRules();
|
|
21
|
+
if (rules?.stripPrefixes) {
|
|
22
|
+
for (const prefix of rules.stripPrefixes) {
|
|
23
|
+
if (normalized.startsWith(prefix)) {
|
|
24
|
+
normalized = normalized.slice(prefix.length);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return normalized;
|
|
29
|
+
}
|
|
30
|
+
function normalizePathToScope(projectRoot, monorepoRoot, inputPath) {
|
|
31
|
+
let normalized = inputPath.replace(/^\.\//, "");
|
|
32
|
+
if (normalized.startsWith(projectRoot + "/")) {
|
|
33
|
+
normalized = normalized.slice(projectRoot.length + 1);
|
|
34
|
+
}
|
|
35
|
+
if (normalized.startsWith(monorepoRoot + "/")) {
|
|
36
|
+
normalized = normalized.slice(monorepoRoot.length + 1);
|
|
37
|
+
}
|
|
38
|
+
return normalizeRelativeScopePath(normalized);
|
|
39
|
+
}
|
|
40
|
+
function monorepoSearchCandidates(inputPath) {
|
|
41
|
+
const normalized = inputPath.replace(/^\.\//, "");
|
|
42
|
+
const candidates = new Set;
|
|
43
|
+
const add = (value) => {
|
|
44
|
+
const trimmed = value.replace(/^\.\//, "");
|
|
45
|
+
if (trimmed) {
|
|
46
|
+
candidates.add(trimmed);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
add(normalized);
|
|
50
|
+
const stripped = normalizeRelativeScopePath(normalized);
|
|
51
|
+
add(stripped);
|
|
52
|
+
const rules = getScopeRules();
|
|
53
|
+
if (rules?.stripPrefixes) {
|
|
54
|
+
for (const prefix of rules.stripPrefixes) {
|
|
55
|
+
if (normalized.startsWith(prefix)) {
|
|
56
|
+
add(normalized.slice(prefix.length));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (rules?.searchPrefixes) {
|
|
61
|
+
for (const rule of rules.searchPrefixes) {
|
|
62
|
+
const matchesStart = rule.matchStartsWith?.some((prefix) => stripped.startsWith(prefix)) ?? false;
|
|
63
|
+
const matchesExact = rule.matchExact?.includes(stripped) ?? false;
|
|
64
|
+
if (matchesStart || matchesExact) {
|
|
65
|
+
add(`${rule.prefix}${stripped}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return [...candidates];
|
|
70
|
+
}
|
|
71
|
+
function scopeGlobToRegex(glob) {
|
|
72
|
+
const cached = scopeRegexCache.get(glob);
|
|
73
|
+
if (cached) {
|
|
74
|
+
return cached;
|
|
75
|
+
}
|
|
76
|
+
const escaped = glob.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*\*/g, "__GLOBSTAR__").replace(/\*/g, "[^/]*").replace(/__GLOBSTAR__/g, ".*");
|
|
77
|
+
const compiled = new RegExp(`^${escaped}$`);
|
|
78
|
+
scopeRegexCache.set(glob, compiled);
|
|
79
|
+
return compiled;
|
|
80
|
+
}
|
|
81
|
+
function scopeMatches(path, scopes) {
|
|
82
|
+
const pathVariants = unique([path, normalizeRelativeScopePath(path)]);
|
|
83
|
+
for (const scope of scopes) {
|
|
84
|
+
const scopeVariants = unique([scope, normalizeRelativeScopePath(scope)]);
|
|
85
|
+
for (const candidatePath of pathVariants) {
|
|
86
|
+
for (const candidateScope of scopeVariants) {
|
|
87
|
+
if (candidatePath === candidateScope || scopeGlobToRegex(candidateScope).test(candidatePath)) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
export {
|
|
96
|
+
unique2 as unique,
|
|
97
|
+
scopeMatches,
|
|
98
|
+
scopeGlobToRegex,
|
|
99
|
+
runInherit,
|
|
100
|
+
runCaptureAsync,
|
|
101
|
+
runCapture,
|
|
102
|
+
resolveCheckoutRoot as resolveMonorepoRoot,
|
|
103
|
+
resolveHarnessPaths,
|
|
104
|
+
readJsonFile,
|
|
105
|
+
nowIso,
|
|
106
|
+
normalizePathToScope,
|
|
107
|
+
monorepoSearchCandidates,
|
|
108
|
+
getValidationTimeoutMs,
|
|
109
|
+
fileLines
|
|
110
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type RuntimeTaskContext } from "@rig/core/runtime-context";
|
|
2
|
+
export declare function resolveValidatorBinaryPath(projectRoot: string, binaryName: string, runtimeContext: RuntimeTaskContext | null): string;
|
|
3
|
+
export declare function ensureValidatorBinary(projectRoot: string, checkId: string, runtimeContext: RuntimeTaskContext | null): Promise<string | null>;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// packages/task-sources-plugin/src/control-plane/native/validator-binaries.ts
|
|
3
|
+
import { existsSync as existsSync2, mkdirSync as mkdirSync2, rmSync as rmSync2, statSync } from "fs";
|
|
4
|
+
import { dirname as dirname2, resolve as resolve2 } from "path";
|
|
5
|
+
import { runtimeProvisioningEnv } from "@rig/core/runtime-provisioning-env";
|
|
6
|
+
import { resolveBunBinaryPath } from "@rig/core/runtime-paths";
|
|
7
|
+
|
|
8
|
+
// packages/task-sources-plugin/src/control-plane/native/runtime-binary-build.ts
|
|
9
|
+
import { chmodSync, existsSync, mkdirSync, renameSync, rmSync } from "fs";
|
|
10
|
+
import { basename, dirname, isAbsolute, resolve } from "path";
|
|
11
|
+
var runtimeBinaryBuildQueue = Promise.resolve();
|
|
12
|
+
async function buildRuntimeBinary(options) {
|
|
13
|
+
await runSerializedRuntimeBinaryBuild(async () => {
|
|
14
|
+
const entrypoint = isAbsolute(options.sourcePath) ? options.sourcePath : resolve(options.cwd, options.sourcePath);
|
|
15
|
+
const outputPath = resolve(options.outputPath);
|
|
16
|
+
const tempBuildDir = resolve(dirname(outputPath), `.bun-build-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
17
|
+
const tempOutputPath = resolve(tempBuildDir, basename(outputPath));
|
|
18
|
+
mkdirSync(tempBuildDir, { recursive: true });
|
|
19
|
+
await withTemporaryEnv({
|
|
20
|
+
...options.env,
|
|
21
|
+
...options.define ? { RIG_BUILD_CONFIG_JSON: JSON.stringify(options.define) } : {}
|
|
22
|
+
}, async () => withTemporaryCwd(tempBuildDir, async () => {
|
|
23
|
+
const buildResult = await Bun.build({
|
|
24
|
+
entrypoints: [entrypoint],
|
|
25
|
+
compile: {
|
|
26
|
+
target: currentCompileTarget(),
|
|
27
|
+
outfile: tempOutputPath
|
|
28
|
+
},
|
|
29
|
+
target: "bun",
|
|
30
|
+
format: "esm",
|
|
31
|
+
minify: true,
|
|
32
|
+
bytecode: true,
|
|
33
|
+
...options.external ? { external: options.external } : {},
|
|
34
|
+
...options.define ? { define: { __RIG_BUILD_CONFIG__: JSON.stringify(options.define) } } : {}
|
|
35
|
+
});
|
|
36
|
+
if (!buildResult.success) {
|
|
37
|
+
const details = buildResult.logs.map((log) => [
|
|
38
|
+
log.message,
|
|
39
|
+
log.position?.file ? `${log.position.file}:${log.position.line}:${log.position.column}` : ""
|
|
40
|
+
].filter(Boolean).join(" ")).filter(Boolean).join(`
|
|
41
|
+
`);
|
|
42
|
+
throw new Error(`Failed to build ${entrypoint}: ${details || "Bun.build() returned errors"}`);
|
|
43
|
+
}
|
|
44
|
+
if (!existsSync(tempOutputPath)) {
|
|
45
|
+
const emitted = buildResult.outputs.map((output) => output.path).join(", ") || "(none)";
|
|
46
|
+
throw new Error(`Failed to build ${entrypoint}: Bun.build() did not emit ${tempOutputPath}. Emitted: ${emitted}`);
|
|
47
|
+
}
|
|
48
|
+
renameSync(tempOutputPath, outputPath);
|
|
49
|
+
chmodSync(outputPath, 493);
|
|
50
|
+
})).finally(() => {
|
|
51
|
+
rmSync(tempBuildDir, { recursive: true, force: true });
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function currentCompileTarget() {
|
|
56
|
+
if (process.platform === "darwin") {
|
|
57
|
+
return process.arch === "arm64" ? "bun-darwin-arm64" : "bun-darwin-x64";
|
|
58
|
+
}
|
|
59
|
+
if (process.platform === "linux") {
|
|
60
|
+
return process.arch === "arm64" ? "bun-linux-arm64" : "bun-linux-x64";
|
|
61
|
+
}
|
|
62
|
+
return "bun-windows-x64";
|
|
63
|
+
}
|
|
64
|
+
async function runSerializedRuntimeBinaryBuild(action) {
|
|
65
|
+
const previous = runtimeBinaryBuildQueue;
|
|
66
|
+
let release;
|
|
67
|
+
runtimeBinaryBuildQueue = new Promise((resolveRelease) => {
|
|
68
|
+
release = resolveRelease;
|
|
69
|
+
});
|
|
70
|
+
await previous;
|
|
71
|
+
try {
|
|
72
|
+
return await action();
|
|
73
|
+
} finally {
|
|
74
|
+
release();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function withTemporaryEnv(env, action) {
|
|
78
|
+
if (!env) {
|
|
79
|
+
return action();
|
|
80
|
+
}
|
|
81
|
+
const previousValues = new Map;
|
|
82
|
+
for (const [key, value] of Object.entries(env)) {
|
|
83
|
+
previousValues.set(key, process.env[key]);
|
|
84
|
+
if (value === undefined) {
|
|
85
|
+
delete process.env[key];
|
|
86
|
+
} else {
|
|
87
|
+
process.env[key] = value;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
return await action();
|
|
92
|
+
} finally {
|
|
93
|
+
for (const [key, value] of previousValues.entries()) {
|
|
94
|
+
if (value === undefined) {
|
|
95
|
+
delete process.env[key];
|
|
96
|
+
} else {
|
|
97
|
+
process.env[key] = value;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async function withTemporaryCwd(cwd, action) {
|
|
103
|
+
const previousCwd = process.cwd();
|
|
104
|
+
process.chdir(cwd);
|
|
105
|
+
try {
|
|
106
|
+
return await action();
|
|
107
|
+
} finally {
|
|
108
|
+
process.chdir(previousCwd);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// packages/task-sources-plugin/src/control-plane/native/utils.ts
|
|
113
|
+
import { getScopeRules } from "@rig/core/scope-rules";
|
|
114
|
+
import { unique } from "@rig/core/exec";
|
|
115
|
+
import {
|
|
116
|
+
runCapture,
|
|
117
|
+
runCaptureAsync,
|
|
118
|
+
runInherit,
|
|
119
|
+
getValidationTimeoutMs,
|
|
120
|
+
readJsonFile,
|
|
121
|
+
nowIso,
|
|
122
|
+
unique as unique2,
|
|
123
|
+
fileLines
|
|
124
|
+
} from "@rig/core/exec";
|
|
125
|
+
import { resolveCheckoutRoot } from "@rig/core/checkout-root";
|
|
126
|
+
import { resolveHarnessPaths } from "@rig/core/harness-paths";
|
|
127
|
+
var scopeRegexCache = new Map;
|
|
128
|
+
|
|
129
|
+
// packages/task-sources-plugin/src/control-plane/native/validator-binaries.ts
|
|
130
|
+
function resolveValidatorBinaryPath(projectRoot, binaryName, runtimeContext) {
|
|
131
|
+
if (runtimeContext) {
|
|
132
|
+
return resolve2(runtimeContext.binDir, "validators", binaryName);
|
|
133
|
+
}
|
|
134
|
+
return resolve2(resolveHarnessPaths(projectRoot).binDir, "validators", binaryName);
|
|
135
|
+
}
|
|
136
|
+
async function ensureValidatorBinary(projectRoot, checkId, runtimeContext) {
|
|
137
|
+
const match = checkId.match(/^([a-z][\w-]*):([a-z][\w-]*)$/);
|
|
138
|
+
if (!match) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
const category = match[1];
|
|
142
|
+
const check = match[2];
|
|
143
|
+
if (!category || !check) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
const binaryName = `${category}-${check}`;
|
|
147
|
+
const binaryPath = resolveValidatorBinaryPath(projectRoot, binaryName, runtimeContext);
|
|
148
|
+
const hostProjectRoot = runtimeContext?.hostProjectRoot?.trim() || projectRoot;
|
|
149
|
+
const sourcePath = resolve2(hostProjectRoot, "packages/validator-kit/src/validators", category, `${check}.ts`);
|
|
150
|
+
if (!existsSync2(sourcePath)) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
const sourceMtime = statSync(sourcePath).mtimeMs;
|
|
154
|
+
const binaryExists = existsSync2(binaryPath);
|
|
155
|
+
const binaryMtime = binaryExists ? statSync(binaryPath).mtimeMs : 0;
|
|
156
|
+
if (!binaryExists || sourceMtime > binaryMtime) {
|
|
157
|
+
if (binaryExists) {
|
|
158
|
+
rmSync2(binaryPath, { force: true });
|
|
159
|
+
rmSync2(`${binaryPath}.build-manifest.json`, { force: true });
|
|
160
|
+
}
|
|
161
|
+
mkdirSync2(dirname2(binaryPath), { recursive: true });
|
|
162
|
+
await buildRuntimeBinary({
|
|
163
|
+
sourcePath: `packages/validator-kit/src/validators/${category}/${check}.ts`,
|
|
164
|
+
outputPath: binaryPath,
|
|
165
|
+
cwd: hostProjectRoot,
|
|
166
|
+
define: { AGENT_BUN_PATH: resolveBunBinaryPath() },
|
|
167
|
+
env: runtimeProvisioningEnv()
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
return existsSync2(binaryPath) ? binaryPath : null;
|
|
171
|
+
}
|
|
172
|
+
export {
|
|
173
|
+
resolveValidatorBinaryPath,
|
|
174
|
+
ensureValidatorBinary
|
|
175
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { RuntimeTaskContext } from "@rig/core/runtime-context";
|
|
2
|
+
import { readTaskConfig } from "./task-state";
|
|
3
|
+
import type { ValidatorContext, ValidatorRegistry } from "@rig/validator-kit";
|
|
4
|
+
export type ValidatorOutput = {
|
|
5
|
+
id: string;
|
|
6
|
+
passed: boolean;
|
|
7
|
+
summary: string;
|
|
8
|
+
details?: string;
|
|
9
|
+
};
|
|
10
|
+
export type ValidationCategoryResult = {
|
|
11
|
+
category: string;
|
|
12
|
+
status: "pass" | "fail";
|
|
13
|
+
exit_code?: number;
|
|
14
|
+
duration_seconds: number;
|
|
15
|
+
};
|
|
16
|
+
export type ValidationSummary = {
|
|
17
|
+
status: "pass" | "fail" | "skipped";
|
|
18
|
+
total: number;
|
|
19
|
+
passed: number;
|
|
20
|
+
failed: number;
|
|
21
|
+
categories: ValidationCategoryResult[];
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Two-phase validator dispatch.
|
|
25
|
+
*
|
|
26
|
+
* Phase 1 (in-process): if `registry` has a validator registered for `checkId`, build a
|
|
27
|
+
* `ValidatorContext` from the ambient task data and call `.run(ctx)` directly.
|
|
28
|
+
*
|
|
29
|
+
* Phase 2 (subprocess fallback): if the registry does not know `checkId` (throws
|
|
30
|
+
* "not registered"), delegate to the existing `runValidatorBinary` subprocess path.
|
|
31
|
+
*
|
|
32
|
+
* The `ValidatorOutput` shape is identical for both paths so the caller sees no difference.
|
|
33
|
+
*/
|
|
34
|
+
export declare function dispatchValidator(checkId: string, registry: ValidatorRegistry, ctx: ValidatorContext, subprocessFallback: (checkId: string) => Promise<{
|
|
35
|
+
result: ValidatorOutput;
|
|
36
|
+
exitCode: number;
|
|
37
|
+
}>): Promise<{
|
|
38
|
+
result: ValidatorOutput;
|
|
39
|
+
exitCode: number;
|
|
40
|
+
}>;
|
|
41
|
+
export declare function validateTask(projectRoot: string, taskId: string, runtimeContext?: RuntimeTaskContext | null, registry?: ValidatorRegistry, options?: {
|
|
42
|
+
taskConfig?: ReturnType<typeof readTaskConfig>;
|
|
43
|
+
validationDescriptions?: Record<string, string>;
|
|
44
|
+
}): Promise<ValidationSummary>;
|