@sentropic/h2a 0.1.0 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -0
- package/dist/abc.d.ts +199 -0
- package/dist/abc.d.ts.map +1 -0
- package/dist/abc.js +268 -0
- package/dist/abc.js.map +1 -0
- package/dist/artifacts.d.ts +10 -0
- package/dist/artifacts.d.ts.map +1 -0
- package/dist/artifacts.js +147 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/authority.d.ts +21 -0
- package/dist/authority.d.ts.map +1 -0
- package/dist/authority.js +73 -0
- package/dist/authority.js.map +1 -0
- package/dist/canonical.d.ts +3 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +38 -0
- package/dist/canonical.js.map +1 -0
- package/dist/contractual.d.ts +52 -0
- package/dist/contractual.d.ts.map +1 -0
- package/dist/contractual.js +126 -0
- package/dist/contractual.js.map +1 -0
- package/dist/escalation.d.ts +40 -0
- package/dist/escalation.d.ts.map +1 -0
- package/dist/escalation.js +114 -0
- package/dist/escalation.js.map +1 -0
- package/dist/fixtures-index.d.ts +16 -0
- package/dist/fixtures-index.d.ts.map +1 -0
- package/dist/fixtures-index.js +11 -0
- package/dist/fixtures-index.js.map +1 -0
- package/dist/governance-boundary.d.ts +118 -0
- package/dist/governance-boundary.d.ts.map +1 -0
- package/dist/governance-boundary.js +143 -0
- package/dist/governance-boundary.js.map +1 -0
- package/dist/index.d.ts +23 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/journal.d.ts +37 -0
- package/dist/journal.d.ts.map +1 -0
- package/dist/journal.js +73 -0
- package/dist/journal.js.map +1 -0
- package/dist/multi-human.d.ts +106 -0
- package/dist/multi-human.d.ts.map +1 -0
- package/dist/multi-human.js +116 -0
- package/dist/multi-human.js.map +1 -0
- package/dist/policy-precedence.d.ts +50 -0
- package/dist/policy-precedence.d.ts.map +1 -0
- package/dist/policy-precedence.js +98 -0
- package/dist/policy-precedence.js.map +1 -0
- package/dist/signature.d.ts +8 -0
- package/dist/signature.d.ts.map +1 -0
- package/dist/signature.js +39 -0
- package/dist/signature.js.map +1 -0
- package/dist/types.d.ts +105 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +12 -1
- package/dist/types.js.map +1 -1
- package/fixtures/authority.json +1 -0
- package/fixtures/contract.json +1 -0
- package/fixtures/enforcement-plan.json +1 -0
- package/fixtures/engagement.json +1 -0
- package/fixtures/mandate.json +1 -0
- package/fixtures/manifest.json +38 -0
- package/fixtures/policy.json +1 -0
- package/package.json +4 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type H2AArtifactKind, type H2ARole } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* V1 signing authority matrix (DEC-035).
|
|
4
|
+
*
|
|
5
|
+
* Maps each canonical {@link H2AArtifactKind} to the set of roles allowed
|
|
6
|
+
* to produce a binding signature on that artifact kind. This is the
|
|
7
|
+
* executable counterpart of DEC-004 (governance) and DEC-018/DEC-023
|
|
8
|
+
* (CONTRACT vs ENFORCEMENT_PLAN ownership).
|
|
9
|
+
*
|
|
10
|
+
* `MANDATAIRE` deliberately appears only for `SIGNATURE` — DEC-005 and
|
|
11
|
+
* DEC-024 keep the mandataire as a *presenter* of decisions, not a binder.
|
|
12
|
+
* The `SIGNATURE` row admits every role because that kind is the audit
|
|
13
|
+
* trace of a signing act produced by whoever signed.
|
|
14
|
+
*/
|
|
15
|
+
export declare const H2A_AUTHORITY_MATRIX: Readonly<Record<H2AArtifactKind, {
|
|
16
|
+
roles: readonly H2ARole[];
|
|
17
|
+
notes?: string;
|
|
18
|
+
}>>;
|
|
19
|
+
export declare function canSignArtifactKind(role: H2ARole, kind: H2AArtifactKind): boolean;
|
|
20
|
+
export declare function assertCanSignArtifactKind(role: H2ARole, kind: H2AArtifactKind): void;
|
|
21
|
+
//# sourceMappingURL=authority.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authority.d.ts","sourceRoot":"","sources":["../src/authority.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,OAAO,EACb,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CACzC,MAAM,CAAC,eAAe,EAAE;IAAE,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+CtE,CAAC;AAUH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAIjF;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CAOpF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { H2A_ARTIFACT_KINDS, H2A_ROLES } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* V1 signing authority matrix (DEC-035).
|
|
4
|
+
*
|
|
5
|
+
* Maps each canonical {@link H2AArtifactKind} to the set of roles allowed
|
|
6
|
+
* to produce a binding signature on that artifact kind. This is the
|
|
7
|
+
* executable counterpart of DEC-004 (governance) and DEC-018/DEC-023
|
|
8
|
+
* (CONTRACT vs ENFORCEMENT_PLAN ownership).
|
|
9
|
+
*
|
|
10
|
+
* `MANDATAIRE` deliberately appears only for `SIGNATURE` — DEC-005 and
|
|
11
|
+
* DEC-024 keep the mandataire as a *presenter* of decisions, not a binder.
|
|
12
|
+
* The `SIGNATURE` row admits every role because that kind is the audit
|
|
13
|
+
* trace of a signing act produced by whoever signed.
|
|
14
|
+
*/
|
|
15
|
+
export const H2A_AUTHORITY_MATRIX = Object.freeze({
|
|
16
|
+
CONTRACT: {
|
|
17
|
+
roles: Object.freeze(["PRINCIPAL", "EXECUTIF", "CONDUCTOR"]),
|
|
18
|
+
notes: "CONTRACT is the binding normative container; PRINCIPAL/EXECUTIF/CONDUCTOR are the only signers (DEC-018)."
|
|
19
|
+
},
|
|
20
|
+
POLICY: {
|
|
21
|
+
roles: Object.freeze(["PRINCIPAL", "EXECUTIF", "CONTROL"]),
|
|
22
|
+
notes: "POLICY is adopted by PRINCIPAL/EXECUTIF or imposed by CONTROL (DEC-016, DEC-023)."
|
|
23
|
+
},
|
|
24
|
+
ENGAGEMENT: {
|
|
25
|
+
roles: Object.freeze(["PRINCIPAL", "EXECUTIF", "CONDUCTOR"]),
|
|
26
|
+
notes: "ENGAGEMENT charter signing follows the contract chain — PRINCIPAL/EXECUTIF/CONDUCTOR (DEC-003)."
|
|
27
|
+
},
|
|
28
|
+
AMENDMENT: {
|
|
29
|
+
roles: Object.freeze([
|
|
30
|
+
"PRINCIPAL",
|
|
31
|
+
"EXECUTIF",
|
|
32
|
+
"CONDUCTOR",
|
|
33
|
+
"CONTROL"
|
|
34
|
+
]),
|
|
35
|
+
notes: "Amendments can come from the contract chain (PRINCIPAL/EXECUTIF/CONDUCTOR) or be imposed by CONTROL (DEC-004)."
|
|
36
|
+
},
|
|
37
|
+
MANDATE: {
|
|
38
|
+
roles: Object.freeze(["PRINCIPAL", "EXECUTIF"]),
|
|
39
|
+
notes: "Mandates are issued by the executive function (PRINCIPAL or EXECUTIF) — DEC-021."
|
|
40
|
+
},
|
|
41
|
+
AUTHORITY: {
|
|
42
|
+
roles: Object.freeze(["PRINCIPAL", "EXECUTIF"]),
|
|
43
|
+
notes: "Authority records (instance/quorum) are constituted by the executive function (DEC-021)."
|
|
44
|
+
},
|
|
45
|
+
SIGNATURE: {
|
|
46
|
+
roles: Object.freeze([...H2A_ROLES]),
|
|
47
|
+
notes: "SIGNATURE is the audit trace of a signing act and is admissible from any role that can sign anything."
|
|
48
|
+
},
|
|
49
|
+
ENFORCEMENT_PLAN: {
|
|
50
|
+
roles: Object.freeze(["PRINCIPAL", "EXECUTIF", "CONTROL"]),
|
|
51
|
+
notes: "Enforcement plans are produced by CONTROL under PRINCIPAL/EXECUTIF authority (DEC-023)."
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
// Sanity check: every canonical kind has an entry. Catches future drift if
|
|
55
|
+
// H2A_ARTIFACT_KINDS grows but the matrix is not updated in lockstep.
|
|
56
|
+
for (const kind of H2A_ARTIFACT_KINDS) {
|
|
57
|
+
if (!(kind in H2A_AUTHORITY_MATRIX)) {
|
|
58
|
+
throw new Error(`H2A_AUTHORITY_MATRIX is missing an entry for kind ${kind}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function canSignArtifactKind(role, kind) {
|
|
62
|
+
const entry = H2A_AUTHORITY_MATRIX[kind];
|
|
63
|
+
if (!entry)
|
|
64
|
+
return false;
|
|
65
|
+
return entry.roles.includes(role);
|
|
66
|
+
}
|
|
67
|
+
export function assertCanSignArtifactKind(role, kind) {
|
|
68
|
+
if (!canSignArtifactKind(role, kind)) {
|
|
69
|
+
const allowed = H2A_AUTHORITY_MATRIX[kind]?.roles ?? [];
|
|
70
|
+
throw new Error(`H2A authority: role ${role} is not allowed to sign artifact kind ${kind} (allowed: [${allowed.join(",")}])`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=authority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authority.js","sourceRoot":"","sources":["../src/authority.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,SAAS,EAGV,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAE7B,MAAM,CAAC,MAAM,CAAC;IAChB,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAuB;QAClF,KAAK,EACH,2GAA2G;KAC9G;IACD,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,CAAuB;QAChF,KAAK,EACH,mFAAmF;KACtF;IACD,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAuB;QAClF,KAAK,EACH,iGAAiG;KACpG;IACD,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;YACnB,WAAW;YACX,UAAU;YACV,WAAW;YACX,SAAS;SACV,CAAuB;QACxB,KAAK,EACH,gHAAgH;KACnH;IACD,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,CAAuB;QACrE,KAAK,EACH,kFAAkF;KACrF;IACD,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,CAAuB;QACrE,KAAK,EACH,0FAA0F;KAC7F;IACD,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAuB;QAC1D,KAAK,EACH,uGAAuG;KAC1G;IACD,gBAAgB,EAAE;QAChB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,CAAuB;QAChF,KAAK,EACH,yFAAyF;KAC5F;CACF,CAAC,CAAC;AAEH,2EAA2E;AAC3E,sEAAsE;AACtE,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;IACtC,IAAI,CAAC,CAAC,IAAI,IAAI,oBAAoB,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,qDAAqD,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAa,EAAE,IAAqB;IACtE,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAa,EAAE,IAAqB;IAC5E,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,uBAAuB,IAAI,yCAAyC,IAAI,eAAe,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAC7G,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AA8CA,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIlD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
function toCanonical(value) {
|
|
3
|
+
if (value === null) {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
if (Array.isArray(value)) {
|
|
7
|
+
return value.map((entry) => toCanonical(entry));
|
|
8
|
+
}
|
|
9
|
+
if (typeof value === "object") {
|
|
10
|
+
const source = value;
|
|
11
|
+
const sortedKeys = Object.keys(source)
|
|
12
|
+
.filter((key) => source[key] !== undefined)
|
|
13
|
+
.sort();
|
|
14
|
+
const out = {};
|
|
15
|
+
for (const key of sortedKeys) {
|
|
16
|
+
out[key] = toCanonical(source[key]);
|
|
17
|
+
}
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
if (typeof value === "number" && !Number.isFinite(value)) {
|
|
21
|
+
throw new Error(`canonicalize: non-finite numbers are not supported (${value})`);
|
|
22
|
+
}
|
|
23
|
+
if (typeof value === "string" ||
|
|
24
|
+
typeof value === "number" ||
|
|
25
|
+
typeof value === "boolean") {
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
throw new Error(`canonicalize: unsupported value type (${typeof value})`);
|
|
29
|
+
}
|
|
30
|
+
export function canonicalize(value) {
|
|
31
|
+
return JSON.stringify(toCanonical(value));
|
|
32
|
+
}
|
|
33
|
+
export function computeHash(value) {
|
|
34
|
+
const canonical = canonicalize(value);
|
|
35
|
+
const digest = createHash("sha256").update(canonical, "utf8").digest("hex");
|
|
36
|
+
return `sha256:${digest}`;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=canonical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAUzC,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aACnC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;aAC1C,IAAI,EAAE,CAAC;QACV,MAAM,GAAG,GAAmC,EAAE,CAAC;QAC/C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,uDAAuD,KAAK,GAAG,CAAC,CAAC;IACnF,CAAC;IAED,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,SAAS,EAC1B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,yCAAyC,OAAO,KAAK,GAAG,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5E,OAAO,UAAU,MAAM,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { H2AContract, H2AEngagement, H2APolicy } from "./types.js";
|
|
2
|
+
export type H2AContractualArtifactKind = "CONTRACT" | "POLICY" | "ENGAGEMENT";
|
|
3
|
+
export type H2AContractualArtifact = H2AContract | H2APolicy | H2AEngagement;
|
|
4
|
+
export type H2AContractualArtifactProfile = "normative-container" | "durable-rule" | "operational-executable";
|
|
5
|
+
export interface H2AContractualArtifactProfileDescriptor {
|
|
6
|
+
readonly kind: H2AContractualArtifactKind;
|
|
7
|
+
readonly profile: H2AContractualArtifactProfile;
|
|
8
|
+
readonly durable: boolean;
|
|
9
|
+
readonly executable: boolean;
|
|
10
|
+
readonly canContainPolicies: boolean;
|
|
11
|
+
readonly canReferencePolicies: boolean;
|
|
12
|
+
readonly canInstantiateEngagements: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface H2AContractualArtifactAuditResult {
|
|
15
|
+
readonly ok: boolean;
|
|
16
|
+
readonly kind?: string;
|
|
17
|
+
readonly profile?: H2AContractualArtifactProfile;
|
|
18
|
+
readonly issues: readonly string[];
|
|
19
|
+
}
|
|
20
|
+
export declare const H2A_CONTRACTUAL_ARTIFACT_PROFILES: Readonly<{
|
|
21
|
+
readonly CONTRACT: Readonly<{
|
|
22
|
+
kind: "CONTRACT";
|
|
23
|
+
profile: "normative-container";
|
|
24
|
+
durable: true;
|
|
25
|
+
executable: false;
|
|
26
|
+
canContainPolicies: true;
|
|
27
|
+
canReferencePolicies: true;
|
|
28
|
+
canInstantiateEngagements: true;
|
|
29
|
+
}>;
|
|
30
|
+
readonly POLICY: Readonly<{
|
|
31
|
+
kind: "POLICY";
|
|
32
|
+
profile: "durable-rule";
|
|
33
|
+
durable: true;
|
|
34
|
+
executable: false;
|
|
35
|
+
canContainPolicies: false;
|
|
36
|
+
canReferencePolicies: false;
|
|
37
|
+
canInstantiateEngagements: false;
|
|
38
|
+
}>;
|
|
39
|
+
readonly ENGAGEMENT: Readonly<{
|
|
40
|
+
kind: "ENGAGEMENT";
|
|
41
|
+
profile: "operational-executable";
|
|
42
|
+
durable: false;
|
|
43
|
+
executable: true;
|
|
44
|
+
canContainPolicies: false;
|
|
45
|
+
canReferencePolicies: true;
|
|
46
|
+
canInstantiateEngagements: false;
|
|
47
|
+
}>;
|
|
48
|
+
}>;
|
|
49
|
+
export declare function getContractualArtifactProfile(kind: string): H2AContractualArtifactProfileDescriptor | undefined;
|
|
50
|
+
export declare function auditContractualArtifact(value: unknown): H2AContractualArtifactAuditResult;
|
|
51
|
+
export declare function assertContractualArtifactInvariants(value: unknown): asserts value is H2AContractualArtifact;
|
|
52
|
+
//# sourceMappingURL=contractual.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contractual.d.ts","sourceRoot":"","sources":["../src/contractual.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,0BAA0B,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE9E,MAAM,MAAM,sBAAsB,GAC9B,WAAW,GACX,SAAS,GACT,aAAa,CAAC;AAElB,MAAM,MAAM,6BAA6B,GACrC,qBAAqB,GACrB,cAAc,GACd,wBAAwB,CAAC;AAE7B,MAAM,WAAW,uCAAuC;IACtD,QAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,6BAA6B,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC;CAC7C;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,6BAA6B,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+B5C,CAAC;AA2DH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,GACX,uCAAuC,GAAG,SAAS,CAOrD;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,GACb,iCAAiC,CAiDnC;AAED,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,KAAK,IAAI,sBAAsB,CAOzC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { isContract, isEngagement, isPolicy } from "./artifacts.js";
|
|
2
|
+
export const H2A_CONTRACTUAL_ARTIFACT_PROFILES = Object.freeze({
|
|
3
|
+
CONTRACT: Object.freeze({
|
|
4
|
+
kind: "CONTRACT",
|
|
5
|
+
profile: "normative-container",
|
|
6
|
+
durable: true,
|
|
7
|
+
executable: false,
|
|
8
|
+
canContainPolicies: true,
|
|
9
|
+
canReferencePolicies: true,
|
|
10
|
+
canInstantiateEngagements: true
|
|
11
|
+
}),
|
|
12
|
+
POLICY: Object.freeze({
|
|
13
|
+
kind: "POLICY",
|
|
14
|
+
profile: "durable-rule",
|
|
15
|
+
durable: true,
|
|
16
|
+
executable: false,
|
|
17
|
+
canContainPolicies: false,
|
|
18
|
+
canReferencePolicies: false,
|
|
19
|
+
canInstantiateEngagements: false
|
|
20
|
+
}),
|
|
21
|
+
ENGAGEMENT: Object.freeze({
|
|
22
|
+
kind: "ENGAGEMENT",
|
|
23
|
+
profile: "operational-executable",
|
|
24
|
+
durable: false,
|
|
25
|
+
executable: true,
|
|
26
|
+
canContainPolicies: false,
|
|
27
|
+
canReferencePolicies: true,
|
|
28
|
+
canInstantiateEngagements: false
|
|
29
|
+
})
|
|
30
|
+
});
|
|
31
|
+
const CONTRACTUAL_KINDS = Object.keys(H2A_CONTRACTUAL_ARTIFACT_PROFILES);
|
|
32
|
+
const POLICY_FIELDS = [
|
|
33
|
+
"rule",
|
|
34
|
+
"sourceAuthority",
|
|
35
|
+
"adoptionMode",
|
|
36
|
+
"parameters"
|
|
37
|
+
];
|
|
38
|
+
const CONTRACT_FIELDS = [
|
|
39
|
+
"parties",
|
|
40
|
+
"clauses",
|
|
41
|
+
"engagements",
|
|
42
|
+
"signatures",
|
|
43
|
+
"obligations",
|
|
44
|
+
"rights"
|
|
45
|
+
];
|
|
46
|
+
const ENGAGEMENT_FIELDS = [
|
|
47
|
+
"charter",
|
|
48
|
+
"roleBindings",
|
|
49
|
+
"controls",
|
|
50
|
+
"successCriteria",
|
|
51
|
+
"contractId",
|
|
52
|
+
"amendments",
|
|
53
|
+
"status"
|
|
54
|
+
];
|
|
55
|
+
function isRecord(value) {
|
|
56
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
57
|
+
}
|
|
58
|
+
function ownFields(value, fields) {
|
|
59
|
+
return fields.filter((field) => Object.prototype.hasOwnProperty.call(value, field));
|
|
60
|
+
}
|
|
61
|
+
function addCollapseIssue(issues, kind, collapsedKind, fields, value) {
|
|
62
|
+
const present = ownFields(value, fields);
|
|
63
|
+
if (present.length === 0)
|
|
64
|
+
return;
|
|
65
|
+
issues.push(`${kind} must not carry ${collapsedKind} fields: ${present.join(", ")}`);
|
|
66
|
+
}
|
|
67
|
+
export function getContractualArtifactProfile(kind) {
|
|
68
|
+
if (!CONTRACTUAL_KINDS.includes(kind)) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
return H2A_CONTRACTUAL_ARTIFACT_PROFILES[kind];
|
|
72
|
+
}
|
|
73
|
+
export function auditContractualArtifact(value) {
|
|
74
|
+
if (!isRecord(value)) {
|
|
75
|
+
return { ok: false, issues: ["value is not an object"] };
|
|
76
|
+
}
|
|
77
|
+
const kind = typeof value.kind === "string" ? value.kind : undefined;
|
|
78
|
+
if (!kind) {
|
|
79
|
+
return { ok: false, issues: ["value.kind is required"] };
|
|
80
|
+
}
|
|
81
|
+
const descriptor = getContractualArtifactProfile(kind);
|
|
82
|
+
if (!descriptor) {
|
|
83
|
+
return {
|
|
84
|
+
ok: false,
|
|
85
|
+
kind,
|
|
86
|
+
issues: [
|
|
87
|
+
`${kind} is not a contractual artifact kind (expected CONTRACT, POLICY, ENGAGEMENT)`
|
|
88
|
+
]
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const issues = [];
|
|
92
|
+
if (descriptor.kind === "CONTRACT" && !isContract(value)) {
|
|
93
|
+
issues.push("CONTRACT is not structurally valid");
|
|
94
|
+
}
|
|
95
|
+
if (descriptor.kind === "POLICY" && !isPolicy(value)) {
|
|
96
|
+
issues.push("POLICY is not structurally valid");
|
|
97
|
+
}
|
|
98
|
+
if (descriptor.kind === "ENGAGEMENT" && !isEngagement(value)) {
|
|
99
|
+
issues.push("ENGAGEMENT is not structurally valid");
|
|
100
|
+
}
|
|
101
|
+
if (descriptor.kind === "CONTRACT") {
|
|
102
|
+
addCollapseIssue(issues, "CONTRACT", "POLICY", POLICY_FIELDS, value);
|
|
103
|
+
addCollapseIssue(issues, "CONTRACT", "ENGAGEMENT", ENGAGEMENT_FIELDS, value);
|
|
104
|
+
}
|
|
105
|
+
else if (descriptor.kind === "POLICY") {
|
|
106
|
+
addCollapseIssue(issues, "POLICY", "CONTRACT", CONTRACT_FIELDS, value);
|
|
107
|
+
addCollapseIssue(issues, "POLICY", "ENGAGEMENT", ENGAGEMENT_FIELDS, value);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
addCollapseIssue(issues, "ENGAGEMENT", "CONTRACT", CONTRACT_FIELDS, value);
|
|
111
|
+
addCollapseIssue(issues, "ENGAGEMENT", "POLICY", POLICY_FIELDS, value);
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
ok: issues.length === 0,
|
|
115
|
+
kind: descriptor.kind,
|
|
116
|
+
profile: descriptor.profile,
|
|
117
|
+
issues
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
export function assertContractualArtifactInvariants(value) {
|
|
121
|
+
const result = auditContractualArtifact(value);
|
|
122
|
+
if (!result.ok) {
|
|
123
|
+
throw new Error(`Contractual artifact invariant violation: ${result.issues.join("; ")}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=contractual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contractual.js","sourceRoot":"","sources":["../src/contractual.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { H2AEnforcementPlan } from "./types.js";
|
|
2
|
+
export declare const H2A_ESCALATION_CHANNELS: readonly ["advise", "decide", "alert"];
|
|
3
|
+
export declare const H2A_ESCALATION_AUTHORITY_KINDS: readonly ["PRINCIPAL", "EXECUTIF", "QUORUM", "CONTROL", "EXTERNAL_AUTHORITY", "RECOURSE"];
|
|
4
|
+
export type H2AEscalationChannel = (typeof H2A_ESCALATION_CHANNELS)[number];
|
|
5
|
+
export type H2AEscalationAuthorityKind = (typeof H2A_ESCALATION_AUTHORITY_KINDS)[number];
|
|
6
|
+
export interface H2AEscalationTargetRequest {
|
|
7
|
+
readonly scope: string;
|
|
8
|
+
readonly channel: string;
|
|
9
|
+
readonly trigger?: string;
|
|
10
|
+
readonly domain?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface H2AEscalationResolveOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Explicit mono-human fallback target. DEC-024 keeps PRINCIPAL as the
|
|
15
|
+
* default only when the caller provides that local principal target.
|
|
16
|
+
*/
|
|
17
|
+
readonly fallbackPrincipal?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface H2AEscalationResolvedTarget {
|
|
20
|
+
readonly ok: true;
|
|
21
|
+
readonly scope: string;
|
|
22
|
+
readonly channel: H2AEscalationChannel;
|
|
23
|
+
readonly trigger?: string;
|
|
24
|
+
readonly domain?: string;
|
|
25
|
+
readonly authorityKind: H2AEscalationAuthorityKind;
|
|
26
|
+
readonly target: string;
|
|
27
|
+
readonly source: "enforcement-plan" | "fallback-principal";
|
|
28
|
+
}
|
|
29
|
+
export interface H2AEscalationUnresolvedTarget {
|
|
30
|
+
readonly ok: false;
|
|
31
|
+
readonly scope?: string;
|
|
32
|
+
readonly channel?: string;
|
|
33
|
+
readonly trigger?: string;
|
|
34
|
+
readonly domain?: string;
|
|
35
|
+
readonly issues: readonly string[];
|
|
36
|
+
}
|
|
37
|
+
export type H2AEscalationResolution = H2AEscalationResolvedTarget | H2AEscalationUnresolvedTarget;
|
|
38
|
+
export declare function resolveEscalationTarget(plan: Pick<H2AEnforcementPlan, "escalations">, request: H2AEscalationTargetRequest, options?: H2AEscalationResolveOptions): H2AEscalationResolution;
|
|
39
|
+
export declare function assertEscalationTargetResolved(resolution: H2AEscalationResolution): asserts resolution is H2AEscalationResolvedTarget;
|
|
40
|
+
//# sourceMappingURL=escalation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escalation.d.ts","sourceRoot":"","sources":["../src/escalation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,eAAO,MAAM,uBAAuB,wCAI1B,CAAC;AAEX,eAAO,MAAM,8BAA8B,2FAOjC,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC5E,MAAM,MAAM,0BAA0B,GACpC,CAAC,OAAO,8BAA8B,CAAC,CAAC,MAAM,CAAC,CAAC;AAElD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,oBAAoB,CAAC;CAC5D;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,MAAM,uBAAuB,GAC/B,2BAA2B,GAC3B,6BAA6B,CAAC;AA+BlC,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC,EAC7C,OAAO,EAAE,0BAA0B,EACnC,OAAO,GAAE,2BAAgC,GACxC,uBAAuB,CA0FzB;AAED,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,uBAAuB,GAClC,OAAO,CAAC,UAAU,IAAI,2BAA2B,CAMnD"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
export const H2A_ESCALATION_CHANNELS = [
|
|
2
|
+
"advise",
|
|
3
|
+
"decide",
|
|
4
|
+
"alert"
|
|
5
|
+
];
|
|
6
|
+
export const H2A_ESCALATION_AUTHORITY_KINDS = [
|
|
7
|
+
"PRINCIPAL",
|
|
8
|
+
"EXECUTIF",
|
|
9
|
+
"QUORUM",
|
|
10
|
+
"CONTROL",
|
|
11
|
+
"EXTERNAL_AUTHORITY",
|
|
12
|
+
"RECOURSE"
|
|
13
|
+
];
|
|
14
|
+
function isEscalationChannel(value) {
|
|
15
|
+
return H2A_ESCALATION_CHANNELS.includes(value);
|
|
16
|
+
}
|
|
17
|
+
function isEscalationAuthorityKind(value) {
|
|
18
|
+
return (typeof value === "string" &&
|
|
19
|
+
H2A_ESCALATION_AUTHORITY_KINDS.includes(value));
|
|
20
|
+
}
|
|
21
|
+
function withOptionalRequestFields(base, request, routeDomain) {
|
|
22
|
+
return {
|
|
23
|
+
...base,
|
|
24
|
+
...(request.trigger ? { trigger: request.trigger } : {}),
|
|
25
|
+
...(request.domain && routeDomain === request.domain
|
|
26
|
+
? { domain: request.domain }
|
|
27
|
+
: {})
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function resolveEscalationTarget(plan, request, options = {}) {
|
|
31
|
+
if (!isEscalationChannel(request.channel)) {
|
|
32
|
+
return {
|
|
33
|
+
ok: false,
|
|
34
|
+
scope: request.scope,
|
|
35
|
+
channel: request.channel,
|
|
36
|
+
trigger: request.trigger,
|
|
37
|
+
domain: request.domain,
|
|
38
|
+
issues: [
|
|
39
|
+
`unknown escalation channel "${request.channel}" (expected advise|decide|alert)`
|
|
40
|
+
]
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const candidates = plan.escalations
|
|
44
|
+
.map((route, index) => {
|
|
45
|
+
if (typeof route.target !== "string" || route.target.length === 0) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
if (route.channel !== undefined && route.channel !== request.channel) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
if (route.scope !== undefined && route.scope !== request.scope) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
if (request.trigger && route.trigger !== request.trigger) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
if (request.domain &&
|
|
58
|
+
route.domain !== undefined &&
|
|
59
|
+
route.domain !== request.domain) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
let score = 0;
|
|
63
|
+
if (request.domain && route.domain === request.domain)
|
|
64
|
+
score += 8;
|
|
65
|
+
if (request.trigger && route.trigger === request.trigger)
|
|
66
|
+
score += 4;
|
|
67
|
+
if (route.scope === request.scope)
|
|
68
|
+
score += 2;
|
|
69
|
+
if (route.channel === request.channel)
|
|
70
|
+
score += 1;
|
|
71
|
+
return { route, index, score };
|
|
72
|
+
})
|
|
73
|
+
.filter((entry) => entry !== undefined)
|
|
74
|
+
.sort((a, b) => b.score - a.score || a.index - b.index);
|
|
75
|
+
const selected = candidates[0]?.route;
|
|
76
|
+
if (selected) {
|
|
77
|
+
return withOptionalRequestFields({
|
|
78
|
+
ok: true,
|
|
79
|
+
scope: request.scope,
|
|
80
|
+
channel: request.channel,
|
|
81
|
+
authorityKind: isEscalationAuthorityKind(selected.authorityKind)
|
|
82
|
+
? selected.authorityKind
|
|
83
|
+
: "PRINCIPAL",
|
|
84
|
+
target: selected.target,
|
|
85
|
+
source: "enforcement-plan"
|
|
86
|
+
}, request, selected.domain);
|
|
87
|
+
}
|
|
88
|
+
if (options.fallbackPrincipal) {
|
|
89
|
+
return withOptionalRequestFields({
|
|
90
|
+
ok: true,
|
|
91
|
+
scope: request.scope,
|
|
92
|
+
channel: request.channel,
|
|
93
|
+
authorityKind: "PRINCIPAL",
|
|
94
|
+
target: options.fallbackPrincipal,
|
|
95
|
+
source: "fallback-principal"
|
|
96
|
+
}, request);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
ok: false,
|
|
100
|
+
scope: request.scope,
|
|
101
|
+
channel: request.channel,
|
|
102
|
+
trigger: request.trigger,
|
|
103
|
+
domain: request.domain,
|
|
104
|
+
issues: [
|
|
105
|
+
`no escalation target for scope=${request.scope}, channel=${request.channel}${request.trigger ? `, trigger=${request.trigger}` : ""}${request.domain ? `, domain=${request.domain}` : ""}`
|
|
106
|
+
]
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
export function assertEscalationTargetResolved(resolution) {
|
|
110
|
+
if (!resolution.ok) {
|
|
111
|
+
throw new Error(`Escalation target unresolved: ${resolution.issues.join("; ")}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=escalation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escalation.js","sourceRoot":"","sources":["../src/escalation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { H2AArtifactKind } from "./types.js";
|
|
2
|
+
export interface H2ACanonicalFixtureManifestEntry {
|
|
3
|
+
/** Path relative to the package root (e.g. `fixtures/contract.json`). */
|
|
4
|
+
path: string;
|
|
5
|
+
/** The canonical {@link H2AArtifactKind} this fixture is an instance of. */
|
|
6
|
+
kind: H2AArtifactKind;
|
|
7
|
+
/** The fixture artifact's own `id`. */
|
|
8
|
+
id: string;
|
|
9
|
+
/**
|
|
10
|
+
* SHA-256 hex of the file content bytes (no `sha256:` prefix). The full
|
|
11
|
+
* canonical hash is `"sha256:" + sha256` and matches `computeHash(parsed)`.
|
|
12
|
+
*/
|
|
13
|
+
sha256: string;
|
|
14
|
+
}
|
|
15
|
+
export declare const H2A_CANONICAL_FIXTURES: readonly H2ACanonicalFixtureManifestEntry[];
|
|
16
|
+
//# sourceMappingURL=fixtures-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures-index.d.ts","sourceRoot":"","sources":["../src/fixtures-index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,gCAAgC;IAC/C,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,IAAI,EAAE,eAAe,CAAC;IACtB,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAUD,eAAO,MAAM,sBAAsB,EAAE,SAAS,gCAAgC,EACX,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
// `dist/fixtures-index.js` → package root is one level up; fixtures sit at
|
|
6
|
+
// `<package>/fixtures/` (DEC-035). Loaded once at module init from disk so
|
|
7
|
+
// the canonical bytes never drift between source and runtime.
|
|
8
|
+
const MANIFEST_PATH = join(HERE, "..", "fixtures", "manifest.json");
|
|
9
|
+
const parsed = JSON.parse(readFileSync(MANIFEST_PATH, "utf8"));
|
|
10
|
+
export const H2A_CANONICAL_FIXTURES = Object.freeze(parsed.map((entry) => Object.freeze({ ...entry })));
|
|
11
|
+
//# sourceMappingURL=fixtures-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures-index.js","sourceRoot":"","sources":["../src/fixtures-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAkBzC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,2EAA2E;AAC3E,2EAA2E;AAC3E,8DAA8D;AAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;AAEpE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAuC,CAAC;AAErG,MAAM,CAAC,MAAM,sBAAsB,GACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC"}
|