holarchy-core-logic 0.2.0 → 0.3.0

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 (56) hide show
  1. package/dist/authoring.d.ts +1 -1
  2. package/dist/authoring.d.ts.map +1 -1
  3. package/dist/authoring.js +8 -9
  4. package/dist/authoring.js.map +1 -1
  5. package/dist/authority-store.d.ts +7 -2
  6. package/dist/authority-store.d.ts.map +1 -1
  7. package/dist/authority-store.js +21 -8
  8. package/dist/authority-store.js.map +1 -1
  9. package/dist/effective.d.ts +1 -3
  10. package/dist/effective.d.ts.map +1 -1
  11. package/dist/effective.js +0 -2
  12. package/dist/effective.js.map +1 -1
  13. package/dist/governance-policy.d.ts +5 -0
  14. package/dist/governance-policy.d.ts.map +1 -0
  15. package/dist/governance-policy.js +57 -0
  16. package/dist/governance-policy.js.map +1 -0
  17. package/dist/index.d.ts +15 -8
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +12 -6
  20. package/dist/index.js.map +1 -1
  21. package/dist/organization-authority.d.ts +10 -0
  22. package/dist/organization-authority.d.ts.map +1 -0
  23. package/dist/organization-authority.js +229 -0
  24. package/dist/organization-authority.js.map +1 -0
  25. package/dist/organization-entity.d.ts +6 -0
  26. package/dist/organization-entity.d.ts.map +1 -0
  27. package/dist/organization-entity.js +95 -0
  28. package/dist/organization-entity.js.map +1 -0
  29. package/dist/organization-field-edits.d.ts +4 -0
  30. package/dist/organization-field-edits.d.ts.map +1 -0
  31. package/dist/organization-field-edits.js +89 -0
  32. package/dist/organization-field-edits.js.map +1 -0
  33. package/dist/organization-mutations.d.ts +43 -0
  34. package/dist/organization-mutations.d.ts.map +1 -0
  35. package/dist/organization-mutations.js +295 -0
  36. package/dist/organization-mutations.js.map +1 -0
  37. package/dist/organization-reconciliation.d.ts +86 -0
  38. package/dist/organization-reconciliation.d.ts.map +1 -0
  39. package/dist/organization-reconciliation.js +290 -0
  40. package/dist/organization-reconciliation.js.map +1 -0
  41. package/dist/organization-scope.d.ts +8 -0
  42. package/dist/organization-scope.d.ts.map +1 -0
  43. package/dist/organization-scope.js +89 -0
  44. package/dist/organization-scope.js.map +1 -0
  45. package/dist/organization-snapshot-timeline.d.ts.map +1 -1
  46. package/dist/organization-snapshot-timeline.js +1 -25
  47. package/dist/organization-snapshot-timeline.js.map +1 -1
  48. package/dist/organization-state.d.ts +25 -0
  49. package/dist/organization-state.d.ts.map +1 -0
  50. package/dist/organization-state.js +314 -0
  51. package/dist/organization-state.js.map +1 -0
  52. package/dist/validator.d.ts +6 -5
  53. package/dist/validator.d.ts.map +1 -1
  54. package/dist/validator.js +3 -1
  55. package/dist/validator.js.map +1 -1
  56. package/package.json +30 -12
