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.
Files changed (162) hide show
  1. package/CHANGELOG.md +39 -1
  2. package/README.md +210 -177
  3. package/clinkx-workflows/dist/architecture-comparison/admission.d.ts +5 -0
  4. package/clinkx-workflows/dist/architecture-comparison/admission.js +50 -0
  5. package/clinkx-workflows/dist/architecture-comparison/admission.js.map +1 -0
  6. package/clinkx-workflows/dist/architecture-comparison/contract.d.ts +995 -0
  7. package/clinkx-workflows/dist/architecture-comparison/contract.js +149 -0
  8. package/clinkx-workflows/dist/architecture-comparison/contract.js.map +1 -0
  9. package/clinkx-workflows/dist/architecture-comparison/runtime.d.ts +29 -0
  10. package/clinkx-workflows/dist/architecture-comparison/runtime.js +387 -0
  11. package/clinkx-workflows/dist/architecture-comparison/runtime.js.map +1 -0
  12. package/clinkx-workflows/dist/contained-file.js +1 -1
  13. package/clinkx-workflows/dist/contained-file.js.map +1 -1
  14. package/clinkx-workflows/dist/council-execution-policy.d.ts +4 -2
  15. package/clinkx-workflows/dist/council-execution-policy.js +5 -1
  16. package/clinkx-workflows/dist/council-execution-policy.js.map +1 -1
  17. package/clinkx-workflows/dist/dashboard/activity-contract.d.ts +72 -72
  18. package/clinkx-workflows/dist/dashboard/contracts.d.ts +1564 -122
  19. package/clinkx-workflows/dist/dashboard/contracts.js +4 -0
  20. package/clinkx-workflows/dist/dashboard/contracts.js.map +1 -1
  21. package/clinkx-workflows/dist/dashboard/progress-report-contract.d.ts +12 -12
  22. package/clinkx-workflows/dist/dashboard/progress-report-status-overlay.d.ts +8 -8
  23. package/clinkx-workflows/dist/dashboard/scanner.d.ts +3 -0
  24. package/clinkx-workflows/dist/dashboard/scanner.js +27 -0
  25. package/clinkx-workflows/dist/dashboard/scanner.js.map +1 -1
  26. package/clinkx-workflows/dist/dashboard/session-log-contract.d.ts +48 -48
  27. package/clinkx-workflows/dist/dashboard/session-log-redaction.d.ts +2 -0
  28. package/clinkx-workflows/dist/dashboard/session-log-redaction.js +4 -0
  29. package/clinkx-workflows/dist/dashboard/session-log-redaction.js.map +1 -1
  30. package/clinkx-workflows/dist/dashboard/verified-repair-contract.d.ts +191 -0
  31. package/clinkx-workflows/dist/dashboard/verified-repair-contract.js +28 -0
  32. package/clinkx-workflows/dist/dashboard/verified-repair-contract.js.map +1 -0
  33. package/clinkx-workflows/dist/dashboard-ui/assets/index-BdpmbPps.js +115 -0
  34. package/clinkx-workflows/dist/dashboard-ui/assets/style-Im5i1iAs.css +1 -0
  35. package/clinkx-workflows/dist/dashboard-ui/index.html +2 -2
  36. package/clinkx-workflows/dist/engine.d.ts +6 -0
  37. package/clinkx-workflows/dist/engine.js +78 -7
  38. package/clinkx-workflows/dist/engine.js.map +1 -1
  39. package/clinkx-workflows/dist/index.d.ts +3 -0
  40. package/clinkx-workflows/dist/index.js +3 -2
  41. package/clinkx-workflows/dist/index.js.map +1 -1
  42. package/clinkx-workflows/dist/reducers/index.d.ts +9 -1
  43. package/clinkx-workflows/dist/reducers/index.js +22 -0
  44. package/clinkx-workflows/dist/reducers/index.js.map +1 -1
  45. package/clinkx-workflows/dist/state.js +17 -7
  46. package/clinkx-workflows/dist/state.js.map +1 -1
  47. package/clinkx-workflows/dist/validators/architecture-comparison.d.ts +2 -0
  48. package/clinkx-workflows/dist/validators/architecture-comparison.js +12 -0
  49. package/clinkx-workflows/dist/validators/architecture-comparison.js.map +1 -0
  50. package/clinkx-workflows/dist/validators/index.js +4 -0
  51. package/clinkx-workflows/dist/validators/index.js.map +1 -1
  52. package/clinkx-workflows/dist/validators/verified-repair.d.ts +2 -0
  53. package/clinkx-workflows/dist/validators/verified-repair.js +12 -0
  54. package/clinkx-workflows/dist/validators/verified-repair.js.map +1 -0
  55. package/clinkx-workflows/dist/verification-proof.d.ts +254 -0
  56. package/clinkx-workflows/dist/verification-proof.js +195 -0
  57. package/clinkx-workflows/dist/verification-proof.js.map +1 -0
  58. package/clinkx-workflows/dist/verified-repair/admission.d.ts +72 -0
  59. package/clinkx-workflows/dist/verified-repair/admission.js +63 -0
  60. package/clinkx-workflows/dist/verified-repair/admission.js.map +1 -0
  61. package/clinkx-workflows/dist/verified-repair/contract.d.ts +1910 -0
  62. package/clinkx-workflows/dist/verified-repair/contract.js +127 -0
  63. package/clinkx-workflows/dist/verified-repair/contract.js.map +1 -0
  64. package/clinkx-workflows/dist/verified-repair/host.d.ts +32 -0
  65. package/clinkx-workflows/dist/verified-repair/host.js +2 -0
  66. package/clinkx-workflows/dist/verified-repair/host.js.map +1 -0
  67. package/clinkx-workflows/dist/verified-repair/prompts.d.ts +12 -0
  68. package/clinkx-workflows/dist/verified-repair/prompts.js +58 -0
  69. package/clinkx-workflows/dist/verified-repair/prompts.js.map +1 -0
  70. package/clinkx-workflows/dist/verified-repair/result.d.ts +16 -0
  71. package/clinkx-workflows/dist/verified-repair/result.js +102 -0
  72. package/clinkx-workflows/dist/verified-repair/result.js.map +1 -0
  73. package/clinkx-workflows/dist/verified-repair/runtime.d.ts +28 -0
  74. package/clinkx-workflows/dist/verified-repair/runtime.js +186 -0
  75. package/clinkx-workflows/dist/verified-repair/runtime.js.map +1 -0
  76. package/clinkx-workflows/dist/workflow-tools.d.ts +3 -0
  77. package/clinkx-workflows/dist/workflow-tools.js +148 -14
  78. package/clinkx-workflows/dist/workflow-tools.js.map +1 -1
  79. package/clinkx-workflows/dist/workflow-verification-contract.d.ts +539 -0
  80. package/clinkx-workflows/dist/workflow-verification-contract.js +52 -0
  81. package/clinkx-workflows/dist/workflow-verification-contract.js.map +1 -0
  82. package/clinkx-workflows/dist/workflow-verification.d.ts +15 -0
  83. package/clinkx-workflows/dist/workflow-verification.js +218 -0
  84. package/clinkx-workflows/dist/workflow-verification.js.map +1 -0
  85. package/clinkx-workflows/templates/architecture-comparison/candidate.txt +29 -0
  86. package/clinkx-workflows/templates/architecture-comparison/judge.txt +31 -0
  87. package/clinkx-workflows/templates/verified-repair/investigate.txt +20 -0
  88. package/clinkx-workflows/templates/verified-repair/repair.txt +11 -0
  89. package/clinkx-workflows/templates/verified-repair/review.txt +18 -0
  90. package/clinkx-workflows/workflows/architecture-comparison.yaml +133 -0
  91. package/clinkx-workflows/workflows/verified-repair.yaml +104 -0
  92. package/dist/allowed-roots.js +4 -1
  93. package/dist/allowed-roots.js.map +1 -1
  94. package/dist/codex/app-server-client.d.ts +1 -0
  95. package/dist/codex/app-server-client.js +3 -2
  96. package/dist/codex/app-server-client.js.map +1 -1
  97. package/dist/context-builder/diagnostics.d.ts +1 -0
  98. package/dist/context-builder/diagnostics.js +1 -1
  99. package/dist/context-builder/diagnostics.js.map +1 -1
  100. package/dist/context-builder/discovery.d.ts +18 -1
  101. package/dist/context-builder/discovery.js +69 -1
  102. package/dist/context-builder/discovery.js.map +1 -1
  103. package/dist/context-builder/handler.js +8 -1
  104. package/dist/context-builder/handler.js.map +1 -1
  105. package/dist/context-builder/lifecycle-contract.d.ts +24 -24
  106. package/dist/context-builder/refine-handler.js +16 -1
  107. package/dist/context-builder/refine-handler.js.map +1 -1
  108. package/dist/context-builder/secrets.d.ts +11 -0
  109. package/dist/context-builder/secrets.js +81 -1
  110. package/dist/context-builder/secrets.js.map +1 -1
  111. package/dist/context-builder/versions.d.ts +5 -2
  112. package/dist/context-builder/versions.js +5 -2
  113. package/dist/context-builder/versions.js.map +1 -1
  114. package/dist/dashboard-cli.js +10 -3
  115. package/dist/dashboard-cli.js.map +1 -1
  116. package/dist/dashboard-gateway/main.js +8 -3
  117. package/dist/dashboard-gateway/main.js.map +1 -1
  118. package/dist/index.d.ts +2 -0
  119. package/dist/index.js +8 -2
  120. package/dist/index.js.map +1 -1
  121. package/dist/project-verification/contract.d.ts +537 -0
  122. package/dist/project-verification/contract.js +40 -0
  123. package/dist/project-verification/contract.js.map +1 -0
  124. package/dist/project-verification/files.d.ts +23 -0
  125. package/dist/project-verification/files.js +80 -0
  126. package/dist/project-verification/files.js.map +1 -0
  127. package/dist/project-verification/process.d.ts +7 -0
  128. package/dist/project-verification/process.js +115 -0
  129. package/dist/project-verification/process.js.map +1 -0
  130. package/dist/project-verification/runner.d.ts +35 -0
  131. package/dist/project-verification/runner.js +185 -0
  132. package/dist/project-verification/runner.js.map +1 -0
  133. package/dist/project-verification/service.d.ts +37 -0
  134. package/dist/project-verification/service.js +151 -0
  135. package/dist/project-verification/service.js.map +1 -0
  136. package/dist/provider-doctor.d.ts +22 -0
  137. package/dist/provider-doctor.js +22 -0
  138. package/dist/provider-doctor.js.map +1 -0
  139. package/dist/server.js +29 -1
  140. package/dist/server.js.map +1 -1
  141. package/dist/verification-tools.d.ts +90 -0
  142. package/dist/verification-tools.js +120 -0
  143. package/dist/verification-tools.js.map +1 -0
  144. package/dist/verified-repair/files.d.ts +22 -0
  145. package/dist/verified-repair/files.js +114 -0
  146. package/dist/verified-repair/files.js.map +1 -0
  147. package/dist/verified-repair/host.d.ts +14 -0
  148. package/dist/verified-repair/host.js +612 -0
  149. package/dist/verified-repair/host.js.map +1 -0
  150. package/docs/configuration.md +493 -0
  151. package/docs/engineering-recipes.md +415 -0
  152. package/docs/security.md +293 -0
  153. package/docs/verification/README.md +59 -0
  154. package/docs/verification/dashboard-real-disk.md +436 -0
  155. package/docs/verification/project-checks.example.json +14 -0
  156. package/docs/verification/project-checks.md +444 -0
  157. package/docs/verification/workflow-handoff.md +113 -0
  158. package/package.json +13 -6
  159. package/scripts/provider-doctor-core.mjs +364 -0
  160. package/scripts/provider-doctor-probe.mjs +34 -0
  161. package/clinkx-workflows/dist/dashboard-ui/assets/index-JPHQVtn9.js +0 -106
  162. 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