@sentropic/h2a 0.1.0 → 0.1.6

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 (61) hide show
  1. package/README.md +10 -0
  2. package/dist/abc.d.ts +214 -0
  3. package/dist/abc.d.ts.map +1 -0
  4. package/dist/abc.js +273 -0
  5. package/dist/abc.js.map +1 -0
  6. package/dist/artifacts.d.ts +10 -0
  7. package/dist/artifacts.d.ts.map +1 -0
  8. package/dist/artifacts.js +147 -0
  9. package/dist/artifacts.js.map +1 -0
  10. package/dist/authority.d.ts +21 -0
  11. package/dist/authority.d.ts.map +1 -0
  12. package/dist/authority.js +73 -0
  13. package/dist/authority.js.map +1 -0
  14. package/dist/canonical.d.ts +3 -0
  15. package/dist/canonical.d.ts.map +1 -0
  16. package/dist/canonical.js +38 -0
  17. package/dist/canonical.js.map +1 -0
  18. package/dist/contractual.d.ts +52 -0
  19. package/dist/contractual.d.ts.map +1 -0
  20. package/dist/contractual.js +126 -0
  21. package/dist/contractual.js.map +1 -0
  22. package/dist/escalation.d.ts +40 -0
  23. package/dist/escalation.d.ts.map +1 -0
  24. package/dist/escalation.js +114 -0
  25. package/dist/escalation.js.map +1 -0
  26. package/dist/fixtures-index.d.ts +16 -0
  27. package/dist/fixtures-index.d.ts.map +1 -0
  28. package/dist/fixtures-index.js +11 -0
  29. package/dist/fixtures-index.js.map +1 -0
  30. package/dist/governance-boundary.d.ts +118 -0
  31. package/dist/governance-boundary.d.ts.map +1 -0
  32. package/dist/governance-boundary.js +143 -0
  33. package/dist/governance-boundary.js.map +1 -0
  34. package/dist/index.d.ts +21 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +12 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/journal.d.ts +37 -0
  39. package/dist/journal.d.ts.map +1 -0
  40. package/dist/journal.js +73 -0
  41. package/dist/journal.js.map +1 -0
  42. package/dist/multi-human.d.ts +106 -0
  43. package/dist/multi-human.d.ts.map +1 -0
  44. package/dist/multi-human.js +116 -0
  45. package/dist/multi-human.js.map +1 -0
  46. package/dist/signature.d.ts +8 -0
  47. package/dist/signature.d.ts.map +1 -0
  48. package/dist/signature.js +39 -0
  49. package/dist/signature.js.map +1 -0
  50. package/dist/types.d.ts +105 -1
  51. package/dist/types.d.ts.map +1 -1
  52. package/dist/types.js +12 -1
  53. package/dist/types.js.map +1 -1
  54. package/fixtures/authority.json +1 -0
  55. package/fixtures/contract.json +1 -0
  56. package/fixtures/enforcement-plan.json +1 -0
  57. package/fixtures/engagement.json +1 -0
  58. package/fixtures/mandate.json +1 -0
  59. package/fixtures/manifest.json +38 -0
  60. package/fixtures/policy.json +1 -0
  61. package/package.json +4 -3