@@ -0,0 +1,57 @@
1
+ import { HOLARCHY_CONSTRAINTS_PROFILE } from "holarchy-core-contract";
2
+ /** A closed, versioned policy evaluator. Unknown legacy profiles remain informational. */
3
+ export function evaluateGovernancePolicies(facts, effectiveDate) {
4
+ const diagnostics = [];
5
+ const parsed = new Map();
6
+ const emit = (policy, code, path, message, extra = {}) => diagnostics.push({ code, path, message, detail: { policyId: policy.governancePolicyId, policyVersionId: policy.id, holonId: policy.holonId, profile: policy.profile, ...extra } });
7
+ for (const policy of facts.governancePolicyVersions) {
8
+ if (policy.profile !== HOLARCHY_CONSTRAINTS_PROFILE)
9
+ continue;
10
+ const rules = policy.rules;
11
+ if (!rules || typeof rules !== "object" || Array.isArray(rules) || Object.keys(rules).length !== 1 || !Object.hasOwn(rules, "roleAssignmentLimits") || !Array.isArray(rules.roleAssignmentLimits)) {
12
+ emit(policy, "INVALID_GOVERNANCE_POLICY", `${policy.path}.rules`, "Expected only roleAssignmentLimits in holarchy.constraints/v1");
13
+ continue;
14
+ }
15
+ const invalidBefore = diagnostics.length;
16
+ const limits = [], roles = new Set();
17
+ for (const [index, value] of rules.roleAssignmentLimits.entries()) {
18
+ const path = `${policy.path}.rules.roleAssignmentLimits[${index}]`;
19
+ if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).length !== 2 || !Object.hasOwn(value, "roleId") || !Object.hasOwn(value, "maxActive") || typeof value.roleId !== "string" || !value.roleId || !Number.isSafeInteger(value.maxActive) || Number(value.maxActive) < 0) {
20
+ emit(policy, "INVALID_GOVERNANCE_POLICY", path, "Expected roleId and a nonnegative safe-integer maxActive");
21
+ continue;
22
+ }
23
+ const role = facts.roles.find(({ id }) => id === value.roleId);
24
+ if (!role || role.holonId !== policy.holonId) {
25
+ emit(policy, "GOVERNANCE_ROLE_SCOPE_MISMATCH", `${path}.roleId`, "Policy must reference an existing Role in the same Holon", { roleId: value.roleId });
26
+ continue;
27
+ }
28
+ if (roles.has(value.roleId)) {
29
+ emit(policy, "INVALID_GOVERNANCE_POLICY", `${path}.roleId`, "Duplicate role assignment limit", { roleId: value.roleId });
30
+ continue;
31
+ }
32
+ roles.add(value.roleId);
33
+ limits.push({ roleId: value.roleId, maxActive: Number(value.maxActive) });
34
+ }
35
+ if (diagnostics.length === invalidBefore)
36
+ parsed.set(policy.id, limits);
37
+ }
38
+ const boundaries = new Set([effectiveDate, ...facts.governancePolicyVersions.map(v => v.effectiveDate), ...facts.roleAssignmentVersions.map(v => v.effectiveDate)]);
39
+ const selected = (rows, key, day) => {
40
+ const chosen = new Map();
41
+ for (const row of [...rows].sort((a, b) => a.effectiveDate.localeCompare(b.effectiveDate) || a.sequence - b.sequence))
42
+ if (row.effectiveDate <= day)
43
+ chosen.set(row[key], row);
44
+ return [...chosen.values()].filter(row => row.effectiveState);
45
+ };
46
+ for (const day of [...boundaries].sort()) {
47
+ const assignments = selected(facts.roleAssignmentVersions, "roleAssignmentId", day);
48
+ for (const policy of selected(facts.governancePolicyVersions, "governancePolicyId", day))
49
+ for (const [index, limit] of (parsed.get(policy.id) ?? []).entries()) {
50
+ const assignmentIds = assignments.filter(a => a.roleId === limit.roleId).map(a => a.roleAssignmentId).sort();
51
+ if (assignmentIds.length > limit.maxActive)
52
+ emit(policy, "GOVERNANCE_ROLE_ASSIGNMENT_LIMIT", `${policy.path}.rules.roleAssignmentLimits[${index}]`, `Policy ${policy.governancePolicyId} limits Role ${limit.roleId} to ${limit.maxActive} active assignments, found ${assignmentIds.length} on ${day}`, { roleId: limit.roleId, assignmentIds, effectiveDate: day, maxActive: limit.maxActive, actualActive: assignmentIds.length });
53
+ }
54
+ }
55
+ return diagnostics;
56
+ }
57
+ //# sourceMappingURL=governance-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance-policy.js","sourceRoot":"","sources":["../src/governance-policy.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,16 @@
1
- export { AuthoringContractError, parseAuthorDraftCommand, parseHolarchyChange, parseHolarchyDraft, planHolarchyChangeSet, previewBasis, projectHolarchySnapshot, sha256Basis, } from "./authoring";
2
- export type { HolarchyChangeSetPlan, HolarchyMutationPlanStep, PlannedIdentityCreate, PlannedVersionAppend, VersionEntity } from "./authoring";
3
- export { EffectiveFactValidationError, assertEffectiveEvent, booleanValue, effectiveEventsInRange, isCanonicalDay, isUtcInstant, jsonObject, nullableString, numberValue, projectEffectiveRows, stringValue, } from "./effective";
4
- export { OrganizationSnapshotProjectionError, projectOrganizationSnapshot } from "./effective-snapshot";
5
- export { OrganizationSnapshotTimelineError, createOrganizationSnapshotTimelineReadPort, type OrganizationSnapshotTimelineRuntime, } from "./organization-snapshot-timeline";
6
- export { HolonAuthorityContractError, commitHolonAuthority, digestHolonAuthoritySnapshot, normalizeHolonAuthorityTables } from "./authority-store";
7
- export { validateDesiredHolarchy } from "./validator";
8
- export type { DesiredEffectiveFact, DesiredGovernancePolicyVersion, DesiredHolarchyFacts, DesiredHolonVersion, DesiredMemberVersion, DesiredMembershipVersion, DesiredRoleAssignmentVersion, DesiredRoleVersion, } from "./validator";
1
+ export { AuthoringContractError, parseAuthorDraftCommand, parseHolarchyChange, parseHolarchyDraft, planHolarchyChangeSet, previewBasis, projectHolarchySnapshot, sha256Basis } from "./authoring.js";
2
+ export type { HolarchyChangeSetPlan, HolarchyMutationPlanStep, PlannedIdentityCreate, PlannedVersionAppend, VersionEntity } from "./authoring.js";
3
+ export { EffectiveFactValidationError, assertEffectiveEvent, booleanValue, effectiveEventsInRange, isCanonicalDay, isUtcInstant, jsonObject, nullableString, numberValue, projectEffectiveRows, stringValue } from "./effective.js";
4
+ export { OrganizationSnapshotProjectionError, projectOrganizationSnapshot } from "./effective-snapshot.js";
5
+ export { OrganizationSnapshotTimelineError, createOrganizationSnapshotTimelineReadPort, type OrganizationSnapshotTimelineRuntime } from "./organization-snapshot-timeline.js";
6
+ export { HolonAuthorityContractError, commitHolonAuthority, digestHolonAuthoritySnapshot, normalizeHolonAuthorityTables } from "./authority-store.js";
7
+ export { validateDesiredHolarchy } from "./validator.js";
8
+ export type { DesiredEffectiveFact, DesiredGovernancePolicyVersion, DesiredHolarchyFacts, DesiredHolonVersion, DesiredMemberVersion, DesiredMembershipVersion, DesiredRoleAssignmentVersion, DesiredRoleVersion } from "./validator.js";
9
+ export { loadOrganizationState, previewOrganizationChangeSet, commitOrganizationChangeSet, executeOrganizationCommands, holonAuthorityTablesToFacts } from "./organization-authority.js";
10
+ export { dispatchOrganizationChangeSet, parseOrganizationEntityFields, parseOrganizationEntity, parseOrganizationState, parseOrganizationChangeSet, applyOrganizationChangeSet, diffOrganizationStates, planOrganizationCommands, projectOrganizationStateFromFacts, organizationStateToFacts, canonicalOrganizationValue, requireCompleteOrganizationState } from "./organization-state.js";
11
+ export { reconcileOrganization, createReconciledChangeSet } from "./organization-reconciliation.js";
12
+ export type { OrganizationReconciliationRuntime, OrganizationLocalProposal, OrganizationReconciliationInput, OrganizationReconciliationCause, OrganizationReconciliationEpoch, OrganizationReconciliationResult, ReconciledOrganizationChangeSet } from "./organization-reconciliation.js";
13
+ export { evaluateGovernancePolicies } from "./governance-policy.js";
14
+ export { createTrustedOrganizationRuntime, projectOrganizationScope, assertOrganizationWriteScope, resolveOrganizationWriteScope } from "./organization-scope.js";
15
+ export * from "./organization-mutations.js";
9
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,EACZ,uBAAuB,EACvB,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/I,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,cAAc,EACd,WAAW,EACX,oBAAoB,EACpB,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mCAAmC,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACxG,OAAO,EACL,iCAAiC,EACjC,0CAA0C,EAC1C,KAAK,mCAAmC,GACzC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AACnJ,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EACV,oBAAoB,EACpB,8BAA8B,EAC9B,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,YAAY,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACrM,YAAY,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClJ,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACpO,OAAO,EAAE,mCAAmC,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAC3G,OAAO,EAAE,iCAAiC,EAAE,0CAA0C,EAAE,KAAK,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAC9K,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACtJ,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACxO,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AACzL,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,iCAAiC,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAC7X,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AACpG,YAAY,EAAE,iCAAiC,EAAE,yBAAyB,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,gCAAgC,EAAE,+BAA+B,EAAE,MAAM,kCAAkC,CAAC;AAC3R,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,gCAAgC,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAElK,cAAc,6BAA6B,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,13 @@
1
- export { AuthoringContractError, parseAuthorDraftCommand, parseHolarchyChange, parseHolarchyDraft, planHolarchyChangeSet, previewBasis, projectHolarchySnapshot, sha256Basis, } from "./authoring";
2
- export { EffectiveFactValidationError, assertEffectiveEvent, booleanValue, effectiveEventsInRange, isCanonicalDay, isUtcInstant, jsonObject, nullableString, numberValue, projectEffectiveRows, stringValue, } from "./effective";
3
- export { OrganizationSnapshotProjectionError, projectOrganizationSnapshot } from "./effective-snapshot";
4
- export { OrganizationSnapshotTimelineError, createOrganizationSnapshotTimelineReadPort, } from "./organization-snapshot-timeline";
5
- export { HolonAuthorityContractError, commitHolonAuthority, digestHolonAuthoritySnapshot, normalizeHolonAuthorityTables } from "./authority-store";
6
- export { validateDesiredHolarchy } from "./validator";
1
+ export { AuthoringContractError, parseAuthorDraftCommand, parseHolarchyChange, parseHolarchyDraft, planHolarchyChangeSet, previewBasis, projectHolarchySnapshot, sha256Basis } from "./authoring.js";
2
+ export { EffectiveFactValidationError, assertEffectiveEvent, booleanValue, effectiveEventsInRange, isCanonicalDay, isUtcInstant, jsonObject, nullableString, numberValue, projectEffectiveRows, stringValue } from "./effective.js";
3
+ export { OrganizationSnapshotProjectionError, projectOrganizationSnapshot } from "./effective-snapshot.js";
4
+ export { OrganizationSnapshotTimelineError, createOrganizationSnapshotTimelineReadPort } from "./organization-snapshot-timeline.js";
5
+ export { HolonAuthorityContractError, commitHolonAuthority, digestHolonAuthoritySnapshot, normalizeHolonAuthorityTables } from "./authority-store.js";
6
+ export { validateDesiredHolarchy } from "./validator.js";
7
+ export { loadOrganizationState, previewOrganizationChangeSet, commitOrganizationChangeSet, executeOrganizationCommands, holonAuthorityTablesToFacts } from "./organization-authority.js";
8
+ export { dispatchOrganizationChangeSet, parseOrganizationEntityFields, parseOrganizationEntity, parseOrganizationState, parseOrganizationChangeSet, applyOrganizationChangeSet, diffOrganizationStates, planOrganizationCommands, projectOrganizationStateFromFacts, organizationStateToFacts, canonicalOrganizationValue, requireCompleteOrganizationState } from "./organization-state.js";
9
+ export { reconcileOrganization, createReconciledChangeSet } from "./organization-reconciliation.js";
10
+ export { evaluateGovernancePolicies } from "./governance-policy.js";
11
+ export { createTrustedOrganizationRuntime, projectOrganizationScope, assertOrganizationWriteScope, resolveOrganizationWriteScope } from "./organization-scope.js";
12
+ export * from "./organization-mutations.js";
7
13
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,EACZ,uBAAuB,EACvB,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,cAAc,EACd,WAAW,EACX,oBAAoB,EACpB,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mCAAmC,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACxG,OAAO,EACL,iCAAiC,EACjC,0CAA0C,GAE3C,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AACnJ,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,YAAY,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAErM,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACpO,OAAO,EAAE,mCAAmC,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAC3G,OAAO,EAAE,iCAAiC,EAAE,0CAA0C,EAA4C,MAAM,qCAAqC,CAAC;AAC9K,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACtJ,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AACzL,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,iCAAiC,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAC7X,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAEpG,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,gCAAgC,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAElK,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type HolonAuthorityTables, type HolonGovernanceRuntime, type OrganizationAuthoringRuntime, type OrganizationState, type OrganizationChangeSet, type OrganizationCommitConfig, type OrganizationCommitResult, type OrganizationPreviewResult, type LoadOrganizationStateInput, type ExecuteOrganizationCommandsInput } from "holarchy-core-contract";
2
+ import { type DesiredHolarchyFacts } from "./validator.js";
3
+ /** Complete native history for shared temporal validation and projections. */
4
+ export declare function holonAuthorityTablesToFacts(input: HolonAuthorityTables): DesiredHolarchyFacts;
5
+ export declare function loadOrganizationState(runtime: HolonGovernanceRuntime, input: LoadOrganizationStateInput): Promise<OrganizationState>;
6
+ /** Strong read-only preview: the same full-history and scope preparation used by commit. */
7
+ export declare function previewOrganizationChangeSet(runtime: OrganizationAuthoringRuntime, input: OrganizationChangeSet, configValue: OrganizationCommitConfig): Promise<OrganizationPreviewResult>;
8
+ export declare function commitOrganizationChangeSet(runtime: OrganizationAuthoringRuntime, input: OrganizationChangeSet, configValue: OrganizationCommitConfig): Promise<OrganizationCommitResult>;
9
+ export declare function executeOrganizationCommands(runtime: OrganizationAuthoringRuntime, input: ExecuteOrganizationCommandsInput, configValue: OrganizationCommitConfig): Promise<OrganizationCommitResult>;
10
+ //# sourceMappingURL=organization-authority.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organization-authority.d.ts","sourceRoot":"","sources":["../src/organization-authority.ts"],"names":[],"mappings":"AAIA,OAAO,EAEmD,KAAK,oBAAoB,EACjF,KAAK,sBAAsB,EAAE,KAAK,4BAA4B,EAC9D,KAAK,iBAAiB,EAA2B,KAAK,qBAAqB,EAC3E,KAAK,wBAAwB,EAAE,KAAK,wBAAwB,EAC5D,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAAE,KAAK,gCAAgC,EACvE,MAAM,wBAAwB,CAAC;AAShC,OAAO,EAA2B,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAapF,8EAA8E;AAC9E,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,oBAAoB,GAAG,oBAAoB,CAM7F;AAYD,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,EAAE,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAK1I;AAkHD,4FAA4F;AAC5F,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,4BAA4B,EAAE,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAUjM;AAED,wBAAsB,2BAA2B,CAAC,OAAO,EAAE,4BAA4B,EAAE,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAW/L;AAED,wBAAsB,2BAA2B,CAAC,OAAO,EAAE,4BAA4B,EAAE,KAAK,EAAE,gCAAgC,EAAE,WAAW,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAuB1M"}
@@ -0,0 +1,229 @@
1
+ import { createOrganizationMutationRuntime } from "./organization-mutations.js";
2
+ import { dispatchOrganizationChangeSet } from "./organization-state.js";
3
+ import { assertOrganizationWriteScope, resolveOrganizationWriteScope } from "./organization-scope.js";
4
+ import { createHash } from "node:crypto";
5
+ import { HOLON_AUTHORITY_API_VERSION, ORGANIZATION_DSL_SCHEMA, } from "holarchy-core-contract";
6
+ import { commitHolonAuthority, dataRecord, json, normalizeHolonAuthorityTables, HolonAuthorityContractError } from "./authority-store.js";
7
+ import { isUtcInstant } from "./effective.js";
8
+ import { parseHolarchyDraft } from "./authoring.js";
9
+ import { applyOrganizationChangeSet, canonicalOrganizationValue, diffOrganizationStates, materializeOrganizationChangeSet, parseOrganizationChangeSet, parseOrganizationState, planOrganizationCommands, projectOrganizationStateFromFacts, } from "./organization-state.js";
10
+ import { validateDesiredHolarchy } from "./validator.js";
11
+ const fail = (code, path, message) => { throw new HolonAuthorityContractError(code, path, message); };
12
+ const auditKind = "OrganizationChangeSetCommitted";
13
+ const factTables = {
14
+ subjects: "OrganizationalSubject", members: "Member", memberVersions: "MemberVersion",
15
+ holons: "Holon", holonVersions: "HolonVersion", memberships: "HolonMembership",
16
+ membershipVersions: "HolonMembershipVersion", roles: "Role", roleVersions: "RoleVersion",
17
+ roleAssignments: "RoleAssignment", roleAssignmentVersions: "RoleAssignmentVersion",
18
+ governancePolicies: "GovernancePolicy", governancePolicyVersions: "GovernancePolicyVersion",
19
+ };
20
+ /** Complete native history for shared temporal validation and projections. */
21
+ export function holonAuthorityTablesToFacts(input) {
22
+ const tables = normalizeHolonAuthorityTables(input);
23
+ return Object.fromEntries(Object.entries(factTables).map(([key, entity]) => [key,
24
+ (tables[entity] ?? []).map((row, index) => key.endsWith("Versions")
25
+ ? { ...row, path: `$.tables.${entity}[${index}]` } : { ...row }),
26
+ ]));
27
+ }
28
+ function basis(input, revision) {
29
+ const state = parseOrganizationState({ schema: ORGANIZATION_DSL_SCHEMA, authorityId: input.authorityId, effectiveDate: input.effectiveDate, revision, entities: [] });
30
+ return { schema: state.schema, authorityId: state.authorityId, effectiveDate: state.effectiveDate, revision: state.revision };
31
+ }
32
+ function project(current, input) {
33
+ if (current.apiVersion !== HOLON_AUTHORITY_API_VERSION || current.authorityId !== input.authorityId)
34
+ fail("authority-mismatch", "$.authorityId", "Organization authority does not match the store");
35
+ return projectOrganizationStateFromFacts(holonAuthorityTablesToFacts(current.tables), basis(input, current.revision));
36
+ }
37
+ export async function loadOrganizationState(runtime, input) {
38
+ const request = dataRecord(input, "$.input");
39
+ if (Object.keys(request).length !== 2 || !Object.hasOwn(request, "authorityId") || !Object.hasOwn(request, "effectiveDate"))
40
+ fail("invalid-load-request", "$.input", "Expected authorityId and effectiveDate");
41
+ const selected = basis(request, 0);
42
+ return project(await runtime.store.load(), selected);
43
+ }
44
+ function execution(value) {
45
+ const config = dataRecord(value, "$.config");
46
+ if (Object.keys(config).some((key) => !["actorRef", "executionId", "executionInstant"].includes(key)))
47
+ fail("invalid-execution", "$.config", "Unknown execution fact");
48
+ for (const key of ["actorRef", "executionId"])
49
+ if (typeof config[key] !== "string" || config[key].length === 0)
50
+ fail("invalid-execution", `$.config.${key}`, "Expected a nonempty execution fact");
51
+ if (!isUtcInstant(config.executionInstant))
52
+ fail("invalid-execution", "$.config.executionInstant", "Expected a canonical UTC instant");
53
+ return config;
54
+ }
55
+ function requestDigest(request, actorRef) {
56
+ return `sha256:${createHash("sha256").update(canonicalOrganizationValue({ request, actorRef })).digest("hex")}`;
57
+ }
58
+ function priorAcceptance(current, id, digest) {
59
+ const existing = (current.tables.HolarchyChangeSet ?? []).find((row) => row.id === id);
60
+ if (!existing)
61
+ return undefined;
62
+ const event = (current.tables.HolarchyChangeEvent ?? []).find((row) => row.changeSetId === id && row.kind === auditKind);
63
+ const detail = event && dataRecord(event.detail, "$.accepted.detail");
64
+ if (!detail || detail.requestDigest !== digest)
65
+ fail("request-id-conflict", "$.changeSet.id", "Request identity already has a different accepted payload");
66
+ const result = dataRecord(detail.result, "$.accepted.detail.result");
67
+ if (result.status !== "committed" || result.authorityId !== current.authorityId || result.changeSetId !== id || !Number.isSafeInteger(result.revision) || Number(result.revision) > current.revision || !Number.isSafeInteger(result.sequence) || typeof result.executionId !== "string" || !isUtcInstant(result.committedAt))
68
+ fail("invalid-acceptance", "$.accepted.detail.result", "Stored acceptance metadata is invalid");
69
+ return Object.freeze({ ...result });
70
+ }
71
+ const storage = {
72
+ Holon: { identity: "Holon", version: "HolonVersion", logicalKey: "holonId", identityFields: ["subjectId", "code"], versionFields: ["name", "purpose", "boundary"] },
73
+ Member: { identity: "Member", version: "MemberVersion", logicalKey: "memberId", identityFields: ["subjectId"], versionFields: ["displayName", "principalKind"] },
74
+ Membership: { identity: "HolonMembership", version: "HolonMembershipVersion", logicalKey: "membershipId", identityFields: [], versionFields: ["subjectId", "parentHolonId", "mode"] },
75
+ Role: { identity: "Role", version: "RoleVersion", logicalKey: "roleId", identityFields: ["holonId"], versionFields: ["name", "purpose", "domains", "accountabilities", "policies", "capabilityRequirements"] },
76
+ RoleAssignment: { identity: "RoleAssignment", version: "RoleAssignmentVersion", logicalKey: "roleAssignmentId", identityFields: [], versionFields: ["membershipId", "roleId"] },
77
+ GovernancePolicy: { identity: "GovernancePolicy", version: "GovernancePolicyVersion", logicalKey: "governancePolicyId", identityFields: ["holonId"], versionFields: ["holonId", "name", "profile", "rules"] },
78
+ };
79
+ function assertPersistedIdentities(current, base, group) {
80
+ const identities = new Set(Object.values(storage).flatMap(({ identity }) => (current.tables[identity] ?? []).map((row) => String(row.id))));
81
+ const visible = new Set(base.entities.map((entity) => entity.id));
82
+ for (const mutation of group.mutations) {
83
+ if (identities.has(mutation.entityId) && ((!mutation.type && mutation.after === null) || mutation.type?.endsWith("Delete")))
84
+ fail("persisted-identity-delete", `$.mutations.${mutation.id}`, "Persisted identities must be deactivated, not deleted");
85
+ if (identities.has(mutation.entityId) && !visible.has(mutation.entityId))
86
+ fail("persisted-identity-conflict", `$.mutations.${mutation.id}`, "Identity already exists outside the selected effective projection");
87
+ }
88
+ }
89
+ function appendCandidate(current, base, group, config, preparedState) {
90
+ const tables = Object.fromEntries(Object.entries(current.tables).map(([entity, rows]) => [entity, [...(rows ?? [])]]));
91
+ assertPersistedIdentities(current, base, group);
92
+ const desired = preparedState ?? applyOrganizationChangeSet(base, group);
93
+ const net = diffOrganizationStates(base, desired, group.id);
94
+ let sequence = current.sequence;
95
+ const append = (entity, row) => {
96
+ const rows = tables[entity] ?? (tables[entity] = []);
97
+ if (rows.some((existing) => existing.id === row.id))
98
+ fail("duplicate-row", `$.tables.${entity}`, "Generated row identity is already present");
99
+ rows.push(row);
100
+ };
101
+ const created = { createdAt: config.executionInstant, createdBy: config.actorRef };
102
+ for (const mutation of materializeOrganizationChangeSet(base, net)) {
103
+ if (mutation.after === null)
104
+ continue; // A never-persisted transient identity leaves no fact history.
105
+ const entity = mutation.after, spec = storage[entity.kind], data = entity;
106
+ if (mutation.before === null) {
107
+ if (entity.kind === "Holon" || entity.kind === "Member")
108
+ append("OrganizationalSubject", { id: entity.subjectId, subjectType: entity.kind === "Holon" ? "holon" : "member" });
109
+ append(spec.identity, { id: entity.id, ...Object.fromEntries(spec.identityFields.map((key) => [key, data[key]])), ...created });
110
+ }
111
+ sequence += 1;
112
+ if (!Number.isSafeInteger(sequence))
113
+ fail("invalid-sequence", "$.sequence", "Authority sequence is exhausted");
114
+ append(spec.version, {
115
+ id: `${group.id}:version:${sequence}`, [spec.logicalKey]: entity.id,
116
+ ...Object.fromEntries(spec.versionFields.map((key) => [key, data[key]])),
117
+ effectiveDate: group.effectiveDate, effectiveState: entity.effectiveState,
118
+ ...created, changeSetId: group.id, sequence,
119
+ });
120
+ }
121
+ const normalized = normalizeHolonAuthorityTables(tables);
122
+ const diagnostics = validateDesiredHolarchy(holonAuthorityTablesToFacts(normalized), group.effectiveDate);
123
+ if (diagnostics.length)
124
+ throw new HolonAuthorityContractError("invalid-organization-history", diagnostics[0].path, diagnostics.map(({ code, message }) => `${code}: ${message}`).join("; "), diagnostics);
125
+ return { tables: normalized, sequence, changed: net.mutations.length > 0 };
126
+ }
127
+ async function accept(runtime, current, base, group, config, digest, scope, commandInput) {
128
+ assertPersistedIdentities(current, base, group);
129
+ const execution = await dispatchOrganizationChangeSet(createOrganizationMutationRuntime(), { base, changeSet: group }, null);
130
+ const candidate = prepareCandidate(current, base, group, config, scope, execution.state);
131
+ if (!candidate.changed)
132
+ return Object.freeze({ status: "unchanged", authorityId: current.authorityId, changeSetId: group.id, revision: current.revision, sequence: current.sequence });
133
+ const result = Object.freeze({ status: "committed", authorityId: current.authorityId, changeSetId: group.id, revision: current.revision + 1, sequence: candidate.sequence, executionId: config.executionId, committedAt: config.executionInstant });
134
+ const tables = normalizeHolonAuthorityTables({ ...candidate.tables,
135
+ HolarchyChangeSet: [...(candidate.tables.HolarchyChangeSet ?? []), { id: group.id, title: group.id, state: "APPLIED", effectiveDate: group.effectiveDate, actorRef: config.actorRef, revision: 1, createdAt: config.executionInstant, createdBy: config.actorRef, updatedAt: config.executionInstant, updatedBy: config.actorRef, approvedBy: null, appliedAt: config.executionInstant }],
136
+ HolarchyChange: [...(candidate.tables.HolarchyChange ?? []), ...(commandInput?.commands ?? []).map((command, index) => ({ ...command, id: `${group.id}:command:${index + 1}`, changeSetId: group.id, payload: { ...command.payload } }))],
137
+ HolarchyChangeEvent: [...(candidate.tables.HolarchyChangeEvent ?? []), { id: `${group.id}:accepted`, changeSetId: group.id, kind: auditKind, createdAt: config.executionInstant, actorRef: config.actorRef, detail: { requestDigest: digest, schema: group.schema, result: { ...result }, mutations: json(group.mutations, "$.mutations"), evidence: json(execution.evidence, "$.evidence"), ...(commandInput ? { commands: json(commandInput.commands, "$.commands") } : {}) } }],
138
+ });
139
+ try {
140
+ await commitHolonAuthority(runtime, { expectedRevision: group.expectedRevision, tables }, { authorityId: group.authorityId, executionId: config.executionId, executionInstant: config.executionInstant });
141
+ return result;
142
+ }
143
+ catch (error) {
144
+ // A concurrent identical retry may have won the CAS, or the acknowledgement
145
+ // may have been lost after publication. Only a durable matching event proves it.
146
+ const accepted = priorAcceptance(await runtime.store.load(), group.id, digest);
147
+ if (accepted)
148
+ return accepted;
149
+ throw error;
150
+ }
151
+ }
152
+ function prepareCandidate(current, base, group, config, scope, preparedState) {
153
+ const candidate = appendCandidate(current, base, group, config, preparedState);
154
+ assertOrganizationWriteScope(scope, base, applyOrganizationChangeSet(base, group), group, materializeOrganizationChangeSet(base, group));
155
+ authorizeTimeline(scope, current, candidate.tables, group);
156
+ return candidate;
157
+ }
158
+ /** Strong read-only preview: the same full-history and scope preparation used by commit. */
159
+ export async function previewOrganizationChangeSet(runtime, input, configValue) {
160
+ const group = parseOrganizationChangeSet(input), config = execution(configValue);
161
+ const current = await runtime.store.load();
162
+ if (current.authorityId !== group.authorityId)
163
+ fail("authority-mismatch", "$.changeSet.authorityId", "Organization authority does not match the store");
164
+ if (current.revision !== group.expectedRevision)
165
+ fail("revision-conflict", "$.changeSet.expectedRevision", "Authority revision changed");
166
+ if ((current.tables.HolarchyChangeSet ?? []).some(row => row.id === group.id))
167
+ fail("request-id-conflict", "$.changeSet.id", "Preview requires an unused request identity");
168
+ const scope = await resolveOrganizationWriteScope(runtime.authorization, current, config.actorRef, group.effectiveDate);
169
+ const before = project(current, group), candidate = prepareCandidate(current, before, group, config, scope);
170
+ const after = project({ ...current, tables: candidate.tables, sequence: candidate.sequence }, group);
171
+ return Object.freeze({ status: candidate.changed ? "valid" : "unchanged", validation: "complete-history", before, after, changeSet: group, sequence: candidate.sequence });
172
+ }
173
+ export async function commitOrganizationChangeSet(runtime, input, configValue) {
174
+ const group = parseOrganizationChangeSet(input), config = execution(configValue);
175
+ const digest = requestDigest(json({ kind: "mutations", changeSet: group }, "$.request"), config.actorRef);
176
+ const current = await runtime.store.load();
177
+ if (current.authorityId !== group.authorityId)
178
+ fail("authority-mismatch", "$.changeSet.authorityId", "Organization authority does not match the store");
179
+ const scope = await resolveOrganizationWriteScope(runtime.authorization, current, config.actorRef, group.effectiveDate);
180
+ const accepted = priorAcceptance(current, group.id, digest);
181
+ if (accepted) {
182
+ authorizeTimeline(scope, current, current.tables, group);
183
+ return accepted;
184
+ }
185
+ if (current.revision !== group.expectedRevision)
186
+ fail("revision-conflict", "$.changeSet.expectedRevision", "Authority revision changed");
187
+ const base = project(current, group);
188
+ return accept(runtime, current, base, group, config, digest, scope);
189
+ }
190
+ export async function executeOrganizationCommands(runtime, input, configValue) {
191
+ const raw = dataRecord(input, "$.request");
192
+ const keys = ["id", "actorRef", "commands", "authorityId", "expectedRevision", "effectiveDate"];
193
+ if (Object.keys(raw).some((key) => !keys.includes(key)) || keys.some((key) => !Object.hasOwn(raw, key)))
194
+ fail("invalid-command-request", "$.request", "Expected exact command envelope");
195
+ const request = json(raw, "$.request"), config = execution(configValue);
196
+ basis(request, request.expectedRevision);
197
+ const draft = parseHolarchyDraft({ id: request.id, title: request.id, actorRef: request.actorRef, effectiveDate: request.effectiveDate, changes: request.commands });
198
+ if (draft.actorRef !== config.actorRef)
199
+ fail("actor-mismatch", "$.request.actorRef", "Command actor must match execution actor");
200
+ const digest = requestDigest(json({ kind: "commands", request }, "$.request"), config.actorRef);
201
+ const current = await runtime.store.load();
202
+ if (current.authorityId !== request.authorityId)
203
+ fail("authority-mismatch", "$.request.authorityId", "Organization authority does not match the store");
204
+ const scope = await resolveOrganizationWriteScope(runtime.authorization, current, config.actorRef, request.effectiveDate);
205
+ const accepted = priorAcceptance(current, request.id, digest);
206
+ if (accepted) {
207
+ const event = current.tables.HolarchyChangeEvent.find(event => event.changeSetId === request.id && event.kind === auditKind);
208
+ const detail = dataRecord(event.detail, "$.accepted.detail");
209
+ const original = parseOrganizationChangeSet({ schema: detail.schema ?? ORGANIZATION_DSL_SCHEMA, id: request.id, authorityId: request.authorityId, expectedRevision: request.expectedRevision, effectiveDate: request.effectiveDate, mutations: detail.mutations });
210
+ authorizeTimeline(scope, current, current.tables, original);
211
+ return accepted;
212
+ }
213
+ if (current.revision !== request.expectedRevision)
214
+ fail("revision-conflict", "$.request.expectedRevision", "Authority revision changed");
215
+ const base = project(current, request);
216
+ const group = planOrganizationCommands(base, { id: request.id, actorRef: request.actorRef, commands: draft.changes });
217
+ return accept(runtime, current, base, group, config, digest, scope, request);
218
+ }
219
+ function authorizeTimeline(scope, current, nextTables, group) {
220
+ if (scope.kind === "all")
221
+ return;
222
+ const beforeFacts = holonAuthorityTablesToFacts(current.tables), afterFacts = holonAuthorityTablesToFacts(nextTables);
223
+ const dates = new Set([group.effectiveDate, ...Object.values(nextTables).flatMap(rows => rows ?? []).flatMap(row => typeof row.effectiveDate === "string" && row.effectiveDate >= group.effectiveDate ? [row.effectiveDate] : [])]);
224
+ for (const date of dates) {
225
+ const selected = basis({ authorityId: group.authorityId, effectiveDate: date }, current.revision);
226
+ assertOrganizationWriteScope(scope, projectOrganizationStateFromFacts(beforeFacts, selected), projectOrganizationStateFromFacts(afterFacts, selected), group);
227
+ }
228
+ }
229
+ //# sourceMappingURL=organization-authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organization-authority.js","sourceRoot":"","sources":["../src/organization-authority.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type OrganizationEntity, type OrganizationEntityType, type JsonObject } from "holarchy-core-contract";
2
+ export declare function canonicalOrganizationValue(value: unknown): string;
3
+ export declare function parseOrganizationEntity(value: unknown, path?: string): OrganizationEntity;
4
+ /** The same closed field schemas serve complete entities and mutation projections. */
5
+ export declare function parseOrganizationEntityFields(kind: OrganizationEntityType, value: unknown, path?: string): JsonObject;
6
+ //# sourceMappingURL=organization-entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organization-entity.d.ts","sourceRoot":"","sources":["../src/organization-entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAgCvI,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMjE;AACD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,SAAa,GAAG,kBAAkB,CAU7F;AACD,sFAAsF;AACtF,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,SAAa,GAAG,UAAU,CA0CzH"}
@@ -0,0 +1,95 @@
1
+ import { MEMBER_PRINCIPAL_KINDS } from "holarchy-core-contract";
2
+ import { dataRecord, dataArray, json, HolonAuthorityContractError } from "./authority-store.js";
3
+ const fields = {
4
+ Holon: ["subjectId", "code", "name", "purpose", "boundary"],
5
+ Member: ["subjectId", "displayName", "principalKind"],
6
+ Membership: ["subjectId", "parentHolonId", "mode"],
7
+ Role: ["holonId", "name", "purpose", "domains", "accountabilities", "policies", "capabilityRequirements"],
8
+ RoleAssignment: ["membershipId", "roleId"],
9
+ GovernancePolicy: ["holonId", "name", "profile", "rules"],
10
+ };
11
+ const listFields = new Set(["domains", "accountabilities", "policies", "capabilityRequirements"]);
12
+ const fail = (path, message) => { throw new HolonAuthorityContractError("invalid-organization", path, message); };
13
+ const compare = (a, b) => a < b ? -1 : a > b ? 1 : 0;
14
+ const id = (v, path) => typeof v === "string" && /^[A-Za-z_][A-Za-z0-9_-]*(?:\.[A-Za-z_][A-Za-z0-9_-]*)*$/.test(v) ? v : fail(path, "Expected a stable identifier");
15
+ function exact(v, keys, path) {
16
+ const obj = dataRecord(v, path);
17
+ for (const key of keys)
18
+ if (!Object.hasOwn(obj, key))
19
+ fail(`${path}.${key}`, "Missing field");
20
+ for (const key of Object.keys(obj))
21
+ if (!keys.includes(key))
22
+ fail(`${path}.${key}`, "Unknown field");
23
+ return obj;
24
+ }
25
+ function freeze(v) {
26
+ if (v !== null && typeof v === "object") {
27
+ for (const x of Object.values(v))
28
+ freeze(x);
29
+ Object.freeze(v);
30
+ }
31
+ return v;
32
+ }
33
+ export function canonicalOrganizationValue(value) {
34
+ if (value === null || typeof value !== "object")
35
+ return JSON.stringify(value);
36
+ if (Array.isArray(value))
37
+ return `[${value.map(canonicalOrganizationValue).join(",")}]`;
38
+ return `{${Object.keys(value).sort(compare).map(k => `${JSON.stringify(k)}:${canonicalOrganizationValue(value[k])}`).join(",")}}`;
39
+ }
40
+ export function parseOrganizationEntity(value, path = "$.entity") {
41
+ const raw = dataRecord(value, path);
42
+ if (typeof raw.kind !== "string" || !Object.hasOwn(fields, raw.kind))
43
+ fail(`${path}.kind`, "Unknown entity kind");
44
+ const kind = raw.kind;
45
+ const obj = exact(raw, ["kind", "id", "effectiveState", ...fields[kind]], path);
46
+ id(obj.id, `${path}.id`);
47
+ const { kind: _kind, id: _id, ...valueFields } = obj;
48
+ parseOrganizationEntityFields(kind, valueFields, path);
49
+ return freeze(json(obj, path));
50
+ }
51
+ /** The same closed field schemas serve complete entities and mutation projections. */
52
+ export function parseOrganizationEntityFields(kind, value, path = '$.fields') {
53
+ if (!Object.hasOwn(fields, kind))
54
+ fail(path, 'Unknown entity kind');
55
+ const obj = dataRecord(value, path);
56
+ const allowed = ['effectiveState', ...fields[kind]];
57
+ for (const field of Object.keys(obj)) {
58
+ if (!allowed.includes(field))
59
+ fail(`${path}.${field}`, 'Unknown entity field');
60
+ const v = obj[field];
61
+ if (field === 'effectiveState') {
62
+ if (typeof v !== 'boolean')
63
+ fail(`${path}.${field}`, 'Expected boolean');
64
+ }
65
+ else if (listFields.has(field)) {
66
+ const list = dataArray(v, `${path}.${field}`);
67
+ if (list.some(x => typeof x !== "string"))
68
+ fail(`${path}.${field}`, "Expected string array");
69
+ }
70
+ else if (field === "rules") {
71
+ // Informational profiles retain legacy native scalars/null. A serialized
72
+ // object/array remains a wrapper rather than native policy data.
73
+ if (typeof v === "string") {
74
+ let decoded;
75
+ try {
76
+ decoded = JSON.parse(v);
77
+ }
78
+ catch { /* ordinary native string */ }
79
+ if (decoded !== null && typeof decoded === "object")
80
+ fail(`${path}.rules`, "Expected native policy data, not an object or array string wrapper");
81
+ }
82
+ json(v, `${path}.rules`);
83
+ }
84
+ else if (field.endsWith("Id"))
85
+ id(v, `${path}.${field}`);
86
+ else if (typeof v !== "string")
87
+ fail(`${path}.${field}`, "Expected string");
88
+ }
89
+ if (kind === "Member" && Object.hasOwn(obj, 'principalKind') && !MEMBER_PRINCIPAL_KINDS.includes(obj.principalKind))
90
+ fail(`${path}.principalKind`, "Unknown principal kind");
91
+ if (kind === "Membership" && Object.hasOwn(obj, 'mode') && obj.mode !== "primary" && obj.mode !== "affiliate")
92
+ fail(`${path}.mode`, "Unknown membership mode");
93
+ return freeze(json(obj, path));
94
+ }
95
+ //# sourceMappingURL=organization-entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organization-entity.js","sourceRoot":"","sources":["../src/organization-entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAyE,MAAM,wBAAwB,CAAC;AACvI,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAChG,MAAM,MAAM,GAAG;IACX,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC;IAC3D,MAAM,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,eAAe,CAAC;IACrD,UAAU,EAAE,CAAC,WAAW,EAAE,eAAe,EAAE,MAAM,CAAC;IAClD,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,UAAU,EAAE,wBAAwB,CAAC;IACzG,cAAc,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC;IAC1C,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC;CACnD,CAAC;AACX,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,kBAAkB,EAAE,UAAU,EAAE,wBAAwB,CAAC,CAAC,CAAC;AAClG,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,OAAe,EAAS,EAAE,GAAG,MAAM,IAAI,2BAA2B,CAAC,sBAAsB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AACzI,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrE,MAAM,EAAE,GAAG,CAAC,CAAU,EAAE,IAAY,EAAU,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,yDAAyD,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,8BAA8B,CAAC,CAAC;AAC7L,SAAS,KAAK,CAAC,CAAU,EAAE,IAAuB,EAAE,IAAY;IAC5D,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,IAAI;QAClB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;YACxB,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;IAChD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YACnB,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC;AACf,CAAC;AACD,SAAS,MAAM,CAAI,CAAI;IACnB,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5B,MAAM,CAAC,CAAC,CAAC,CAAC;QACd,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,CAAC,CAAC;AACb,CAAC;AACD,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACrD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACpB,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAClE,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,0BAA0B,CAAE,KAAiC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACnK,CAAC;AACD,MAAM,UAAU,uBAAuB,CAAC,KAAc,EAAE,IAAI,GAAG,UAAU;IACrE,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpC,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC;QAChE,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,qBAAqB,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,GAAG,CAAC,IAA2B,CAAC;IAC7C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAChF,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IACzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,GAAG,CAAC;IACrD,6BAA6B,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAkC,CAAC,CAAC;AACpE,CAAC;AACD,sFAAsF;AACtF,MAAM,UAAU,6BAA6B,CAAC,IAA4B,EAAE,KAAc,EAAE,IAAI,GAAG,UAAU;IACzG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpC,MAAM,OAAO,GAAsB,CAAC,gBAAgB,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,sBAAsB,CAAC,CAAC;QACrD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,KAAK,KAAK,gBAAgB,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,KAAK,SAAS;gBACtB,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;QACrD,CAAC;aACI,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;YAC9C,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;gBACrC,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,uBAAuB,CAAC,CAAC;QAC1D,CAAC;aACI,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACzB,yEAAyE;YACzE,iEAAiE;YACjE,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACxB,IAAI,OAAgB,CAAC;gBACrB,IAAI,CAAC;oBACD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC;gBACD,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC;gBACtC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;oBAC/C,IAAI,CAAC,GAAG,IAAI,QAAQ,EAAE,oEAAoE,CAAC,CAAC;YACpG,CAAC;YACD,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;QAC7B,CAAC;aACI,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YACzB,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;aACzB,IAAI,OAAO,CAAC,KAAK,QAAQ;YAC1B,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,iBAAiB,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,eAAe,CAAC,IAAI,CAAE,sBAA6C,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;QACvI,IAAI,CAAC,GAAG,IAAI,gBAAgB,EAAE,wBAAwB,CAAC,CAAC;IAC5D,IAAI,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;QACzG,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,yBAAyB,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAe,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { OrganizationEntity, OrganizationFieldEdit } from 'holarchy-core-contract';
2
+ export declare function parseEdit(value: unknown, path: string): OrganizationFieldEdit;
3
+ export declare function patch(entity: OrganizationEntity, edits: readonly OrganizationFieldEdit[], path: string, validate?: boolean): OrganizationEntity;
4
+ //# sourceMappingURL=organization-field-edits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organization-field-edits.d.ts","sourceRoot":"","sources":["../src/organization-field-edits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAa,MAAM,wBAAwB,CAAC;AAmBnG,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAmB7E;AACD,wBAAgB,KAAK,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,SAAS,qBAAqB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,UAAO,GAAG,kBAAkB,CAiD5I"}