clinkx 1.1.0 → 1.1.2
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/CHANGELOG.md +39 -1
- package/README.md +210 -177
- package/clinkx-workflows/dist/architecture-comparison/admission.d.ts +5 -0
- package/clinkx-workflows/dist/architecture-comparison/admission.js +50 -0
- package/clinkx-workflows/dist/architecture-comparison/admission.js.map +1 -0
- package/clinkx-workflows/dist/architecture-comparison/contract.d.ts +995 -0
- package/clinkx-workflows/dist/architecture-comparison/contract.js +149 -0
- package/clinkx-workflows/dist/architecture-comparison/contract.js.map +1 -0
- package/clinkx-workflows/dist/architecture-comparison/runtime.d.ts +29 -0
- package/clinkx-workflows/dist/architecture-comparison/runtime.js +387 -0
- package/clinkx-workflows/dist/architecture-comparison/runtime.js.map +1 -0
- package/clinkx-workflows/dist/contained-file.js +1 -1
- package/clinkx-workflows/dist/contained-file.js.map +1 -1
- package/clinkx-workflows/dist/council-execution-policy.d.ts +4 -2
- package/clinkx-workflows/dist/council-execution-policy.js +5 -1
- package/clinkx-workflows/dist/council-execution-policy.js.map +1 -1
- package/clinkx-workflows/dist/dashboard/activity-contract.d.ts +72 -72
- package/clinkx-workflows/dist/dashboard/contracts.d.ts +1564 -122
- package/clinkx-workflows/dist/dashboard/contracts.js +4 -0
- package/clinkx-workflows/dist/dashboard/contracts.js.map +1 -1
- package/clinkx-workflows/dist/dashboard/progress-report-contract.d.ts +12 -12
- package/clinkx-workflows/dist/dashboard/progress-report-status-overlay.d.ts +8 -8
- package/clinkx-workflows/dist/dashboard/scanner.d.ts +3 -0
- package/clinkx-workflows/dist/dashboard/scanner.js +27 -0
- package/clinkx-workflows/dist/dashboard/scanner.js.map +1 -1
- package/clinkx-workflows/dist/dashboard/session-log-contract.d.ts +48 -48
- package/clinkx-workflows/dist/dashboard/session-log-redaction.d.ts +2 -0
- package/clinkx-workflows/dist/dashboard/session-log-redaction.js +4 -0
- package/clinkx-workflows/dist/dashboard/session-log-redaction.js.map +1 -1
- package/clinkx-workflows/dist/dashboard/verified-repair-contract.d.ts +191 -0
- package/clinkx-workflows/dist/dashboard/verified-repair-contract.js +28 -0
- package/clinkx-workflows/dist/dashboard/verified-repair-contract.js.map +1 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/index-BdpmbPps.js +115 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/style-Im5i1iAs.css +1 -0
- package/clinkx-workflows/dist/dashboard-ui/index.html +2 -2
- package/clinkx-workflows/dist/engine.d.ts +6 -0
- package/clinkx-workflows/dist/engine.js +78 -7
- package/clinkx-workflows/dist/engine.js.map +1 -1
- package/clinkx-workflows/dist/index.d.ts +3 -0
- package/clinkx-workflows/dist/index.js +3 -2
- package/clinkx-workflows/dist/index.js.map +1 -1
- package/clinkx-workflows/dist/reducers/index.d.ts +9 -1
- package/clinkx-workflows/dist/reducers/index.js +22 -0
- package/clinkx-workflows/dist/reducers/index.js.map +1 -1
- package/clinkx-workflows/dist/state.js +17 -7
- package/clinkx-workflows/dist/state.js.map +1 -1
- package/clinkx-workflows/dist/validators/architecture-comparison.d.ts +2 -0
- package/clinkx-workflows/dist/validators/architecture-comparison.js +12 -0
- package/clinkx-workflows/dist/validators/architecture-comparison.js.map +1 -0
- package/clinkx-workflows/dist/validators/index.js +4 -0
- package/clinkx-workflows/dist/validators/index.js.map +1 -1
- package/clinkx-workflows/dist/validators/verified-repair.d.ts +2 -0
- package/clinkx-workflows/dist/validators/verified-repair.js +12 -0
- package/clinkx-workflows/dist/validators/verified-repair.js.map +1 -0
- package/clinkx-workflows/dist/verification-proof.d.ts +254 -0
- package/clinkx-workflows/dist/verification-proof.js +195 -0
- package/clinkx-workflows/dist/verification-proof.js.map +1 -0
- package/clinkx-workflows/dist/verified-repair/admission.d.ts +72 -0
- package/clinkx-workflows/dist/verified-repair/admission.js +63 -0
- package/clinkx-workflows/dist/verified-repair/admission.js.map +1 -0
- package/clinkx-workflows/dist/verified-repair/contract.d.ts +1910 -0
- package/clinkx-workflows/dist/verified-repair/contract.js +127 -0
- package/clinkx-workflows/dist/verified-repair/contract.js.map +1 -0
- package/clinkx-workflows/dist/verified-repair/host.d.ts +32 -0
- package/clinkx-workflows/dist/verified-repair/host.js +2 -0
- package/clinkx-workflows/dist/verified-repair/host.js.map +1 -0
- package/clinkx-workflows/dist/verified-repair/prompts.d.ts +12 -0
- package/clinkx-workflows/dist/verified-repair/prompts.js +58 -0
- package/clinkx-workflows/dist/verified-repair/prompts.js.map +1 -0
- package/clinkx-workflows/dist/verified-repair/result.d.ts +16 -0
- package/clinkx-workflows/dist/verified-repair/result.js +102 -0
- package/clinkx-workflows/dist/verified-repair/result.js.map +1 -0
- package/clinkx-workflows/dist/verified-repair/runtime.d.ts +28 -0
- package/clinkx-workflows/dist/verified-repair/runtime.js +186 -0
- package/clinkx-workflows/dist/verified-repair/runtime.js.map +1 -0
- package/clinkx-workflows/dist/workflow-tools.d.ts +3 -0
- package/clinkx-workflows/dist/workflow-tools.js +148 -14
- package/clinkx-workflows/dist/workflow-tools.js.map +1 -1
- package/clinkx-workflows/dist/workflow-verification-contract.d.ts +539 -0
- package/clinkx-workflows/dist/workflow-verification-contract.js +52 -0
- package/clinkx-workflows/dist/workflow-verification-contract.js.map +1 -0
- package/clinkx-workflows/dist/workflow-verification.d.ts +15 -0
- package/clinkx-workflows/dist/workflow-verification.js +218 -0
- package/clinkx-workflows/dist/workflow-verification.js.map +1 -0
- package/clinkx-workflows/templates/architecture-comparison/candidate.txt +29 -0
- package/clinkx-workflows/templates/architecture-comparison/judge.txt +31 -0
- package/clinkx-workflows/templates/verified-repair/investigate.txt +20 -0
- package/clinkx-workflows/templates/verified-repair/repair.txt +11 -0
- package/clinkx-workflows/templates/verified-repair/review.txt +18 -0
- package/clinkx-workflows/workflows/architecture-comparison.yaml +133 -0
- package/clinkx-workflows/workflows/verified-repair.yaml +104 -0
- package/dist/allowed-roots.js +4 -1
- package/dist/allowed-roots.js.map +1 -1
- package/dist/codex/app-server-client.d.ts +1 -0
- package/dist/codex/app-server-client.js +3 -2
- package/dist/codex/app-server-client.js.map +1 -1
- package/dist/context-builder/diagnostics.d.ts +1 -0
- package/dist/context-builder/diagnostics.js +1 -1
- package/dist/context-builder/diagnostics.js.map +1 -1
- package/dist/context-builder/discovery.d.ts +18 -1
- package/dist/context-builder/discovery.js +69 -1
- package/dist/context-builder/discovery.js.map +1 -1
- package/dist/context-builder/handler.js +8 -1
- package/dist/context-builder/handler.js.map +1 -1
- package/dist/context-builder/lifecycle-contract.d.ts +24 -24
- package/dist/context-builder/refine-handler.js +16 -1
- package/dist/context-builder/refine-handler.js.map +1 -1
- package/dist/context-builder/secrets.d.ts +11 -0
- package/dist/context-builder/secrets.js +81 -1
- package/dist/context-builder/secrets.js.map +1 -1
- package/dist/context-builder/versions.d.ts +5 -2
- package/dist/context-builder/versions.js +5 -2
- package/dist/context-builder/versions.js.map +1 -1
- package/dist/dashboard-cli.js +10 -3
- package/dist/dashboard-cli.js.map +1 -1
- package/dist/dashboard-gateway/main.js +8 -3
- package/dist/dashboard-gateway/main.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/project-verification/contract.d.ts +537 -0
- package/dist/project-verification/contract.js +40 -0
- package/dist/project-verification/contract.js.map +1 -0
- package/dist/project-verification/files.d.ts +23 -0
- package/dist/project-verification/files.js +80 -0
- package/dist/project-verification/files.js.map +1 -0
- package/dist/project-verification/process.d.ts +7 -0
- package/dist/project-verification/process.js +115 -0
- package/dist/project-verification/process.js.map +1 -0
- package/dist/project-verification/runner.d.ts +35 -0
- package/dist/project-verification/runner.js +185 -0
- package/dist/project-verification/runner.js.map +1 -0
- package/dist/project-verification/service.d.ts +37 -0
- package/dist/project-verification/service.js +151 -0
- package/dist/project-verification/service.js.map +1 -0
- package/dist/provider-doctor.d.ts +22 -0
- package/dist/provider-doctor.js +22 -0
- package/dist/provider-doctor.js.map +1 -0
- package/dist/server.js +29 -1
- package/dist/server.js.map +1 -1
- package/dist/verification-tools.d.ts +90 -0
- package/dist/verification-tools.js +120 -0
- package/dist/verification-tools.js.map +1 -0
- package/dist/verified-repair/files.d.ts +22 -0
- package/dist/verified-repair/files.js +114 -0
- package/dist/verified-repair/files.js.map +1 -0
- package/dist/verified-repair/host.d.ts +14 -0
- package/dist/verified-repair/host.js +612 -0
- package/dist/verified-repair/host.js.map +1 -0
- package/docs/configuration.md +493 -0
- package/docs/engineering-recipes.md +415 -0
- package/docs/security.md +293 -0
- package/docs/verification/README.md +59 -0
- package/docs/verification/dashboard-real-disk.md +436 -0
- package/docs/verification/project-checks.example.json +14 -0
- package/docs/verification/project-checks.md +444 -0
- package/docs/verification/workflow-handoff.md +113 -0
- package/package.json +13 -6
- package/scripts/provider-doctor-core.mjs +364 -0
- package/scripts/provider-doctor-probe.mjs +34 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/index-JPHQVtn9.js +0 -106
- package/clinkx-workflows/dist/dashboard-ui/assets/style-DOMHk-j6.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/project-verification/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Manifest } from "./contract.js";
|
|
2
|
+
export declare function runCommand(project: string, directory: string, check: Manifest["checks"][number], signal: AbortSignal): Promise<{
|
|
3
|
+
exit_code: number | null;
|
|
4
|
+
signal: string | null;
|
|
5
|
+
reason: "passed" | "nonzero_exit" | "spawn_error" | "timeout" | "cancelled" | "capture_limit" | "cleanup_failure";
|
|
6
|
+
cleanup_ok: boolean;
|
|
7
|
+
}>;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { writeFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { safePath } from "./files.js";
|
|
5
|
+
const CAPTURE_LIMIT = 1024 * 1024;
|
|
6
|
+
const BASELINE = ["PATH", "HOME", "USER", "LANG", "TMPDIR"];
|
|
7
|
+
function signalGroup(child, signal) {
|
|
8
|
+
if (child.pid === undefined)
|
|
9
|
+
return true;
|
|
10
|
+
try {
|
|
11
|
+
if (process.platform === "win32")
|
|
12
|
+
return child.kill(signal);
|
|
13
|
+
process.kill(-child.pid, signal);
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
return error.code === "ESRCH";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function groupGone(child) {
|
|
21
|
+
if (child.pid === undefined)
|
|
22
|
+
return true;
|
|
23
|
+
try {
|
|
24
|
+
process.kill(process.platform === "win32" ? child.pid : -child.pid, 0);
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return error.code === "ESRCH";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export async function runCommand(project, directory, check, signal) {
|
|
32
|
+
const env = {};
|
|
33
|
+
for (const key of [...BASELINE, ...check.env_allowlist])
|
|
34
|
+
if (process.env[key] !== undefined)
|
|
35
|
+
env[key] = process.env[key];
|
|
36
|
+
const cwd = safePath(project, check.cwd, true);
|
|
37
|
+
return new Promise((resolveResult, reject) => {
|
|
38
|
+
let reason;
|
|
39
|
+
let exitCode = null;
|
|
40
|
+
let exitSignal = null;
|
|
41
|
+
let finishing = false;
|
|
42
|
+
const stdout = [], stderr = [];
|
|
43
|
+
let stdoutSize = 0, stderrSize = 0;
|
|
44
|
+
const child = spawn(check.command, check.args, { cwd, env, shell: false, detached: process.platform !== "win32", stdio: ["ignore", "pipe", "pipe"] });
|
|
45
|
+
let escalation;
|
|
46
|
+
const stop = (why) => {
|
|
47
|
+
reason ??= why;
|
|
48
|
+
signalGroup(child, "SIGTERM");
|
|
49
|
+
escalation ??= setTimeout(() => {
|
|
50
|
+
signalGroup(child, "SIGKILL");
|
|
51
|
+
child.stdout.destroy();
|
|
52
|
+
child.stderr.destroy();
|
|
53
|
+
}, 500);
|
|
54
|
+
};
|
|
55
|
+
const onAbort = () => stop("cancelled");
|
|
56
|
+
const timer = setTimeout(() => stop("timeout"), check.timeout_seconds * 1000);
|
|
57
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
58
|
+
if (signal.aborted)
|
|
59
|
+
onAbort();
|
|
60
|
+
child.stdout.on("data", (chunk) => {
|
|
61
|
+
const keep = chunk.subarray(0, Math.max(0, CAPTURE_LIMIT - stdoutSize));
|
|
62
|
+
if (keep.length > 0)
|
|
63
|
+
stdout.push(keep);
|
|
64
|
+
stdoutSize += keep.length;
|
|
65
|
+
if (keep.length !== chunk.length)
|
|
66
|
+
stop("capture_limit");
|
|
67
|
+
});
|
|
68
|
+
child.stderr.on("data", (chunk) => {
|
|
69
|
+
const keep = chunk.subarray(0, Math.max(0, CAPTURE_LIMIT - stderrSize));
|
|
70
|
+
if (keep.length > 0)
|
|
71
|
+
stderr.push(keep);
|
|
72
|
+
stderrSize += keep.length;
|
|
73
|
+
if (keep.length !== chunk.length)
|
|
74
|
+
stop("capture_limit");
|
|
75
|
+
});
|
|
76
|
+
child.on("error", () => { reason ??= "spawn_error"; });
|
|
77
|
+
child.on("exit", (code, sig) => {
|
|
78
|
+
exitCode = code;
|
|
79
|
+
exitSignal = sig;
|
|
80
|
+
signalGroup(child, "SIGTERM");
|
|
81
|
+
escalation ??= setTimeout(() => {
|
|
82
|
+
signalGroup(child, "SIGKILL");
|
|
83
|
+
child.stdout.destroy();
|
|
84
|
+
child.stderr.destroy();
|
|
85
|
+
}, 500);
|
|
86
|
+
});
|
|
87
|
+
child.on("close", async () => {
|
|
88
|
+
if (finishing)
|
|
89
|
+
return;
|
|
90
|
+
finishing = true;
|
|
91
|
+
clearTimeout(timer);
|
|
92
|
+
if (escalation)
|
|
93
|
+
clearTimeout(escalation);
|
|
94
|
+
signal.removeEventListener("abort", onAbort);
|
|
95
|
+
signalGroup(child, "SIGTERM");
|
|
96
|
+
if (!groupGone(child)) {
|
|
97
|
+
await new Promise((done) => setTimeout(done, 100));
|
|
98
|
+
signalGroup(child, "SIGKILL");
|
|
99
|
+
for (let attempt = 0; attempt < 20 && !groupGone(child); attempt++)
|
|
100
|
+
await new Promise((done) => setTimeout(done, 25));
|
|
101
|
+
}
|
|
102
|
+
const cleanup_ok = groupGone(child);
|
|
103
|
+
try {
|
|
104
|
+
writeFileSync(join(directory, "stdout.log"), Buffer.concat(stdout), { flag: "wx", mode: 0o600 });
|
|
105
|
+
writeFileSync(join(directory, "stderr.log"), Buffer.concat(stderr), { flag: "wx", mode: 0o600 });
|
|
106
|
+
resolveResult({ exit_code: exitCode, signal: exitSignal, cleanup_ok,
|
|
107
|
+
reason: reason ?? (!cleanup_ok ? "cleanup_failure" : exitCode === 0 && exitSignal === null ? "passed" : "nonzero_exit") });
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
reject(error);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/project-verification/process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type VerificationCoverage } from "../../clinkx-workflows/dist/verification-proof.js";
|
|
2
|
+
export interface Options {
|
|
3
|
+
project: string;
|
|
4
|
+
manifest: string;
|
|
5
|
+
evidence: string;
|
|
6
|
+
}
|
|
7
|
+
type ProjectReason = {
|
|
8
|
+
code: string;
|
|
9
|
+
check_id: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function runProject(options: Options, signal: AbortSignal): Promise<{
|
|
12
|
+
status: import("../../clinkx-workflows/dist/verification-proof.js").VerificationStatus;
|
|
13
|
+
checks: readonly {
|
|
14
|
+
check_id: string;
|
|
15
|
+
status: VerificationCoverage["status"];
|
|
16
|
+
reasons: readonly ProjectReason[];
|
|
17
|
+
}[];
|
|
18
|
+
reasons: readonly ProjectReason[];
|
|
19
|
+
version: number;
|
|
20
|
+
evidence_directory: string;
|
|
21
|
+
expectations_sha256: string;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function inspectProject(options: Options, pin: string): {
|
|
24
|
+
status: import("../../clinkx-workflows/dist/verification-proof.js").VerificationStatus;
|
|
25
|
+
checks: readonly {
|
|
26
|
+
check_id: string;
|
|
27
|
+
status: VerificationCoverage["status"];
|
|
28
|
+
reasons: readonly ProjectReason[];
|
|
29
|
+
}[];
|
|
30
|
+
reasons: readonly ProjectReason[];
|
|
31
|
+
version: number;
|
|
32
|
+
evidence_directory: string;
|
|
33
|
+
expectations_sha256: string;
|
|
34
|
+
};
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { mkdirSync, readdirSync, realpathSync } from "node:fs";
|
|
2
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { evaluateVerificationCoverage } from "../../clinkx-workflows/dist/verification-proof.js";
|
|
5
|
+
import { CompletionSchema, ExpectedSchema, ObservationsSchema, RelativeFile, ResultSchema } from "./contract.js";
|
|
6
|
+
import { fileFact, inside, json, PACKAGE_ROOT, readBounded, readManifest, runtimeDigest, safePath, save, sha, snapshot } from "./files.js";
|
|
7
|
+
import { runCommand } from "./process.js";
|
|
8
|
+
const EXPECTED_LIMIT = 2 * 1024 * 1024;
|
|
9
|
+
function projectOptions(options) {
|
|
10
|
+
const project = realpathSync(resolve(options.project));
|
|
11
|
+
safePath(project, ".", true);
|
|
12
|
+
const manifest_path = RelativeFile.parse(options.manifest);
|
|
13
|
+
const captured = readManifest(project, manifest_path);
|
|
14
|
+
const manifest = captured.manifest;
|
|
15
|
+
for (const check of manifest.checks)
|
|
16
|
+
safePath(project, check.cwd, true);
|
|
17
|
+
const inputs = snapshot(project, manifest);
|
|
18
|
+
const source_sha256 = sha(json({ inputs, manifest_sha256: captured.sha256 }));
|
|
19
|
+
return { project, manifest_path, manifest, inputs, source_sha256 };
|
|
20
|
+
}
|
|
21
|
+
function currentSource(project, manifest_path) {
|
|
22
|
+
try {
|
|
23
|
+
const captured = readManifest(project, manifest_path);
|
|
24
|
+
return sha(json({ inputs: snapshot(project, captured.manifest), manifest_sha256: captured.sha256 }));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function note(coverage, code, severity, check_id = "") {
|
|
31
|
+
const status = coverage.status === "failed" || severity === "failed" ? "failed"
|
|
32
|
+
: coverage.status === "inapplicable" || severity === "inapplicable" ? "inapplicable" : "incomplete";
|
|
33
|
+
const reason = { code, check_id };
|
|
34
|
+
const checks = check_id === "" ? coverage.checks : coverage.checks.map((check) => check.check_id !== check_id ? check : {
|
|
35
|
+
...check, status: check.status === "failed" || severity === "failed" ? "failed"
|
|
36
|
+
: check.status === "inapplicable" || severity === "inapplicable" ? "inapplicable" : "incomplete",
|
|
37
|
+
reasons: [...check.reasons, reason],
|
|
38
|
+
});
|
|
39
|
+
return { ...coverage, status, checks, reasons: [...coverage.reasons, reason] };
|
|
40
|
+
}
|
|
41
|
+
function problem(code, severity = "failed") {
|
|
42
|
+
return { status: severity, checks: [], reasons: [{ code, check_id: "" }] };
|
|
43
|
+
}
|
|
44
|
+
export async function runProject(options, signal) {
|
|
45
|
+
if (process.platform === "win32")
|
|
46
|
+
throw new Error("project verification requires POSIX process-group cleanup");
|
|
47
|
+
const initial = projectOptions(options);
|
|
48
|
+
const identity = { source_sha256: initial.source_sha256, build_sha256: runtimeDigest(),
|
|
49
|
+
procedure_sha256: sha(json(initial.manifest)), boundary: "project-command-v1" };
|
|
50
|
+
const parent = realpathSync(dirname(resolve(options.evidence)));
|
|
51
|
+
const evidence = join(parent, basename(resolve(options.evidence)));
|
|
52
|
+
if (inside(initial.project, evidence) || inside(PACKAGE_ROOT, evidence))
|
|
53
|
+
throw new Error("evidence must be outside project and package");
|
|
54
|
+
const attempt = randomUUID();
|
|
55
|
+
const expectations = { version: 1, identity, superseded_attempts: [], checks: initial.manifest.checks.map((check) => ({
|
|
56
|
+
check_id: check.id, attempt_id: `${attempt}-${check.id}`, producer: check.id, artifact_path: `checks/${check.id}/result.json`,
|
|
57
|
+
})) };
|
|
58
|
+
const expected = ExpectedSchema.parse({ version: 1, project: initial.project, manifest_path: initial.manifest_path,
|
|
59
|
+
manifest: initial.manifest, inputs: initial.inputs, node_version: process.version, expectations });
|
|
60
|
+
if (Buffer.byteLength(json(expected)) > EXPECTED_LIMIT)
|
|
61
|
+
throw new Error("serialized expectations exceed 2 MiB");
|
|
62
|
+
mkdirSync(evidence, { mode: 0o700 });
|
|
63
|
+
save(evidence, "expected.json", expected);
|
|
64
|
+
const expectations_sha256 = fileFact(evidence, "expected.json").sha256;
|
|
65
|
+
mkdirSync(join(evidence, "checks"), { mode: 0o700 });
|
|
66
|
+
const observations = [];
|
|
67
|
+
for (const [index, check] of initial.manifest.checks.entries()) {
|
|
68
|
+
if (signal.aborted)
|
|
69
|
+
break;
|
|
70
|
+
const owner = expectations.checks[index];
|
|
71
|
+
const directory = join(evidence, "checks", check.id);
|
|
72
|
+
mkdirSync(directory, { mode: 0o700 });
|
|
73
|
+
const before = currentSource(initial.project, initial.manifest_path);
|
|
74
|
+
const result = await runCommand(initial.project, directory, check, signal);
|
|
75
|
+
const record = ResultSchema.parse({ version: 1, check_id: check.id, attempt_id: owner.attempt_id,
|
|
76
|
+
source_before_sha256: before ?? "0".repeat(64), source_after_sha256: currentSource(initial.project, initial.manifest_path), ...result,
|
|
77
|
+
stdout: fileFact(evidence, `checks/${check.id}/stdout.log`), stderr: fileFact(evidence, `checks/${check.id}/stderr.log`) });
|
|
78
|
+
save(evidence, owner.artifact_path, record);
|
|
79
|
+
observations.push({ check_id: check.id, attempt_id: owner.attempt_id, producer: check.id, identity,
|
|
80
|
+
provenance: "trusted_host", result: record.reason === "passed" && record.cleanup_ok ? "passed" : "failed",
|
|
81
|
+
artifact: fileFact(evidence, owner.artifact_path) });
|
|
82
|
+
}
|
|
83
|
+
save(evidence, "observations.json", observations);
|
|
84
|
+
save(evidence, "completion.json", { version: 1, observations_sha256: fileFact(evidence, "observations.json").sha256,
|
|
85
|
+
interrupted_signal: signal.aborted ? "cancelled" : null });
|
|
86
|
+
const result = inspectProject(options, expectations_sha256);
|
|
87
|
+
save(evidence, "proof.json", result);
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
export function inspectProject(options, pin) {
|
|
91
|
+
const evidence = realpathSync(resolve(options.evidence));
|
|
92
|
+
const finish = (coverage) => ({ version: 1, evidence_directory: evidence, expectations_sha256: pin, ...coverage });
|
|
93
|
+
let expected;
|
|
94
|
+
try {
|
|
95
|
+
const bytes = readBounded(evidence, "expected.json", EXPECTED_LIMIT);
|
|
96
|
+
if (sha(bytes) !== pin)
|
|
97
|
+
return finish(problem("expectations_pin_mismatch"));
|
|
98
|
+
expected = ExpectedSchema.parse(JSON.parse(bytes.toString("utf8")));
|
|
99
|
+
if (expected.expectations.identity.boundary !== "project-command-v1")
|
|
100
|
+
return finish(problem("wrong_procedure_boundary"));
|
|
101
|
+
const checkIds = expected.manifest.checks.map((check) => check.id);
|
|
102
|
+
if (expected.expectations.checks.length !== checkIds.length || expected.expectations.checks.some((check, index) => check.check_id !== checkIds[index] || check.producer !== checkIds[index] || check.artifact_path !== `checks/${checkIds[index]}/result.json`)) {
|
|
103
|
+
return finish(problem("invalid_check_ownership"));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
return finish(problem(error.code === "ENOENT" ? "missing_expectations" : "invalid_expectations", error.code === "ENOENT" ? "incomplete" : "failed"));
|
|
108
|
+
}
|
|
109
|
+
let observations = [];
|
|
110
|
+
let observationsProblem;
|
|
111
|
+
try {
|
|
112
|
+
observations = ObservationsSchema.parse(JSON.parse(readBounded(evidence, "observations.json", 256 * 1024).toString("utf8")));
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
observationsProblem = error.code === "ENOENT" ? "missing_observations" : "invalid_observations";
|
|
116
|
+
}
|
|
117
|
+
const facts = expected.expectations.checks.map((check) => {
|
|
118
|
+
try {
|
|
119
|
+
return { ...fileFact(evidence, check.artifact_path), status: "readable" };
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
return { path: check.artifact_path, status: error.code === "ENOENT" ? "missing"
|
|
123
|
+
: error.code === "E_PATH_UNSAFE" ? "escaped" : "unreadable" };
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
let coverage = evaluateVerificationCoverage(expected.expectations, observations, facts);
|
|
127
|
+
if (observationsProblem)
|
|
128
|
+
coverage = note(coverage, observationsProblem, observationsProblem === "missing_observations" ? "incomplete" : "failed");
|
|
129
|
+
try {
|
|
130
|
+
const completion = CompletionSchema.parse(JSON.parse(readBounded(evidence, "completion.json", 4096).toString("utf8")));
|
|
131
|
+
if (completion.observations_sha256 !== fileFact(evidence, "observations.json").sha256)
|
|
132
|
+
coverage = note(coverage, "observations_integrity", "failed");
|
|
133
|
+
if (completion.interrupted_signal !== null)
|
|
134
|
+
coverage = note(coverage, "interrupted", "failed");
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
coverage = note(coverage, "unpublished_attempt", error.code === "ENOENT" ? "incomplete" : "failed");
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
const allowed = new Set(["expected.json", "observations.json", "completion.json", "checks", "proof.json"]);
|
|
141
|
+
if (readdirSync(evidence).some((name) => !allowed.has(name)))
|
|
142
|
+
coverage = note(coverage, "unexpected_evidence", "failed");
|
|
143
|
+
const checksRoot = safePath(evidence, "checks", true);
|
|
144
|
+
if (readdirSync(checksRoot).some((name) => !expected.manifest.checks.some((check) => check.id === name)))
|
|
145
|
+
coverage = note(coverage, "unexpected_evidence", "failed");
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
coverage = note(coverage, "missing_check_directory", "incomplete");
|
|
149
|
+
}
|
|
150
|
+
for (const check of expected.expectations.checks) {
|
|
151
|
+
try {
|
|
152
|
+
const record = ResultSchema.parse(JSON.parse(readBounded(evidence, check.artifact_path, 16 * 1024).toString("utf8")));
|
|
153
|
+
if (record.check_id !== check.check_id || record.attempt_id !== check.attempt_id
|
|
154
|
+
|| record.stdout.path !== `checks/${check.check_id}/stdout.log` || record.stderr.path !== `checks/${check.check_id}/stderr.log`) {
|
|
155
|
+
coverage = note(coverage, "result_ownership_mismatch", "failed", check.check_id);
|
|
156
|
+
}
|
|
157
|
+
if (record.reason !== "passed" || !record.cleanup_ok || record.exit_code !== 0 || record.signal !== null)
|
|
158
|
+
coverage = note(coverage, "command_failed", "failed", check.check_id);
|
|
159
|
+
if (record.source_before_sha256 !== expected.expectations.identity.source_sha256 || record.source_after_sha256 !== expected.expectations.identity.source_sha256)
|
|
160
|
+
coverage = note(coverage, "inputs_changed_during_run", "inapplicable", check.check_id);
|
|
161
|
+
for (const stream of [record.stdout, record.stderr]) {
|
|
162
|
+
const actual = fileFact(evidence, stream.path);
|
|
163
|
+
if (actual.sha256 !== stream.sha256 || actual.size_bytes !== stream.size_bytes)
|
|
164
|
+
coverage = note(coverage, "capture_integrity", "failed", check.check_id);
|
|
165
|
+
}
|
|
166
|
+
const names = readdirSync(safePath(evidence, `checks/${check.check_id}`, true));
|
|
167
|
+
if (names.some((name) => !["result.json", "stdout.log", "stderr.log"].includes(name)))
|
|
168
|
+
coverage = note(coverage, "unexpected_evidence", "failed", check.check_id);
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
coverage = note(coverage, error.code === "ENOENT" ? "missing_check_evidence" : "invalid_check_evidence", error.code === "ENOENT" ? "incomplete" : "failed", check.check_id);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
const project = realpathSync(resolve(options.project));
|
|
176
|
+
if (project !== expected.project || options.manifest !== expected.manifest_path || currentSource(project, options.manifest) !== expected.expectations.identity.source_sha256
|
|
177
|
+
|| process.version !== expected.node_version || runtimeDigest() !== expected.expectations.identity.build_sha256)
|
|
178
|
+
coverage = note(coverage, "current_identity_mismatch", "inapplicable");
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
coverage = note(coverage, "current_identity_unavailable", "inapplicable");
|
|
182
|
+
}
|
|
183
|
+
return finish(coverage);
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/project-verification/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { attachWorkflowVerification, WORKFLOW_VERIFICATION_VERSION } from "../../clinkx-workflows/dist/workflow-verification.js";
|
|
2
|
+
import { inspectProject, runProject, type Options } from "./runner.js";
|
|
3
|
+
export interface VerificationAttachment {
|
|
4
|
+
runId: string;
|
|
5
|
+
requestId: string;
|
|
6
|
+
pin: string;
|
|
7
|
+
runsRoot?: string;
|
|
8
|
+
}
|
|
9
|
+
/** Internal operations usable only while their owning service operation is active. */
|
|
10
|
+
export interface NativeVerificationOperations {
|
|
11
|
+
readonly signal: AbortSignal;
|
|
12
|
+
run(options: Options): ReturnType<typeof runProject>;
|
|
13
|
+
inspect(options: Options, originalPin: string): ReturnType<typeof inspectProject>;
|
|
14
|
+
attach(options: Options, input: VerificationAttachment): Promise<{
|
|
15
|
+
schema_version: typeof WORKFLOW_VERIFICATION_VERSION;
|
|
16
|
+
run_id: string;
|
|
17
|
+
status: ReturnType<typeof inspectProject>["status"];
|
|
18
|
+
verification: Awaited<ReturnType<typeof attachWorkflowVerification>>;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export declare function latchVerificationAdmissionForShutdown(): void;
|
|
22
|
+
export declare function shutdownVerificationTools(): Promise<void>;
|
|
23
|
+
/** One fail-fast native-verification slot shared by MCP controls and the repair host. */
|
|
24
|
+
export declare class ProjectVerificationService {
|
|
25
|
+
private readonly semaphore;
|
|
26
|
+
private readonly operations;
|
|
27
|
+
private closed;
|
|
28
|
+
constructor();
|
|
29
|
+
assertAdmission(signal?: AbortSignal): void;
|
|
30
|
+
latch(): void;
|
|
31
|
+
shutdown(): Promise<void>;
|
|
32
|
+
/** Await all commands and owned cleanup inside the callback before releasing the slot. */
|
|
33
|
+
operation<T>(callback: (native: NativeVerificationOperations) => T | Promise<T>, signal?: AbortSignal): Promise<T>;
|
|
34
|
+
run(options: Options, signal?: AbortSignal): ReturnType<typeof runProject>;
|
|
35
|
+
inspect(options: Options, originalPin: string, signal?: AbortSignal): Promise<ReturnType<typeof inspectProject>>;
|
|
36
|
+
attach(options: Options, input: VerificationAttachment, signal?: AbortSignal): ReturnType<NativeVerificationOperations["attach"]>;
|
|
37
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { realpathSync } from "node:fs";
|
|
2
|
+
import { basename, dirname, join } from "node:path";
|
|
3
|
+
import { isPathWithinAllowedRoots, parseAllowedRootsEnv } from "../allowed-roots.js";
|
|
4
|
+
import { Semaphore } from "../concurrency.js";
|
|
5
|
+
import { CancellationError, ExecutionError, InvalidParamsError } from "../errors.js";
|
|
6
|
+
import { getRunsDir } from "../../clinkx-workflows/dist/config.js";
|
|
7
|
+
import { attachWorkflowVerification, WORKFLOW_VERIFICATION_VERSION } from "../../clinkx-workflows/dist/workflow-verification.js";
|
|
8
|
+
import { ExpectedSchema } from "./contract.js";
|
|
9
|
+
import { inside, PACKAGE_ROOT, readBounded, sha } from "./files.js";
|
|
10
|
+
import { inspectProject, runProject } from "./runner.js";
|
|
11
|
+
function authorizedOptions(input, inspecting) {
|
|
12
|
+
try {
|
|
13
|
+
const project = realpathSync(input.project);
|
|
14
|
+
const evidence = inspecting ? realpathSync(input.evidence)
|
|
15
|
+
: join(realpathSync(dirname(input.evidence)), basename(input.evidence));
|
|
16
|
+
const sourceRoots = parseAllowedRootsEnv({ includeArtifactOnly: false, rejectBroadRoots: true });
|
|
17
|
+
const ioRoots = parseAllowedRootsEnv({ rejectBroadRoots: true });
|
|
18
|
+
if (!isPathWithinAllowedRoots(project, sourceRoots) || !isPathWithinAllowedRoots(evidence, ioRoots)
|
|
19
|
+
|| inside(project, evidence) || inside(PACKAGE_ROOT, evidence)) {
|
|
20
|
+
throw new InvalidParamsError("Project/evidence paths are not authorized: use a source allowed root and an I/O allowed root outside the project and installation.");
|
|
21
|
+
}
|
|
22
|
+
return { project, manifest: input.manifest, evidence };
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (error instanceof InvalidParamsError)
|
|
26
|
+
throw error;
|
|
27
|
+
throw new InvalidParamsError("Project or evidence path is unavailable; use absolute authorized paths and an existing evidence parent.");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const services = new Set();
|
|
31
|
+
let shuttingDown = false;
|
|
32
|
+
export function latchVerificationAdmissionForShutdown() {
|
|
33
|
+
shuttingDown = true;
|
|
34
|
+
for (const service of services)
|
|
35
|
+
service.latch();
|
|
36
|
+
}
|
|
37
|
+
export async function shutdownVerificationTools() {
|
|
38
|
+
latchVerificationAdmissionForShutdown();
|
|
39
|
+
await Promise.all([...services].map((service) => service.shutdown()));
|
|
40
|
+
}
|
|
41
|
+
/** One fail-fast native-verification slot shared by MCP controls and the repair host. */
|
|
42
|
+
export class ProjectVerificationService {
|
|
43
|
+
semaphore = new Semaphore(1);
|
|
44
|
+
operations = new Map();
|
|
45
|
+
closed = false;
|
|
46
|
+
constructor() { services.add(this); }
|
|
47
|
+
assertAdmission(signal) {
|
|
48
|
+
if (signal?.aborted)
|
|
49
|
+
throw new CancellationError();
|
|
50
|
+
if (this.closed || shuttingDown)
|
|
51
|
+
throw new ExecutionError("Verification controls are shutting down; no new operation was started.");
|
|
52
|
+
}
|
|
53
|
+
latch() {
|
|
54
|
+
this.closed = true;
|
|
55
|
+
for (const controller of this.operations.keys())
|
|
56
|
+
controller.abort();
|
|
57
|
+
}
|
|
58
|
+
async shutdown() {
|
|
59
|
+
this.latch();
|
|
60
|
+
try {
|
|
61
|
+
await Promise.allSettled(this.operations.values());
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
services.delete(this);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Await all commands and owned cleanup inside the callback before releasing the slot. */
|
|
68
|
+
async operation(callback, signal) {
|
|
69
|
+
this.assertAdmission(signal);
|
|
70
|
+
this.semaphore.acquire();
|
|
71
|
+
const controller = new AbortController();
|
|
72
|
+
const onAbort = () => controller.abort();
|
|
73
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
74
|
+
if (signal?.aborted)
|
|
75
|
+
controller.abort();
|
|
76
|
+
let active = true;
|
|
77
|
+
const check = () => {
|
|
78
|
+
if (controller.signal.aborted)
|
|
79
|
+
throw new CancellationError();
|
|
80
|
+
if (!active)
|
|
81
|
+
throw new ExecutionError("Native verification operation has already finished.");
|
|
82
|
+
};
|
|
83
|
+
const native = {
|
|
84
|
+
signal: controller.signal,
|
|
85
|
+
run: async (options) => {
|
|
86
|
+
check();
|
|
87
|
+
return await runProject(authorizedOptions(options, false), controller.signal);
|
|
88
|
+
},
|
|
89
|
+
inspect: (options, pin) => {
|
|
90
|
+
check();
|
|
91
|
+
return inspectProject(authorizedOptions(options, true), pin);
|
|
92
|
+
},
|
|
93
|
+
attach: async (input, attachment) => {
|
|
94
|
+
check();
|
|
95
|
+
const options = authorizedOptions(input, true);
|
|
96
|
+
const inspected = inspectProject(options, attachment.pin);
|
|
97
|
+
let identity = null;
|
|
98
|
+
let requiredChecks = null;
|
|
99
|
+
try {
|
|
100
|
+
const bytes = readBounded(options.evidence, "expected.json", 2 * 1024 * 1024);
|
|
101
|
+
if (sha(bytes) === attachment.pin) {
|
|
102
|
+
const expected = ExpectedSchema.parse(JSON.parse(bytes.toString("utf8")));
|
|
103
|
+
identity = expected.expectations.identity;
|
|
104
|
+
requiredChecks = expected.expectations.checks.length;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch { /* Unauthenticated expectations retain unknown identity/counts. */ }
|
|
108
|
+
const verification = await attachWorkflowVerification({ runsRoot: attachment.runsRoot ?? getRunsDir(),
|
|
109
|
+
runId: attachment.runId, requestId: attachment.requestId, pin: attachment.pin, evidence: options.evidence,
|
|
110
|
+
coverage: { status: inspected.status, checks: inspected.checks, reasons: inspected.reasons },
|
|
111
|
+
identity, requiredChecks, signal: controller.signal });
|
|
112
|
+
return { schema_version: WORKFLOW_VERIFICATION_VERSION, run_id: attachment.runId,
|
|
113
|
+
status: inspected.status, verification };
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
// Registration precedes callback dispatch, including synchronous failure and shutdown.
|
|
117
|
+
const operation = Promise.resolve().then(async () => {
|
|
118
|
+
check();
|
|
119
|
+
try {
|
|
120
|
+
const value = await callback(native);
|
|
121
|
+
check();
|
|
122
|
+
return value;
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (controller.signal.aborted || error instanceof CancellationError)
|
|
126
|
+
throw new CancellationError();
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
this.operations.set(controller, operation);
|
|
131
|
+
try {
|
|
132
|
+
return await operation;
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
active = false;
|
|
136
|
+
this.operations.delete(controller);
|
|
137
|
+
signal?.removeEventListener("abort", onAbort);
|
|
138
|
+
this.semaphore.release();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
run(options, signal) {
|
|
142
|
+
return this.operation((native) => native.run(options), signal);
|
|
143
|
+
}
|
|
144
|
+
inspect(options, originalPin, signal) {
|
|
145
|
+
return this.operation((native) => native.inspect(options, originalPin), signal);
|
|
146
|
+
}
|
|
147
|
+
attach(options, input, signal) {
|
|
148
|
+
return this.operation((native) => native.attach(options, input), signal);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/project-verification/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface ProviderDoctorAdapter {
|
|
2
|
+
readonly adapter: string | null;
|
|
3
|
+
readonly backend: string | null;
|
|
4
|
+
readonly roles: readonly string[];
|
|
5
|
+
readonly config: "ok" | "invalid";
|
|
6
|
+
readonly executable: "ok" | "missing" | "not_run";
|
|
7
|
+
readonly version: string;
|
|
8
|
+
readonly auth: "ok" | "failed" | "not_run";
|
|
9
|
+
readonly startup_required: readonly string[];
|
|
10
|
+
readonly registry?: "workflow_child";
|
|
11
|
+
readonly reason?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ProviderDoctorResult {
|
|
14
|
+
readonly version: 1;
|
|
15
|
+
readonly adapters: readonly ProviderDoctorAdapter[];
|
|
16
|
+
readonly verdict: "ready" | "blocked";
|
|
17
|
+
readonly blocked: readonly {
|
|
18
|
+
readonly adapter: string | null;
|
|
19
|
+
readonly reason: string;
|
|
20
|
+
}[];
|
|
21
|
+
}
|
|
22
|
+
export declare function runProviderDoctor(probes: readonly string[], signal: AbortSignal): Promise<ProviderDoctorResult>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CancellationError, InvalidParamsError } from "./errors.js";
|
|
2
|
+
export async function runProviderDoctor(probes, signal) {
|
|
3
|
+
if (signal.aborted)
|
|
4
|
+
throw new CancellationError();
|
|
5
|
+
if (!Array.isArray(probes) || probes.some((name) => typeof name !== "string" || name.trim() === "" || name !== name.trim())
|
|
6
|
+
|| new Set(probes).size !== probes.length) {
|
|
7
|
+
throw new InvalidParamsError("probes must be an array of unique nonempty adapter names");
|
|
8
|
+
}
|
|
9
|
+
const core = await import(new URL("../scripts/provider-doctor-core.mjs", import.meta.url).href);
|
|
10
|
+
try {
|
|
11
|
+
return await core.runDoctor(probes, signal);
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
if (signal.aborted)
|
|
15
|
+
throw new CancellationError();
|
|
16
|
+
if (error instanceof core.DoctorInputError) {
|
|
17
|
+
throw new InvalidParamsError("Requested probe adapter is not configured or does not support synchronous authentication probes; call provider_doctor without probes to inspect configured adapters.");
|
|
18
|
+
}
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=provider-doctor.js.map
|