@@ -0,0 +1,147 @@
1
+ import { H2A_ARTIFACT_KINDS, H2A_AUTHORITY_KINDS, H2A_POLICY_ADOPTION_MODES, H2A_ROLES } from "./types.js";
2
+ function isRecord(value) {
3
+ return typeof value === "object" && value !== null;
4
+ }
5
+ function isStringArray(value) {
6
+ return Array.isArray(value) && value.every((entry) => typeof entry === "string");
7
+ }
8
+ function isArrayOf(value, check) {
9
+ return Array.isArray(value) && value.every((entry) => check(entry));
10
+ }
11
+ function isRole(value) {
12
+ return typeof value === "string" && H2A_ROLES.includes(value);
13
+ }
14
+ function isArtifactKind(value) {
15
+ return typeof value === "string" && H2A_ARTIFACT_KINDS.includes(value);
16
+ }
17
+ export function isSignature(value) {
18
+ return (isRecord(value) &&
19
+ typeof value.by === "string" &&
20
+ typeof value.alg === "string" &&
21
+ typeof value.value === "string");
22
+ }
23
+ export function isContract(value) {
24
+ if (!isRecord(value))
25
+ return false;
26
+ return (value.kind === "CONTRACT" &&
27
+ typeof value.id === "string" &&
28
+ isStringArray(value.parties) &&
29
+ typeof value.scope === "string" &&
30
+ Array.isArray(value.clauses) &&
31
+ isStringArray(value.policies) &&
32
+ isStringArray(value.engagements) &&
33
+ isArrayOf(value.signatures, isSignature));
34
+ }
35
+ export function isPolicy(value) {
36
+ if (!isRecord(value))
37
+ return false;
38
+ return (value.kind === "POLICY" &&
39
+ typeof value.id === "string" &&
40
+ typeof value.scope === "string" &&
41
+ typeof value.rule === "string" &&
42
+ typeof value.sourceAuthority === "string" &&
43
+ typeof value.adoptionMode === "string" &&
44
+ H2A_POLICY_ADOPTION_MODES.includes(value.adoptionMode));
45
+ }
46
+ export function isEngagement(value) {
47
+ if (!isRecord(value))
48
+ return false;
49
+ if (value.kind !== "ENGAGEMENT")
50
+ return false;
51
+ if (typeof value.id !== "string")
52
+ return false;
53
+ if (typeof value.scope !== "string")
54
+ return false;
55
+ if (!isRecord(value.charter))
56
+ return false;
57
+ if (!Array.isArray(value.roleBindings))
58
+ return false;
59
+ for (const binding of value.roleBindings) {
60
+ if (!isRecord(binding))
61
+ return false;
62
+ if (!isRole(binding.role))
63
+ return false;
64
+ if (typeof binding.instance !== "string")
65
+ return false;
66
+ }
67
+ return (isStringArray(value.controls) &&
68
+ isStringArray(value.policies) &&
69
+ Array.isArray(value.successCriteria));
70
+ }
71
+ export function isAmendment(value) {
72
+ if (!isRecord(value))
73
+ return false;
74
+ if (value.kind !== "AMENDMENT")
75
+ return false;
76
+ if (typeof value.id !== "string")
77
+ return false;
78
+ if (!isArtifactKind(value.targetKind))
79
+ return false;
80
+ if (typeof value.targetId !== "string")
81
+ return false;
82
+ if (typeof value.baseArtifactHash !== "string")
83
+ return false;
84
+ if (!Array.isArray(value.changes))
85
+ return false;
86
+ for (const change of value.changes) {
87
+ if (!isRecord(change))
88
+ return false;
89
+ if (typeof change.op !== "string")
90
+ return false;
91
+ if (typeof change.path !== "string")
92
+ return false;
93
+ }
94
+ return isArrayOf(value.signatures, isSignature);
95
+ }
96
+ export function isMandate(value) {
97
+ if (!isRecord(value))
98
+ return false;
99
+ return (value.kind === "MANDATE" &&
100
+ typeof value.id === "string" &&
101
+ typeof value.instance === "string" &&
102
+ isRole(value.role) &&
103
+ typeof value.scope === "string" &&
104
+ isStringArray(value.rights));
105
+ }
106
+ export function isAuthority(value) {
107
+ if (!isRecord(value))
108
+ return false;
109
+ if (value.kind !== "AUTHORITY")
110
+ return false;
111
+ if (typeof value.id !== "string")
112
+ return false;
113
+ if (typeof value.authorityKind !== "string")
114
+ return false;
115
+ if (!H2A_AUTHORITY_KINDS.includes(value.authorityKind)) {
116
+ return false;
117
+ }
118
+ if (!isStringArray(value.members))
119
+ return false;
120
+ if (value.authorityKind === "quorum") {
121
+ if (typeof value.threshold !== "number")
122
+ return false;
123
+ if (!Number.isInteger(value.threshold) || value.threshold < 1)
124
+ return false;
125
+ if (value.threshold > value.members.length)
126
+ return false;
127
+ }
128
+ return true;
129
+ }
130
+ export function isEnforcementPlan(value) {
131
+ if (!isRecord(value))
132
+ return false;
133
+ if (value.kind !== "ENFORCEMENT_PLAN")
134
+ return false;
135
+ if (typeof value.id !== "string")
136
+ return false;
137
+ if (typeof value.scope !== "string")
138
+ return false;
139
+ if (!Array.isArray(value.controls))
140
+ return false;
141
+ if (!Array.isArray(value.escalations))
142
+ return false;
143
+ if (!Array.isArray(value.triggers))
144
+ return false;
145
+ return true;
146
+ }
147
+ //# sourceMappingURL=artifacts.js.map
@@ -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,3 @@
1
+ export declare function canonicalize(value: unknown): string;
2
+ export declare function computeHash(value: unknown): string;
3
+ //# sourceMappingURL=canonical.d.ts.map
@@ -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"}