@claudexor/core 1.0.1 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter.d.ts +14 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/answer-assembly.d.ts +22 -0
- package/dist/answer-assembly.d.ts.map +1 -0
- package/dist/answer-assembly.js +55 -0
- package/dist/answer-assembly.js.map +1 -0
- package/dist/attachment-integrity.d.ts +4 -0
- package/dist/attachment-integrity.d.ts.map +1 -0
- package/dist/attachment-integrity.js +12 -0
- package/dist/attachment-integrity.js.map +1 -0
- package/dist/auth-capability-verifier.d.ts +42 -0
- package/dist/auth-capability-verifier.d.ts.map +1 -0
- package/dist/auth-capability-verifier.js +417 -0
- package/dist/auth-capability-verifier.js.map +1 -0
- package/dist/auth-readiness.d.ts +24 -0
- package/dist/auth-readiness.d.ts.map +1 -0
- package/dist/auth-readiness.js +34 -0
- package/dist/auth-readiness.js.map +1 -0
- package/dist/browser-mcp-launcher.d.ts +3 -0
- package/dist/browser-mcp-launcher.d.ts.map +1 -0
- package/dist/browser-mcp-launcher.js +18 -0
- package/dist/browser-mcp-launcher.js.map +1 -0
- package/dist/browser-mcp.d.ts +10 -16
- package/dist/browser-mcp.d.ts.map +1 -1
- package/dist/browser-mcp.js +20 -23
- package/dist/browser-mcp.js.map +1 -1
- package/dist/capabilities.d.ts +0 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +0 -3
- package/dist/capabilities.js.map +1 -1
- package/dist/conformance.d.ts +43 -0
- package/dist/conformance.d.ts.map +1 -1
- package/dist/conformance.js +67 -1
- package/dist/conformance.js.map +1 -1
- package/dist/diff.d.ts +9 -0
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +18 -3
- package/dist/diff.js.map +1 -1
- package/dist/doctor.d.ts +13 -2
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +88 -9
- package/dist/doctor.js.map +1 -1
- package/dist/effort.d.ts.map +1 -1
- package/dist/effort.js +2 -1
- package/dist/effort.js.map +1 -1
- package/dist/env-scope.d.ts.map +1 -1
- package/dist/env-scope.js +15 -0
- package/dist/env-scope.js.map +1 -1
- package/dist/executable-inspection.d.ts +52 -0
- package/dist/executable-inspection.d.ts.map +1 -0
- package/dist/executable-inspection.js +83 -0
- package/dist/executable-inspection.js.map +1 -0
- package/dist/inactivity.d.ts.map +1 -1
- package/dist/inactivity.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +10 -0
- package/dist/instructions.d.ts.map +1 -0
- package/dist/instructions.js +14 -0
- package/dist/instructions.js.map +1 -0
- package/dist/isolation-locator.d.ts +21 -0
- package/dist/isolation-locator.d.ts.map +1 -0
- package/dist/isolation-locator.js +55 -0
- package/dist/isolation-locator.js.map +1 -0
- package/dist/native/claudexor-process-identity +0 -0
- package/dist/proc.d.ts +32 -0
- package/dist/proc.d.ts.map +1 -1
- package/dist/proc.js +50 -0
- package/dist/proc.js.map +1 -1
- package/dist/process-group.d.ts +67 -0
- package/dist/process-group.d.ts.map +1 -0
- package/dist/process-group.js +107 -0
- package/dist/process-group.js.map +1 -0
- package/dist/process-identity.d.ts +65 -0
- package/dist/process-identity.d.ts.map +1 -0
- package/dist/process-identity.js +209 -0
- package/dist/process-identity.js.map +1 -0
- package/dist/process-registry.d.ts +17 -5
- package/dist/process-registry.d.ts.map +1 -1
- package/dist/process-registry.js +8 -3
- package/dist/process-registry.js.map +1 -1
- package/dist/runloop.d.ts.map +1 -1
- package/dist/runloop.js +1 -0
- package/dist/runloop.js.map +1 -1
- package/dist/runtime-env.d.ts +8 -0
- package/dist/runtime-env.d.ts.map +1 -1
- package/dist/runtime-env.js +48 -4
- package/dist/runtime-env.js.map +1 -1
- package/package.json +9 -3
package/dist/adapter.d.ts
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
import type { AuthPreference, ConformanceReport, HarnessEvent, HarnessManifest, HarnessModel, HarnessRunSpec, InteractionAnswerSet, InteractionRequest } from "@claudexor/schema";
|
|
1
|
+
import type { AuthPreference, AuthSourceKind, ConformanceReport, CredentialProfile, CredentialProfileStatus, HarnessEvent, HarnessManifest, HarnessModel, HarnessRunSpec, InteractionAnswerSet, InteractionRequest } from "@claudexor/schema";
|
|
2
2
|
export interface DoctorSpec {
|
|
3
3
|
cwd: string;
|
|
4
4
|
/** Optional scoped env for probes that must mirror a concrete run route. */
|
|
5
5
|
env?: Record<string, string | null | undefined>;
|
|
6
6
|
/** Optional auth route preference for probes that must mirror a concrete run route. */
|
|
7
7
|
authPreference?: AuthPreference;
|
|
8
|
+
/** Bypass every readiness cache for this probe without reading, writing, or clearing shared cache state. */
|
|
9
|
+
fresh?: boolean;
|
|
10
|
+
/** Probe only this concrete auth source; adapters must not verify unrelated routes. */
|
|
11
|
+
authSource?: AuthSourceKind;
|
|
12
|
+
/** Cancels active vendor probes. This runtime-only value is never part of a cache key. */
|
|
13
|
+
abortSignal?: AbortSignal;
|
|
8
14
|
}
|
|
9
15
|
/**
|
|
10
16
|
* The contract every harness adapter implements. Adapters translate a native
|
|
@@ -30,6 +36,13 @@ export interface HarnessAdapter {
|
|
|
30
36
|
models?(spec?: DoctorSpec): Promise<HarnessModel[]>;
|
|
31
37
|
/** Optional cancellation. */
|
|
32
38
|
cancel?(sessionId: string): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Optional per-profile readiness probe (INV-135): the doctor projection for
|
|
41
|
+
* one credential profile, without asserting anything about other routes.
|
|
42
|
+
* Adapters that support no profile transport simply omit it — the service
|
|
43
|
+
* layer reports `unknown` availability for their profiles.
|
|
44
|
+
*/
|
|
45
|
+
probeCredentialProfile?(profile: CredentialProfile, abortSignal?: AbortSignal): Promise<CredentialProfileStatus>;
|
|
33
46
|
}
|
|
34
47
|
/** A registry of available adapters keyed by harness id. */
|
|
35
48
|
export type AdapterRegistry = Map<string, HarnessAdapter>;
|
package/dist/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAChD,uFAAuF;IACvF,cAAc,CAAC,EAAE,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAChD,uFAAuF;IACvF,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,4GAA4G;IAC5G,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uFAAuF;IACvF,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,0FAA0F;IAC1F,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,iEAAiE;IACjE,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAErC,yEAAyE;IACzE,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAErD,+CAA+C;IAC/C,GAAG,CAAC,IAAI,EAAE,cAAc,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAEvD,2EAA2E;IAC3E,MAAM,CAAC,CAAC,IAAI,EAAE,cAAc,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAE3D;;;;;OAKG;IACH,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAEpD,6BAA6B;IAC7B,MAAM,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C;;;;;OAKG;IACH,sBAAsB,CAAC,CACrB,OAAO,EAAE,iBAAiB,EAC1B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,uBAAuB,CAAC,CAAC;CACrC;AAED,4DAA4D;AAC5D,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAE1D;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IACvE;kFAC8E;IAC9E,YAAY,CAAC,IAAI,MAAM,CAAC;CACzB;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,cAAc,GAAG,kBAAkB,GAAG,SAAS,CAK/F"}
|
package/dist/adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AA8FA,MAAM,UAAU,0BAA0B,CAAC,IAAoB;IAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,oBAAoB,CAAC,CAAC;IACnD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,SAAS,GAAG,OAAsC,CAAC;IACzD,OAAO,OAAO,SAAS,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAE,OAA8B,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Answer assembly with TYPED finality (W-C1): a harness's `final` message
|
|
3
|
+
* (claude/cursor terminal `result`, codex's finalized last agent message) IS
|
|
4
|
+
* the answer, verbatim — mid-run narration never bleeds into it. The joined
|
|
5
|
+
* narration remains the fallback for adapters/versions without the marker.
|
|
6
|
+
*/
|
|
7
|
+
export declare class AnswerAssembly {
|
|
8
|
+
private readonly parts;
|
|
9
|
+
private finalText?;
|
|
10
|
+
/** Feed one already-sanitized harness event; non-answer events are ignored. */
|
|
11
|
+
observe(ev: {
|
|
12
|
+
type: string;
|
|
13
|
+
text?: string;
|
|
14
|
+
final?: boolean;
|
|
15
|
+
payload?: Record<string, unknown>;
|
|
16
|
+
}): void;
|
|
17
|
+
/** Whether a typed final answer has been accepted. */
|
|
18
|
+
hasFinal(): boolean;
|
|
19
|
+
/** The assembled answer: the typed final verbatim, else joined narration. */
|
|
20
|
+
text(): string;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=answer-assembly.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answer-assembly.d.ts","sourceRoot":"","sources":["../src/answer-assembly.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,SAAS,CAAC,CAAS;IAE3B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,GAAG,IAAI;IAiBR,sDAAsD;IACtD,QAAQ,IAAI,OAAO;IAInB,6EAA6E;IAC7E,IAAI,IAAI,MAAM;CAGf"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Answer assembly with TYPED finality (W-C1): a harness's `final` message
|
|
3
|
+
* (claude/cursor terminal `result`, codex's finalized last agent message) IS
|
|
4
|
+
* the answer, verbatim — mid-run narration never bleeds into it. The joined
|
|
5
|
+
* narration remains the fallback for adapters/versions without the marker.
|
|
6
|
+
*/
|
|
7
|
+
export class AnswerAssembly {
|
|
8
|
+
parts = [];
|
|
9
|
+
finalText;
|
|
10
|
+
/** Feed one already-sanitized harness event; non-answer events are ignored. */
|
|
11
|
+
observe(ev) {
|
|
12
|
+
if (ev.type !== "message" || !ev.text)
|
|
13
|
+
return;
|
|
14
|
+
if (ev.payload?.["auth_switched"] === true)
|
|
15
|
+
return;
|
|
16
|
+
// Live deltas are DISPLAY-stream chunks (W-C4): the complete message
|
|
17
|
+
// always follows — joining chunks here would shred the answer.
|
|
18
|
+
if (ev.payload?.["delta"] === true)
|
|
19
|
+
return;
|
|
20
|
+
if (ev.final === true) {
|
|
21
|
+
// A whitespace-only final is NOT an answer: ignore it, never let it
|
|
22
|
+
// erase an earlier real final (review sol #3). The accepted final is
|
|
23
|
+
// kept VERBATIM (the documented contract) — no trimming.
|
|
24
|
+
if (ev.text.trim().length === 0)
|
|
25
|
+
return;
|
|
26
|
+
this.finalText = ev.text;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
pushUniqueText(this.parts, ev.text);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Whether a typed final answer has been accepted. */
|
|
33
|
+
hasFinal() {
|
|
34
|
+
return this.finalText !== undefined;
|
|
35
|
+
}
|
|
36
|
+
/** The assembled answer: the typed final verbatim, else joined narration. */
|
|
37
|
+
text() {
|
|
38
|
+
return this.finalText ?? this.parts.join("\n").trim();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Deduplicate the known "final result repeats the last streamed message" shape
|
|
43
|
+
* (adjacent only). Legitimately repeated earlier messages are preserved — a
|
|
44
|
+
* whole-array dedupe would silently merge real output.
|
|
45
|
+
*/
|
|
46
|
+
function pushUniqueText(parts, text) {
|
|
47
|
+
const normalized = text.trim();
|
|
48
|
+
if (!normalized)
|
|
49
|
+
return;
|
|
50
|
+
const last = parts[parts.length - 1]?.trim();
|
|
51
|
+
if (last === normalized)
|
|
52
|
+
return;
|
|
53
|
+
parts.push(normalized);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=answer-assembly.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answer-assembly.js","sourceRoot":"","sources":["../src/answer-assembly.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IACR,KAAK,GAAa,EAAE,CAAC;IAC9B,SAAS,CAAU;IAE3B,+EAA+E;IAC/E,OAAO,CAAC,EAKP;QACC,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,IAAI;YAAE,OAAO;QAC9C,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,KAAK,IAAI;YAAE,OAAO;QACnD,qEAAqE;QACrE,+DAA+D;QAC/D,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI;YAAE,OAAO;QAC3C,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACtB,oEAAoE;YACpE,qEAAqE;YACrE,yDAAyD;YACzD,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YACxC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,QAAQ;QACN,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC;IACtC,CAAC;IAED,6EAA6E;IAC7E,IAAI;QACF,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,CAAC;CACF;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,KAAe,EAAE,IAAY;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,UAAU;QAAE,OAAO;IACxB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAC7C,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO;IAChC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Attachment } from "@claudexor/schema";
|
|
2
|
+
/** Read once and bind the adapter payload to the finalized daemon resource digest. */
|
|
3
|
+
export declare function readVerifiedAttachmentBytes(attachment: Attachment): Buffer;
|
|
4
|
+
//# sourceMappingURL=attachment-integrity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-integrity.d.ts","sourceRoot":"","sources":["../src/attachment-integrity.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,sFAAsF;AACtF,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAU1E"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
/** Read once and bind the adapter payload to the finalized daemon resource digest. */
|
|
4
|
+
export function readVerifiedAttachmentBytes(attachment) {
|
|
5
|
+
const bytes = readFileSync(attachment.path);
|
|
6
|
+
const digest = `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
|
|
7
|
+
if (bytes.length !== attachment.size_bytes || digest !== attachment.sha256) {
|
|
8
|
+
throw Object.assign(new Error(`attachment bytes no longer match resource ${attachment.resource_id}`), { code: "attachment_digest_mismatch" });
|
|
9
|
+
}
|
|
10
|
+
return bytes;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=attachment-integrity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-integrity.js","sourceRoot":"","sources":["../src/attachment-integrity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,sFAAsF;AACtF,MAAM,UAAU,2BAA2B,CAAC,UAAsB;IAChE,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5E,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,UAAU,IAAI,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;QAC3E,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,KAAK,CAAC,6CAA6C,UAAU,CAAC,WAAW,EAAE,CAAC,EAChF,EAAE,IAAI,EAAE,4BAA4B,EAAE,CACvC,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type AuthCapabilityBinding as AuthCapabilityBindingType, type AuthCapabilityReceipt as AuthCapabilityReceiptType, type AuthRequest, type AuthSmokeDisclosure as AuthSmokeDisclosureType, type AuthSourceKind, type CredentialRoute } from "@claudexor/schema";
|
|
2
|
+
import type { AdapterRegistry, HarnessAdapter } from "./adapter.js";
|
|
3
|
+
export interface AuthCapabilityPreparationRequest {
|
|
4
|
+
attemptId: string;
|
|
5
|
+
harness: string;
|
|
6
|
+
requested: AuthRequest;
|
|
7
|
+
requiredRoute: CredentialRoute;
|
|
8
|
+
requiredSource: AuthSourceKind;
|
|
9
|
+
}
|
|
10
|
+
export interface AuthCapabilityPreparation {
|
|
11
|
+
binding: AuthCapabilityBindingType;
|
|
12
|
+
}
|
|
13
|
+
export interface AuthCapabilityVerificationRequest {
|
|
14
|
+
binding: AuthCapabilityBindingType;
|
|
15
|
+
startedAt: string;
|
|
16
|
+
abortSignal?: AbortSignal;
|
|
17
|
+
}
|
|
18
|
+
export interface AuthCapabilityVerifierDeps {
|
|
19
|
+
now?: () => Date;
|
|
20
|
+
receiptId?: () => string;
|
|
21
|
+
scratchRoot?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Executes one ordinary adapter run and reduces only typed normalized events
|
|
25
|
+
* into a redacted exact-route receipt. It owns an external scratch tree, never
|
|
26
|
+
* discovers a second adapter, and never persists model output.
|
|
27
|
+
*/
|
|
28
|
+
export declare class AuthCapabilityVerifier {
|
|
29
|
+
private readonly adapter;
|
|
30
|
+
private readonly now;
|
|
31
|
+
private readonly receiptId;
|
|
32
|
+
private readonly scratchRoot;
|
|
33
|
+
constructor(adapter: (id: string) => HarnessAdapter | undefined, deps?: AuthCapabilityVerifierDeps);
|
|
34
|
+
static fromRegistry(registry: AdapterRegistry, deps?: AuthCapabilityVerifierDeps): AuthCapabilityVerifier;
|
|
35
|
+
disclosure(harness: string, requested: AuthRequest, requiredRoute: CredentialRoute, requiredSource: AuthSourceKind): AuthSmokeDisclosureType;
|
|
36
|
+
prepare(request: AuthCapabilityPreparationRequest): AuthCapabilityPreparation;
|
|
37
|
+
verify(request: AuthCapabilityVerificationRequest): Promise<AuthCapabilityReceiptType>;
|
|
38
|
+
/** Remove only the verifier-owned directory for a validated durable attempt. */
|
|
39
|
+
cleanup(attemptId: string): void;
|
|
40
|
+
private createScratch;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=auth-capability-verifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-capability-verifier.d.ts","sourceRoot":"","sources":["../src/auth-capability-verifier.ts"],"names":[],"mappings":"AAgBA,OAAO,EAML,KAAK,qBAAqB,IAAI,yBAAyB,EACvD,KAAK,qBAAqB,IAAI,yBAAyB,EACvD,KAAK,WAAW,EAChB,KAAK,mBAAmB,IAAI,uBAAuB,EACnD,KAAK,cAAc,EACnB,KAAK,eAAe,EAErB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMpE,MAAM,WAAW,gCAAgC;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,WAAW,CAAC;IACvB,aAAa,EAAE,eAAe,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,yBAAyB,CAAC;CACpC;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,EAAE,yBAAyB,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,qBAAa,sBAAsB;IAM/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAGlB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,cAAc,GAAG,SAAS,EACpE,IAAI,GAAE,0BAA+B;IASvC,MAAM,CAAC,YAAY,CACjB,QAAQ,EAAE,eAAe,EACzB,IAAI,GAAE,0BAA+B,GACpC,sBAAsB;IAIzB,UAAU,CACR,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,WAAW,EACtB,aAAa,EAAE,eAAe,EAC9B,cAAc,EAAE,cAAc,GAC7B,uBAAuB;IAgB1B,OAAO,CAAC,OAAO,EAAE,gCAAgC,GAAG,yBAAyB;IAmBvE,MAAM,CAAC,OAAO,EAAE,iCAAiC,GAAG,OAAO,CAAC,yBAAyB,CAAC;IA2P5F,gFAAgF;IAChF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAkBhC,OAAO,CAAC,aAAa;CAYtB"}
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { chmodSync, existsSync, lstatSync, mkdirSync, openSync, readSync, readdirSync, readlinkSync, realpathSync, rmSync, closeSync, } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join, relative, resolve, sep } from "node:path";
|
|
5
|
+
import { AuthCapabilityBinding, AuthCapabilityReceipt, AuthSmokeDisclosure, HarnessEvent, HarnessRunSpec as HarnessRunSpecSchema, } from "@claudexor/schema";
|
|
6
|
+
import { ensureCanonicalPrivateDirectory } from "@claudexor/util";
|
|
7
|
+
import { AnswerAssembly } from "./answer-assembly.js";
|
|
8
|
+
const MAX_RESPONSE_CHARS = 4_096;
|
|
9
|
+
const ATTEMPT_ID = /^[A-Za-z0-9-]+$/;
|
|
10
|
+
/**
|
|
11
|
+
* Executes one ordinary adapter run and reduces only typed normalized events
|
|
12
|
+
* into a redacted exact-route receipt. It owns an external scratch tree, never
|
|
13
|
+
* discovers a second adapter, and never persists model output.
|
|
14
|
+
*/
|
|
15
|
+
export class AuthCapabilityVerifier {
|
|
16
|
+
adapter;
|
|
17
|
+
now;
|
|
18
|
+
receiptId;
|
|
19
|
+
scratchRoot;
|
|
20
|
+
constructor(adapter, deps = {}) {
|
|
21
|
+
this.adapter = adapter;
|
|
22
|
+
this.now = deps.now ?? (() => new Date());
|
|
23
|
+
this.receiptId = deps.receiptId ?? (() => `authcap-${randomUUID()}`);
|
|
24
|
+
this.scratchRoot = resolve(deps.scratchRoot ?? join(realpathSync(tmpdir()), "claudexor-auth-smokes"));
|
|
25
|
+
}
|
|
26
|
+
static fromRegistry(registry, deps = {}) {
|
|
27
|
+
return new AuthCapabilityVerifier((id) => registry.get(id), deps);
|
|
28
|
+
}
|
|
29
|
+
disclosure(harness, requested, requiredRoute, requiredSource) {
|
|
30
|
+
return AuthSmokeDisclosure.parse({
|
|
31
|
+
schemaVersion: 1,
|
|
32
|
+
protocolVersion: 1,
|
|
33
|
+
harness,
|
|
34
|
+
requested,
|
|
35
|
+
requiredRoute,
|
|
36
|
+
requiredSource,
|
|
37
|
+
networkScope: "selected_harness_only",
|
|
38
|
+
billingKnowledge: "unknown",
|
|
39
|
+
incrementalCostKnowledge: "unknown",
|
|
40
|
+
mayConsumeQuota: true,
|
|
41
|
+
generatedAt: this.now().toISOString(),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
prepare(request) {
|
|
45
|
+
if (!ATTEMPT_ID.test(request.attemptId))
|
|
46
|
+
throw new Error("invalid auth capability attempt id");
|
|
47
|
+
const disclosure = this.disclosure(request.harness, request.requested, request.requiredRoute, request.requiredSource);
|
|
48
|
+
const challengeDigest = sha256(challengeFor(request.attemptId));
|
|
49
|
+
return {
|
|
50
|
+
binding: AuthCapabilityBinding.parse({
|
|
51
|
+
attemptId: request.attemptId,
|
|
52
|
+
challengeDigest,
|
|
53
|
+
requestDigest: capabilityRequestDigest(disclosure, challengeDigest),
|
|
54
|
+
disclosure,
|
|
55
|
+
}),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async verify(request) {
|
|
59
|
+
const binding = AuthCapabilityBinding.parse(request.binding);
|
|
60
|
+
const disclosure = binding.disclosure;
|
|
61
|
+
const expected = challengeFor(binding.attemptId);
|
|
62
|
+
const requestMismatch = binding.challengeDigest !== sha256(expected) ||
|
|
63
|
+
binding.requestDigest !== capabilityRequestDigest(disclosure, binding.challengeDigest);
|
|
64
|
+
const streamHash = createHash("sha256");
|
|
65
|
+
// The challenge answer follows the engine's typed-finality semantics
|
|
66
|
+
// (AnswerAssembly, W-C1): harnesses narrate the answer mid-run and then
|
|
67
|
+
// repeat it as their typed `final` message — concatenating both would
|
|
68
|
+
// false-fail every compliant run with "expected+expected".
|
|
69
|
+
const answer = new AnswerAssembly();
|
|
70
|
+
let narrationChars = 0;
|
|
71
|
+
let narrationTruncated = false;
|
|
72
|
+
let effective = null;
|
|
73
|
+
let effectiveSource = null;
|
|
74
|
+
let routeConflict = false;
|
|
75
|
+
let sourceConflict = false;
|
|
76
|
+
let startedEvents = 0;
|
|
77
|
+
let completedEvents = 0;
|
|
78
|
+
let errorEvents = 0;
|
|
79
|
+
let unexpectedToolEvents = 0;
|
|
80
|
+
let interactionEvents = 0;
|
|
81
|
+
let sessionMismatchEvents = 0;
|
|
82
|
+
let eventsAfterCompleted = 0;
|
|
83
|
+
let protocolViolation = false;
|
|
84
|
+
let adapterFailed = false;
|
|
85
|
+
let adapterMissing = false;
|
|
86
|
+
let adapterIdentityMismatch = false;
|
|
87
|
+
let cancelled = request.abortSignal?.aborted === true;
|
|
88
|
+
let terminalSeen = false;
|
|
89
|
+
const evidence = new Set();
|
|
90
|
+
const noScratchDigest = sha256("scratch:not-created");
|
|
91
|
+
let scratchBeforeDigest = noScratchDigest;
|
|
92
|
+
let scratchAfterDigest = noScratchDigest;
|
|
93
|
+
let scratchPath = null;
|
|
94
|
+
let adapter;
|
|
95
|
+
if (!requestMismatch) {
|
|
96
|
+
try {
|
|
97
|
+
adapter = this.adapter(disclosure.harness);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
adapterFailed = true;
|
|
101
|
+
evidence.add("adapter:lookup_threw");
|
|
102
|
+
}
|
|
103
|
+
if (!adapter && !adapterFailed)
|
|
104
|
+
adapterMissing = true;
|
|
105
|
+
if (adapter && adapter.id !== disclosure.harness) {
|
|
106
|
+
adapterIdentityMismatch = true;
|
|
107
|
+
evidence.add("adapter:identity_mismatch");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (adapter && !adapterIdentityMismatch && !adapterFailed && !requestMismatch && !cancelled) {
|
|
111
|
+
try {
|
|
112
|
+
scratchPath = this.createScratch(binding.attemptId);
|
|
113
|
+
scratchBeforeDigest = fingerprintTree(scratchPath);
|
|
114
|
+
const spec = HarnessRunSpecSchema.parse({
|
|
115
|
+
session_id: `auth-smoke-${binding.attemptId}`,
|
|
116
|
+
intent: "explain",
|
|
117
|
+
prompt: `Return exactly ${expected} and no other text. Do not call tools.`,
|
|
118
|
+
cwd: scratchPath,
|
|
119
|
+
access: "readonly",
|
|
120
|
+
external_context_policy: "off",
|
|
121
|
+
tool_permission_policy: { web: "off", allow: [], deny: [] },
|
|
122
|
+
model_hint: null,
|
|
123
|
+
effort_hint: null,
|
|
124
|
+
max_turns: 1,
|
|
125
|
+
auth_preference: disclosure.requested,
|
|
126
|
+
// The capability smoke proves the DEFAULT credential ladder's route;
|
|
127
|
+
// profile readiness has its own probe (probeCredentialProfile).
|
|
128
|
+
credential_profile: null,
|
|
129
|
+
resume_session_id: null,
|
|
130
|
+
env_inheritance: "clean",
|
|
131
|
+
evidence_policy: "stream_only",
|
|
132
|
+
env: {},
|
|
133
|
+
attachments: [],
|
|
134
|
+
browser: null,
|
|
135
|
+
stream_deltas: false,
|
|
136
|
+
extra: request.abortSignal ? { abortSignal: request.abortSignal } : {},
|
|
137
|
+
});
|
|
138
|
+
for await (const raw of adapter.run(spec)) {
|
|
139
|
+
const event = HarnessEvent.parse(raw);
|
|
140
|
+
streamHash.update(JSON.stringify({
|
|
141
|
+
type: event.type,
|
|
142
|
+
session: event.session_id,
|
|
143
|
+
route: event.credential_route ?? null,
|
|
144
|
+
source: event.credential_source ?? null,
|
|
145
|
+
aborted: event.aborted ?? false,
|
|
146
|
+
textDigest: event.text === undefined ? null : sha256(event.text),
|
|
147
|
+
}));
|
|
148
|
+
if (terminalSeen)
|
|
149
|
+
eventsAfterCompleted += 1;
|
|
150
|
+
if (event.session_id !== spec.session_id) {
|
|
151
|
+
sessionMismatchEvents += 1;
|
|
152
|
+
evidence.add("event:session_mismatch");
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (startedEvents === 0 && event.type !== "started")
|
|
156
|
+
protocolViolation = true;
|
|
157
|
+
switch (event.type) {
|
|
158
|
+
case "started":
|
|
159
|
+
startedEvents += 1;
|
|
160
|
+
if (startedEvents !== 1 || terminalSeen)
|
|
161
|
+
protocolViolation = true;
|
|
162
|
+
evidence.add("event:started");
|
|
163
|
+
if (event.credential_route) {
|
|
164
|
+
if (effective && effective !== event.credential_route)
|
|
165
|
+
routeConflict = true;
|
|
166
|
+
effective ??= event.credential_route;
|
|
167
|
+
evidence.add(`credential-route:${event.credential_route}`);
|
|
168
|
+
}
|
|
169
|
+
if (event.credential_source) {
|
|
170
|
+
if (effectiveSource && effectiveSource !== event.credential_source)
|
|
171
|
+
sourceConflict = true;
|
|
172
|
+
effectiveSource ??= event.credential_source;
|
|
173
|
+
evidence.add(`credential-source:${event.credential_source}`);
|
|
174
|
+
}
|
|
175
|
+
break;
|
|
176
|
+
case "message": {
|
|
177
|
+
// Bound only the retained NARRATION (the no-final fallback); a
|
|
178
|
+
// typed final is a single already-materialized event text and
|
|
179
|
+
// makes narration irrelevant to the comparison.
|
|
180
|
+
const text = event.text ?? "";
|
|
181
|
+
if (event.final !== true) {
|
|
182
|
+
if (narrationChars + text.length > MAX_RESPONSE_CHARS) {
|
|
183
|
+
narrationTruncated = true;
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
narrationChars += text.length;
|
|
187
|
+
}
|
|
188
|
+
answer.observe(event);
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
case "error":
|
|
192
|
+
errorEvents += 1;
|
|
193
|
+
evidence.add("event:error");
|
|
194
|
+
break;
|
|
195
|
+
case "interaction_requested":
|
|
196
|
+
interactionEvents += 1;
|
|
197
|
+
evidence.add("event:unexpected_interaction");
|
|
198
|
+
break;
|
|
199
|
+
case "tool_call":
|
|
200
|
+
case "tool_result":
|
|
201
|
+
case "file_change":
|
|
202
|
+
unexpectedToolEvents += 1;
|
|
203
|
+
evidence.add("event:unexpected_tool_activity");
|
|
204
|
+
break;
|
|
205
|
+
case "completed":
|
|
206
|
+
completedEvents += 1;
|
|
207
|
+
terminalSeen = true;
|
|
208
|
+
if (completedEvents !== 1 || event.aborted)
|
|
209
|
+
protocolViolation = true;
|
|
210
|
+
cancelled ||= event.aborted === true;
|
|
211
|
+
evidence.add("event:completed");
|
|
212
|
+
break;
|
|
213
|
+
default:
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
cancelled ||= request.abortSignal?.aborted === true;
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
cancelled ||= request.abortSignal?.aborted === true;
|
|
221
|
+
adapterFailed = !cancelled;
|
|
222
|
+
evidence.add(cancelled ? "adapter:cancelled" : "adapter:threw");
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
if (scratchPath) {
|
|
226
|
+
try {
|
|
227
|
+
scratchAfterDigest = fingerprintTree(scratchPath);
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
scratchAfterDigest = sha256("scratch:missing-or-unreadable");
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// The digest binds the receipt to the response that was actually COMPARED
|
|
236
|
+
// (typed final verbatim, else joined narration) — the per-event text
|
|
237
|
+
// digests remain visible in streamDigest.
|
|
238
|
+
const response = answer.text();
|
|
239
|
+
const responseOverflow = !answer.hasFinal() && narrationTruncated;
|
|
240
|
+
const responseDigest = sha256(response);
|
|
241
|
+
const streamDigest = streamHash.digest("hex");
|
|
242
|
+
evidence.add(`response:sha256:${responseDigest}`);
|
|
243
|
+
evidence.add(`stream:sha256:${streamDigest}`);
|
|
244
|
+
let selectionReason;
|
|
245
|
+
if (requestMismatch)
|
|
246
|
+
selectionReason = "request_mismatch";
|
|
247
|
+
else if (adapterIdentityMismatch)
|
|
248
|
+
selectionReason = "adapter_identity_mismatch";
|
|
249
|
+
else if (adapterMissing)
|
|
250
|
+
selectionReason = "adapter_unavailable";
|
|
251
|
+
else if (cancelled)
|
|
252
|
+
selectionReason = "cancelled";
|
|
253
|
+
else if (adapterFailed)
|
|
254
|
+
selectionReason = "adapter_error";
|
|
255
|
+
else if (startedEvents === 0 || effective === null)
|
|
256
|
+
selectionReason = "route_missing";
|
|
257
|
+
else if (routeConflict || effective !== disclosure.requiredRoute)
|
|
258
|
+
selectionReason = "route_mismatch";
|
|
259
|
+
else if (effectiveSource === null)
|
|
260
|
+
selectionReason = "source_missing";
|
|
261
|
+
else if (sourceConflict || effectiveSource !== disclosure.requiredSource)
|
|
262
|
+
selectionReason = "source_mismatch";
|
|
263
|
+
else if (protocolViolation ||
|
|
264
|
+
startedEvents !== 1 ||
|
|
265
|
+
completedEvents > 1 ||
|
|
266
|
+
eventsAfterCompleted > 0)
|
|
267
|
+
selectionReason = "protocol_violation";
|
|
268
|
+
else if (errorEvents > 0 ||
|
|
269
|
+
unexpectedToolEvents > 0 ||
|
|
270
|
+
interactionEvents > 0 ||
|
|
271
|
+
sessionMismatchEvents > 0)
|
|
272
|
+
selectionReason = "harness_error";
|
|
273
|
+
else if (completedEvents === 0)
|
|
274
|
+
selectionReason = "missing_completion";
|
|
275
|
+
else if (scratchBeforeDigest !== scratchAfterDigest)
|
|
276
|
+
selectionReason = "scratch_mutated";
|
|
277
|
+
else if (responseOverflow || response !== expected)
|
|
278
|
+
selectionReason = "response_mismatch";
|
|
279
|
+
else
|
|
280
|
+
selectionReason = "exact_requested_route";
|
|
281
|
+
const passed = selectionReason === "exact_requested_route";
|
|
282
|
+
return AuthCapabilityReceipt.parse({
|
|
283
|
+
receiptId: this.receiptId(),
|
|
284
|
+
attemptId: binding.attemptId,
|
|
285
|
+
harness: disclosure.harness,
|
|
286
|
+
requested: disclosure.requested,
|
|
287
|
+
requiredRoute: disclosure.requiredRoute,
|
|
288
|
+
requiredSource: disclosure.requiredSource,
|
|
289
|
+
effective,
|
|
290
|
+
effectiveSource,
|
|
291
|
+
selectionReason,
|
|
292
|
+
availability: effective && effectiveSource ? "available" : adapterMissing ? "unavailable" : "unknown",
|
|
293
|
+
verification: passed ? "passed" : "failed",
|
|
294
|
+
billingKnowledge: "unknown",
|
|
295
|
+
costKnowledge: "unknown",
|
|
296
|
+
startedAt: request.startedAt,
|
|
297
|
+
completedAt: this.now().toISOString(),
|
|
298
|
+
challengeDigest: binding.challengeDigest,
|
|
299
|
+
requestDigest: binding.requestDigest,
|
|
300
|
+
responseDigest,
|
|
301
|
+
streamDigest,
|
|
302
|
+
scratchBeforeDigest,
|
|
303
|
+
scratchAfterDigest,
|
|
304
|
+
stream: {
|
|
305
|
+
startedEvents,
|
|
306
|
+
completedEvents,
|
|
307
|
+
errorEvents,
|
|
308
|
+
unexpectedToolEvents,
|
|
309
|
+
interactionEvents,
|
|
310
|
+
sessionMismatchEvents,
|
|
311
|
+
eventsAfterCompleted,
|
|
312
|
+
aborted: cancelled,
|
|
313
|
+
},
|
|
314
|
+
evidenceRefs: [...evidence],
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
/** Remove only the verifier-owned directory for a validated durable attempt. */
|
|
318
|
+
cleanup(attemptId) {
|
|
319
|
+
if (!ATTEMPT_ID.test(attemptId))
|
|
320
|
+
throw new Error("invalid auth capability attempt id");
|
|
321
|
+
if (!existsSync(this.scratchRoot))
|
|
322
|
+
return;
|
|
323
|
+
const root = realpathSync(this.scratchRoot);
|
|
324
|
+
const path = join(root, attemptId);
|
|
325
|
+
if (!existsSync(path))
|
|
326
|
+
return;
|
|
327
|
+
const stat = lstatSync(path);
|
|
328
|
+
if (stat.isSymbolicLink() ||
|
|
329
|
+
!stat.isDirectory() ||
|
|
330
|
+
realpathSync(path) !== path ||
|
|
331
|
+
!path.startsWith(root + sep)) {
|
|
332
|
+
throw new Error("refusing unsafe auth capability scratch cleanup");
|
|
333
|
+
}
|
|
334
|
+
rmSync(path, { recursive: true, force: false });
|
|
335
|
+
}
|
|
336
|
+
createScratch(attemptId) {
|
|
337
|
+
if (!ATTEMPT_ID.test(attemptId))
|
|
338
|
+
throw new Error("invalid auth capability attempt id");
|
|
339
|
+
ensureCanonicalPrivateDirectory(this.scratchRoot);
|
|
340
|
+
const root = realpathSync(this.scratchRoot);
|
|
341
|
+
const path = join(root, attemptId);
|
|
342
|
+
if (existsSync(path))
|
|
343
|
+
throw new Error("auth capability scratch already exists");
|
|
344
|
+
mkdirSync(path, { recursive: false, mode: 0o700 });
|
|
345
|
+
chmodSync(path, 0o700);
|
|
346
|
+
if (realpathSync(path) !== path || !path.startsWith(root + sep))
|
|
347
|
+
throw new Error("unsafe auth capability scratch path");
|
|
348
|
+
return path;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
function challengeFor(attemptId) {
|
|
352
|
+
return `claudexor-auth-capability-v1-${sha256(`auth-capability-v1:${attemptId}`).slice(0, 32)}`;
|
|
353
|
+
}
|
|
354
|
+
function capabilityRequestDigest(disclosure, challengeDigest) {
|
|
355
|
+
return sha256(JSON.stringify({
|
|
356
|
+
schemaVersion: 1,
|
|
357
|
+
protocolVersion: 1,
|
|
358
|
+
harness: disclosure.harness,
|
|
359
|
+
requested: disclosure.requested,
|
|
360
|
+
requiredRoute: disclosure.requiredRoute,
|
|
361
|
+
requiredSource: disclosure.requiredSource,
|
|
362
|
+
networkScope: disclosure.networkScope,
|
|
363
|
+
cwdPolicy: "owned_external_scratch_v1",
|
|
364
|
+
intent: "explain",
|
|
365
|
+
access: "readonly",
|
|
366
|
+
externalContextPolicy: "off",
|
|
367
|
+
maxTurns: 1,
|
|
368
|
+
envInheritance: "clean",
|
|
369
|
+
evidencePolicy: "stream_only",
|
|
370
|
+
challengeDigest,
|
|
371
|
+
}));
|
|
372
|
+
}
|
|
373
|
+
function fingerprintTree(root) {
|
|
374
|
+
const hash = createHash("sha256");
|
|
375
|
+
const walk = (directory) => {
|
|
376
|
+
for (const name of readdirSync(directory).sort()) {
|
|
377
|
+
const path = join(directory, name);
|
|
378
|
+
const rel = relative(root, path);
|
|
379
|
+
const stat = lstatSync(path);
|
|
380
|
+
const type = stat.isDirectory()
|
|
381
|
+
? "directory"
|
|
382
|
+
: stat.isFile()
|
|
383
|
+
? "file"
|
|
384
|
+
: stat.isSymbolicLink()
|
|
385
|
+
? "symlink"
|
|
386
|
+
: "other";
|
|
387
|
+
hash.update(JSON.stringify({ rel, type, mode: stat.mode, size: stat.size }));
|
|
388
|
+
if (stat.isDirectory())
|
|
389
|
+
walk(path);
|
|
390
|
+
else if (stat.isSymbolicLink())
|
|
391
|
+
hash.update(readlinkSync(path));
|
|
392
|
+
else if (stat.isFile())
|
|
393
|
+
hashFile(path, hash);
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
walk(root);
|
|
397
|
+
return hash.digest("hex");
|
|
398
|
+
}
|
|
399
|
+
function hashFile(path, hash) {
|
|
400
|
+
const fd = openSync(path, "r");
|
|
401
|
+
const buffer = Buffer.allocUnsafe(64 * 1024);
|
|
402
|
+
try {
|
|
403
|
+
for (;;) {
|
|
404
|
+
const bytes = readSync(fd, buffer, 0, buffer.length, null);
|
|
405
|
+
if (bytes === 0)
|
|
406
|
+
break;
|
|
407
|
+
hash.update(buffer.subarray(0, bytes));
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
finally {
|
|
411
|
+
closeSync(fd);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
function sha256(value) {
|
|
415
|
+
return createHash("sha256").update(value, "utf8").digest("hex");
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=auth-capability-verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-capability-verifier.js","sourceRoot":"","sources":["../src/auth-capability-verifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,cAAc,IAAI,oBAAoB,GAQvC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AAElE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,UAAU,GAAG,iBAAiB,CAAC;AA0BrC;;;;GAIG;AACH,MAAM,OAAO,sBAAsB;IAMd;IALF,GAAG,CAAa;IAChB,SAAS,CAAe;IACxB,WAAW,CAAS;IAErC,YACmB,OAAmD,EACpE,OAAmC,EAAE;QADpB,YAAO,GAAP,OAAO,CAA4C;QAGpE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,UAAU,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,WAAW,GAAG,OAAO,CACxB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,uBAAuB,CAAC,CAC1E,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CACjB,QAAyB,EACzB,OAAmC,EAAE;QAErC,OAAO,IAAI,sBAAsB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,UAAU,CACR,OAAe,EACf,SAAsB,EACtB,aAA8B,EAC9B,cAA8B;QAE9B,OAAO,mBAAmB,CAAC,KAAK,CAAC;YAC/B,aAAa,EAAE,CAAC;YAChB,eAAe,EAAE,CAAC;YAClB,OAAO;YACP,SAAS;YACT,aAAa;YACb,cAAc;YACd,YAAY,EAAE,uBAAuB;YACrC,gBAAgB,EAAE,SAAS;YAC3B,wBAAwB,EAAE,SAAS;YACnC,eAAe,EAAE,IAAI;YACrB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,OAAyC;QAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC/F,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAChC,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,cAAc,CACvB,CAAC;QACF,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAChE,OAAO;YACL,OAAO,EAAE,qBAAqB,CAAC,KAAK,CAAC;gBACnC,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,eAAe;gBACf,aAAa,EAAE,uBAAuB,CAAC,UAAU,EAAE,eAAe,CAAC;gBACnE,UAAU;aACX,CAAC;SACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA0C;QACrD,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,eAAe,GACnB,OAAO,CAAC,eAAe,KAAK,MAAM,CAAC,QAAQ,CAAC;YAC5C,OAAO,CAAC,aAAa,KAAK,uBAAuB,CAAC,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;QACzF,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxC,qEAAqE;QACrE,wEAAwE;QACxE,sEAAsE;QACtE,2DAA2D;QAC3D,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACpC,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,IAAI,SAAS,GAA2B,IAAI,CAAC;QAC7C,IAAI,eAAe,GAA0B,IAAI,CAAC;QAClD,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,oBAAoB,GAAG,CAAC,CAAC;QAC7B,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAC1B,IAAI,qBAAqB,GAAG,CAAC,CAAC;QAC9B,IAAI,oBAAoB,GAAG,CAAC,CAAC;QAC7B,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAC9B,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,uBAAuB,GAAG,KAAK,CAAC;QACpC,IAAI,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;QACtD,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,MAAM,eAAe,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACtD,IAAI,mBAAmB,GAAG,eAAe,CAAC;QAC1C,IAAI,kBAAkB,GAAG,eAAe,CAAC;QACzC,IAAI,WAAW,GAAkB,IAAI,CAAC;QACtC,IAAI,OAAmC,CAAC;QAExC,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,aAAa,GAAG,IAAI,CAAC;gBACrB,QAAQ,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,CAAC,OAAO,IAAI,CAAC,aAAa;gBAAE,cAAc,GAAG,IAAI,CAAC;YACtD,IAAI,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;gBACjD,uBAAuB,GAAG,IAAI,CAAC;gBAC/B,QAAQ,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,IAAI,OAAO,IAAI,CAAC,uBAAuB,IAAI,CAAC,aAAa,IAAI,CAAC,eAAe,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5F,IAAI,CAAC;gBACH,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACpD,mBAAmB,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;gBACnD,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC;oBACtC,UAAU,EAAE,cAAc,OAAO,CAAC,SAAS,EAAE;oBAC7C,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,kBAAkB,QAAQ,wCAAwC;oBAC1E,GAAG,EAAE,WAAW;oBAChB,MAAM,EAAE,UAAU;oBAClB,uBAAuB,EAAE,KAAK;oBAC9B,sBAAsB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;oBAC3D,UAAU,EAAE,IAAI;oBAChB,WAAW,EAAE,IAAI;oBACjB,SAAS,EAAE,CAAC;oBACZ,eAAe,EAAE,UAAU,CAAC,SAAS;oBACrC,qEAAqE;oBACrE,gEAAgE;oBAChE,kBAAkB,EAAE,IAAI;oBACxB,iBAAiB,EAAE,IAAI;oBACvB,eAAe,EAAE,OAAO;oBACxB,eAAe,EAAE,aAAa;oBAC9B,GAAG,EAAE,EAAE;oBACP,WAAW,EAAE,EAAE;oBACf,OAAO,EAAE,IAAI;oBACb,aAAa,EAAE,KAAK;oBACpB,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;iBAC9C,CAAC,CAAC;gBAC5B,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACtC,UAAU,CAAC,MAAM,CACf,IAAI,CAAC,SAAS,CAAC;wBACb,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,OAAO,EAAE,KAAK,CAAC,UAAU;wBACzB,KAAK,EAAE,KAAK,CAAC,gBAAgB,IAAI,IAAI;wBACrC,MAAM,EAAE,KAAK,CAAC,iBAAiB,IAAI,IAAI;wBACvC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK;wBAC/B,UAAU,EAAE,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;qBACjE,CAAC,CACH,CAAC;oBACF,IAAI,YAAY;wBAAE,oBAAoB,IAAI,CAAC,CAAC;oBAC5C,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;wBACzC,qBAAqB,IAAI,CAAC,CAAC;wBAC3B,QAAQ,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;wBACvC,SAAS;oBACX,CAAC;oBACD,IAAI,aAAa,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;wBAAE,iBAAiB,GAAG,IAAI,CAAC;oBAC9E,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;wBACnB,KAAK,SAAS;4BACZ,aAAa,IAAI,CAAC,CAAC;4BACnB,IAAI,aAAa,KAAK,CAAC,IAAI,YAAY;gCAAE,iBAAiB,GAAG,IAAI,CAAC;4BAClE,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;4BAC9B,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;gCAC3B,IAAI,SAAS,IAAI,SAAS,KAAK,KAAK,CAAC,gBAAgB;oCAAE,aAAa,GAAG,IAAI,CAAC;gCAC5E,SAAS,KAAK,KAAK,CAAC,gBAAgB,CAAC;gCACrC,QAAQ,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;4BAC7D,CAAC;4BACD,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;gCAC5B,IAAI,eAAe,IAAI,eAAe,KAAK,KAAK,CAAC,iBAAiB;oCAChE,cAAc,GAAG,IAAI,CAAC;gCACxB,eAAe,KAAK,KAAK,CAAC,iBAAiB,CAAC;gCAC5C,QAAQ,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;4BAC/D,CAAC;4BACD,MAAM;wBACR,KAAK,SAAS,CAAC,CAAC,CAAC;4BACf,+DAA+D;4BAC/D,8DAA8D;4BAC9D,gDAAgD;4BAChD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;4BAC9B,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gCACzB,IAAI,cAAc,GAAG,IAAI,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;oCACtD,kBAAkB,GAAG,IAAI,CAAC;oCAC1B,MAAM;gCACR,CAAC;gCACD,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC;4BAChC,CAAC;4BACD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;4BACtB,MAAM;wBACR,CAAC;wBACD,KAAK,OAAO;4BACV,WAAW,IAAI,CAAC,CAAC;4BACjB,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;4BAC5B,MAAM;wBACR,KAAK,uBAAuB;4BAC1B,iBAAiB,IAAI,CAAC,CAAC;4BACvB,QAAQ,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;4BAC7C,MAAM;wBACR,KAAK,WAAW,CAAC;wBACjB,KAAK,aAAa,CAAC;wBACnB,KAAK,aAAa;4BAChB,oBAAoB,IAAI,CAAC,CAAC;4BAC1B,QAAQ,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;4BAC/C,MAAM;wBACR,KAAK,WAAW;4BACd,eAAe,IAAI,CAAC,CAAC;4BACrB,YAAY,GAAG,IAAI,CAAC;4BACpB,IAAI,eAAe,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO;gCAAE,iBAAiB,GAAG,IAAI,CAAC;4BACrE,SAAS,KAAK,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC;4BACrC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;4BAChC,MAAM;wBACR;4BACE,MAAM;oBACV,CAAC;gBACH,CAAC;gBACD,SAAS,KAAK,OAAO,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,KAAK,OAAO,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;gBACpD,aAAa,GAAG,CAAC,SAAS,CAAC;gBAC3B,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YAClE,CAAC;oBAAS,CAAC;gBACT,IAAI,WAAW,EAAE,CAAC;oBAChB,IAAI,CAAC;wBACH,kBAAkB,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;oBACpD,CAAC;oBAAC,MAAM,CAAC;wBACP,kBAAkB,GAAG,MAAM,CAAC,+BAA+B,CAAC,CAAC;oBAC/D,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,qEAAqE;QACrE,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,gBAAgB,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,kBAAkB,CAAC;QAClE,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9C,QAAQ,CAAC,GAAG,CAAC,mBAAmB,cAAc,EAAE,CAAC,CAAC;QAClD,QAAQ,CAAC,GAAG,CAAC,iBAAiB,YAAY,EAAE,CAAC,CAAC;QAC9C,IAAI,eAA6D,CAAC;QAClE,IAAI,eAAe;YAAE,eAAe,GAAG,kBAAkB,CAAC;aACrD,IAAI,uBAAuB;YAAE,eAAe,GAAG,2BAA2B,CAAC;aAC3E,IAAI,cAAc;YAAE,eAAe,GAAG,qBAAqB,CAAC;aAC5D,IAAI,SAAS;YAAE,eAAe,GAAG,WAAW,CAAC;aAC7C,IAAI,aAAa;YAAE,eAAe,GAAG,eAAe,CAAC;aACrD,IAAI,aAAa,KAAK,CAAC,IAAI,SAAS,KAAK,IAAI;YAAE,eAAe,GAAG,eAAe,CAAC;aACjF,IAAI,aAAa,IAAI,SAAS,KAAK,UAAU,CAAC,aAAa;YAC9D,eAAe,GAAG,gBAAgB,CAAC;aAChC,IAAI,eAAe,KAAK,IAAI;YAAE,eAAe,GAAG,gBAAgB,CAAC;aACjE,IAAI,cAAc,IAAI,eAAe,KAAK,UAAU,CAAC,cAAc;YACtE,eAAe,GAAG,iBAAiB,CAAC;aACjC,IACH,iBAAiB;YACjB,aAAa,KAAK,CAAC;YACnB,eAAe,GAAG,CAAC;YACnB,oBAAoB,GAAG,CAAC;YAExB,eAAe,GAAG,oBAAoB,CAAC;aACpC,IACH,WAAW,GAAG,CAAC;YACf,oBAAoB,GAAG,CAAC;YACxB,iBAAiB,GAAG,CAAC;YACrB,qBAAqB,GAAG,CAAC;YAEzB,eAAe,GAAG,eAAe,CAAC;aAC/B,IAAI,eAAe,KAAK,CAAC;YAAE,eAAe,GAAG,oBAAoB,CAAC;aAClE,IAAI,mBAAmB,KAAK,kBAAkB;YAAE,eAAe,GAAG,iBAAiB,CAAC;aACpF,IAAI,gBAAgB,IAAI,QAAQ,KAAK,QAAQ;YAAE,eAAe,GAAG,mBAAmB,CAAC;;YACrF,eAAe,GAAG,uBAAuB,CAAC;QAE/C,MAAM,MAAM,GAAG,eAAe,KAAK,uBAAuB,CAAC;QAC3D,OAAO,qBAAqB,CAAC,KAAK,CAAC;YACjC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;YAC3B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,cAAc,EAAE,UAAU,CAAC,cAAc;YACzC,SAAS;YACT,eAAe;YACf,eAAe;YACf,YAAY,EACV,SAAS,IAAI,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;YACzF,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;YAC1C,gBAAgB,EAAE,SAAS;YAC3B,aAAa,EAAE,SAAS;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;YACrC,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,cAAc;YACd,YAAY;YACZ,mBAAmB;YACnB,kBAAkB;YAClB,MAAM,EAAE;gBACN,aAAa;gBACb,eAAe;gBACf,WAAW;gBACX,oBAAoB;gBACpB,iBAAiB;gBACjB,qBAAqB;gBACrB,oBAAoB;gBACpB,OAAO,EAAE,SAAS;aACnB;YACD,YAAY,EAAE,CAAC,GAAG,QAAQ,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,gFAAgF;IAChF,OAAO,CAAC,SAAiB;QACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACvF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO;QAC1C,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO;QAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,IACE,IAAI,CAAC,cAAc,EAAE;YACrB,CAAC,IAAI,CAAC,WAAW,EAAE;YACnB,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI;YAC3B,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,EAC5B,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;IAEO,aAAa,CAAC,SAAiB;QACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACvF,+BAA+B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACnC,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAChF,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACnD,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvB,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,SAAS,YAAY,CAAC,SAAiB;IACrC,OAAO,gCAAgC,MAAM,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAClG,CAAC;AAED,SAAS,uBAAuB,CAC9B,UAAmC,EACnC,eAAuB;IAEvB,OAAO,MAAM,CACX,IAAI,CAAC,SAAS,CAAC;QACb,aAAa,EAAE,CAAC;QAChB,eAAe,EAAE,CAAC;QAClB,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,SAAS,EAAE,2BAA2B;QACtC,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,UAAU;QAClB,qBAAqB,EAAE,KAAK;QAC5B,QAAQ,EAAE,CAAC;QACX,cAAc,EAAE,OAAO;QACvB,cAAc,EAAE,aAAa;QAC7B,eAAe;KAChB,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,CAAC,SAAiB,EAAQ,EAAE;QACvC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;gBAC7B,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE;oBACb,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE;wBACrB,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,OAAO,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7E,IAAI,IAAI,CAAC,WAAW,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;iBAC9B,IAAI,IAAI,CAAC,cAAc,EAAE;gBAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;iBAC3D,IAAI,IAAI,CAAC,MAAM,EAAE;gBAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,CAAC;IACX,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,IAAmC;IACjE,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC3D,IAAI,KAAK,KAAK,CAAC;gBAAE,MAAM;YACvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC"}
|