@xemahq/contracts 0.86.0 → 0.88.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 (126) hide show
  1. package/dist/.source-stamp.json +2 -2
  2. package/dist/action-catalog/index.d.ts +2 -0
  3. package/dist/action-catalog/index.d.ts.map +1 -0
  4. package/dist/action-catalog/index.js +18 -0
  5. package/dist/action-catalog/index.js.map +1 -0
  6. package/dist/action-catalog/lib/action-catalog-kind.d.ts +8 -0
  7. package/dist/action-catalog/lib/action-catalog-kind.d.ts.map +1 -0
  8. package/dist/action-catalog/lib/action-catalog-kind.js +12 -0
  9. package/dist/action-catalog/lib/action-catalog-kind.js.map +1 -0
  10. package/dist/conformance/decision-open-identity.vectors.json +14 -0
  11. package/dist/decision/index.d.ts +1 -0
  12. package/dist/decision/index.d.ts.map +1 -1
  13. package/dist/decision/index.js +1 -0
  14. package/dist/decision/index.js.map +1 -1
  15. package/dist/decision/lib/events.d.ts +100 -53
  16. package/dist/decision/lib/events.d.ts.map +1 -1
  17. package/dist/decision/lib/events.js +39 -17
  18. package/dist/decision/lib/events.js.map +1 -1
  19. package/dist/decision/lib/open-identity.d.ts +25 -0
  20. package/dist/decision/lib/open-identity.d.ts.map +1 -0
  21. package/dist/decision/lib/open-identity.js +40 -0
  22. package/dist/decision/lib/open-identity.js.map +1 -0
  23. package/dist/decision/lib/open-request.d.ts +1 -0
  24. package/dist/decision/lib/open-request.d.ts.map +1 -1
  25. package/dist/decision/lib/open-request.js +1 -0
  26. package/dist/decision/lib/open-request.js.map +1 -1
  27. package/dist/deliverable-validation/index.d.ts +2 -0
  28. package/dist/deliverable-validation/index.d.ts.map +1 -1
  29. package/dist/deliverable-validation/index.js +2 -0
  30. package/dist/deliverable-validation/index.js.map +1 -1
  31. package/dist/deliverable-validation/lib/deliverable-acceptance-hook.d.ts +6 -0
  32. package/dist/deliverable-validation/lib/deliverable-acceptance-hook.d.ts.map +1 -0
  33. package/dist/deliverable-validation/lib/deliverable-acceptance-hook.js +45 -0
  34. package/dist/deliverable-validation/lib/deliverable-acceptance-hook.js.map +1 -0
  35. package/dist/{output → deliverable-validation}/lib/deliverable-output-contract.d.ts +6 -6
  36. package/dist/deliverable-validation/lib/deliverable-output-contract.d.ts.map +1 -0
  37. package/dist/{output → deliverable-validation}/lib/deliverable-output-contract.js +26 -22
  38. package/dist/deliverable-validation/lib/deliverable-output-contract.js.map +1 -0
  39. package/dist/deliverable-validation/lib/phase.d.ts +5 -3
  40. package/dist/deliverable-validation/lib/phase.d.ts.map +1 -1
  41. package/dist/deliverable-validation/lib/phase.js +10 -17
  42. package/dist/deliverable-validation/lib/phase.js.map +1 -1
  43. package/dist/deliverable-validation/lib/validator-declaration.d.ts +1 -11
  44. package/dist/deliverable-validation/lib/validator-declaration.d.ts.map +1 -1
  45. package/dist/deliverable-validation/lib/validator-declaration.js +10 -17
  46. package/dist/deliverable-validation/lib/validator-declaration.js.map +1 -1
  47. package/dist/edition-protocol/edition-contract.schema.json +1 -1
  48. package/dist/edition-protocol/edition-protocol.json +1 -1
  49. package/dist/edition-protocol/lib/edition-protocol.js +2 -2
  50. package/dist/hook/index.d.ts +12 -0
  51. package/dist/hook/index.d.ts.map +1 -0
  52. package/dist/hook/index.js +28 -0
  53. package/dist/hook/index.js.map +1 -0
  54. package/dist/hook/lib/hook-aggregation.d.ts +76 -0
  55. package/dist/hook/lib/hook-aggregation.d.ts.map +1 -0
  56. package/dist/hook/lib/hook-aggregation.js +163 -0
  57. package/dist/hook/lib/hook-aggregation.js.map +1 -0
  58. package/dist/hook/lib/hook-binding-feed.d.ts +40 -0
  59. package/dist/hook/lib/hook-binding-feed.d.ts.map +1 -0
  60. package/dist/hook/lib/hook-binding-feed.js +107 -0
  61. package/dist/hook/lib/hook-binding-feed.js.map +1 -0
  62. package/dist/hook/lib/hook-binding-set.d.ts +58 -0
  63. package/dist/hook/lib/hook-binding-set.d.ts.map +1 -0
  64. package/dist/hook/lib/hook-binding-set.js +103 -0
  65. package/dist/hook/lib/hook-binding-set.js.map +1 -0
  66. package/dist/hook/lib/hook-binding.d.ts +51 -0
  67. package/dist/hook/lib/hook-binding.d.ts.map +1 -0
  68. package/dist/hook/lib/hook-binding.js +119 -0
  69. package/dist/hook/lib/hook-binding.js.map +1 -0
  70. package/dist/hook/lib/hook-deferral.d.ts +46 -0
  71. package/dist/hook/lib/hook-deferral.d.ts.map +1 -0
  72. package/dist/hook/lib/hook-deferral.js +113 -0
  73. package/dist/hook/lib/hook-deferral.js.map +1 -0
  74. package/dist/hook/lib/hook-enums.d.ts +121 -0
  75. package/dist/hook/lib/hook-enums.d.ts.map +1 -0
  76. package/dist/hook/lib/hook-enums.js +165 -0
  77. package/dist/hook/lib/hook-enums.js.map +1 -0
  78. package/dist/hook/lib/hook-handler-request.d.ts +15 -0
  79. package/dist/hook/lib/hook-handler-request.d.ts.map +1 -0
  80. package/dist/hook/lib/hook-handler-request.js +36 -0
  81. package/dist/hook/lib/hook-handler-request.js.map +1 -0
  82. package/dist/hook/lib/hook-identifiers.d.ts +12 -0
  83. package/dist/hook/lib/hook-identifiers.d.ts.map +1 -0
  84. package/dist/hook/lib/hook-identifiers.js +66 -0
  85. package/dist/hook/lib/hook-identifiers.js.map +1 -0
  86. package/dist/hook/lib/hook-patch.d.ts +20 -0
  87. package/dist/hook/lib/hook-patch.d.ts.map +1 -0
  88. package/dist/hook/lib/hook-patch.js +145 -0
  89. package/dist/hook/lib/hook-patch.js.map +1 -0
  90. package/dist/hook/lib/hook-point.d.ts +33 -0
  91. package/dist/hook/lib/hook-point.d.ts.map +1 -0
  92. package/dist/hook/lib/hook-point.js +105 -0
  93. package/dist/hook/lib/hook-point.js.map +1 -0
  94. package/dist/hook/lib/hook-verdict.d.ts +49 -0
  95. package/dist/hook/lib/hook-verdict.d.ts.map +1 -0
  96. package/dist/hook/lib/hook-verdict.js +66 -0
  97. package/dist/hook/lib/hook-verdict.js.map +1 -0
  98. package/dist/output/index.d.ts +0 -1
  99. package/dist/output/index.d.ts.map +1 -1
  100. package/dist/output/index.js +0 -1
  101. package/dist/output/index.js.map +1 -1
  102. package/dist/search-source/lib/indexable-document.d.ts +3 -0
  103. package/dist/search-source/lib/indexable-document.d.ts.map +1 -1
  104. package/dist/search-source/lib/indexable-document.js +2 -0
  105. package/dist/search-source/lib/indexable-document.js.map +1 -1
  106. package/dist/search-source/lib/search-index-event.d.ts +4 -0
  107. package/dist/search-source/lib/search-index-event.d.ts.map +1 -1
  108. package/dist/search-source/lib/search-index-event.js +2 -0
  109. package/dist/search-source/lib/search-index-event.js.map +1 -1
  110. package/dist/search-source/lib/search-replay.d.ts +1 -0
  111. package/dist/search-source/lib/search-replay.d.ts.map +1 -1
  112. package/dist/state-version/index.d.ts +2 -0
  113. package/dist/state-version/index.d.ts.map +1 -0
  114. package/dist/state-version/index.js +18 -0
  115. package/dist/state-version/index.js.map +1 -0
  116. package/dist/state-version/lib/state-version.d.ts +4 -0
  117. package/dist/state-version/lib/state-version.d.ts.map +1 -0
  118. package/dist/state-version/lib/state-version.js +6 -0
  119. package/dist/state-version/lib/state-version.js.map +1 -0
  120. package/dist/worker-runtime/lib/enums.d.ts +1 -1
  121. package/dist/worker-runtime/lib/enums.d.ts.map +1 -1
  122. package/dist/worker-runtime/lib/enums.js +6 -2
  123. package/dist/worker-runtime/lib/enums.js.map +1 -1
  124. package/package.json +2 -2
  125. package/dist/output/lib/deliverable-output-contract.d.ts.map +0 -1
  126. package/dist/output/lib/deliverable-output-contract.js.map +0 -1
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HookBindingFeedPageSchema = exports.HookBindingChangeSchema = exports.HookBindingFeedSnapshotSchema = exports.HookBindingCursorSchema = void 0;
4
+ exports.checkHookBindingFeedPage = checkHookBindingFeedPage;
5
+ const zod_1 = require("zod");
6
+ const hook_binding_1 = require("./hook-binding");
7
+ const hook_enums_1 = require("./hook-enums");
8
+ const hook_identifiers_1 = require("./hook-identifiers");
9
+ exports.HookBindingCursorSchema = zod_1.z.number().int().min(0);
10
+ exports.HookBindingFeedSnapshotSchema = zod_1.z
11
+ .object({
12
+ revision: hook_identifiers_1.HookRevisionSchema,
13
+ bindings: zod_1.z.array(hook_binding_1.HookBindingSchema).readonly(),
14
+ suppressions: zod_1.z.array(hook_binding_1.HookBindingSuppressionSchema).readonly(),
15
+ })
16
+ .strict();
17
+ exports.HookBindingChangeSchema = zod_1.z.discriminatedUnion('kind', [
18
+ zod_1.z
19
+ .object({
20
+ kind: zod_1.z.literal(hook_enums_1.HookBindingChangeKind.BindingUpserted),
21
+ revision: hook_identifiers_1.HookRevisionSchema,
22
+ binding: hook_binding_1.HookBindingSchema,
23
+ })
24
+ .strict(),
25
+ zod_1.z
26
+ .object({
27
+ kind: zod_1.z.literal(hook_enums_1.HookBindingChangeKind.BindingRemoved),
28
+ revision: hook_identifiers_1.HookRevisionSchema,
29
+ bindingId: hook_identifiers_1.HookRecordIdSchema,
30
+ })
31
+ .strict(),
32
+ zod_1.z
33
+ .object({
34
+ kind: zod_1.z.literal(hook_enums_1.HookBindingChangeKind.SuppressionAdded),
35
+ revision: hook_identifiers_1.HookRevisionSchema,
36
+ suppression: hook_binding_1.HookBindingSuppressionSchema,
37
+ })
38
+ .strict(),
39
+ zod_1.z
40
+ .object({
41
+ kind: zod_1.z.literal(hook_enums_1.HookBindingChangeKind.SuppressionRemoved),
42
+ revision: hook_identifiers_1.HookRevisionSchema,
43
+ suppression: hook_binding_1.HookBindingSuppressionSchema,
44
+ })
45
+ .strict(),
46
+ ]);
47
+ exports.HookBindingFeedPageSchema = zod_1.z
48
+ .discriminatedUnion('kind', [
49
+ zod_1.z
50
+ .object({
51
+ kind: zod_1.z.literal(hook_enums_1.HookBindingFeedPageKind.Changes),
52
+ throughRevision: exports.HookBindingCursorSchema,
53
+ headRevision: exports.HookBindingCursorSchema,
54
+ changes: zod_1.z.array(exports.HookBindingChangeSchema).readonly(),
55
+ })
56
+ .strict(),
57
+ zod_1.z
58
+ .object({
59
+ kind: zod_1.z.literal(hook_enums_1.HookBindingFeedPageKind.ResyncRequired),
60
+ headRevision: exports.HookBindingCursorSchema,
61
+ })
62
+ .strict(),
63
+ ])
64
+ .superRefine((page, ctx) => {
65
+ if (page.kind !== hook_enums_1.HookBindingFeedPageKind.Changes)
66
+ return;
67
+ if (page.throughRevision > page.headRevision) {
68
+ ctx.addIssue({
69
+ code: zod_1.z.ZodIssueCode.custom,
70
+ path: ['throughRevision'],
71
+ message: 'throughRevision is beyond headRevision',
72
+ });
73
+ }
74
+ let previous = 0;
75
+ page.changes.forEach((change, index) => {
76
+ if (change.revision < previous) {
77
+ ctx.addIssue({
78
+ code: zod_1.z.ZodIssueCode.custom,
79
+ path: ['changes', index, 'revision'],
80
+ message: 'change revisions must be non-decreasing',
81
+ });
82
+ }
83
+ if (change.revision > page.throughRevision) {
84
+ ctx.addIssue({
85
+ code: zod_1.z.ZodIssueCode.custom,
86
+ path: ['changes', index, 'revision'],
87
+ message: 'change revision is beyond throughRevision',
88
+ });
89
+ }
90
+ previous = change.revision;
91
+ });
92
+ });
93
+ function checkHookBindingFeedPage(page, requestedRevision) {
94
+ if (page.kind === hook_enums_1.HookBindingFeedPageKind.ResyncRequired)
95
+ return [];
96
+ const violations = [];
97
+ if (page.throughRevision < requestedRevision) {
98
+ violations.push(`throughRevision ${page.throughRevision} is before the requested ${requestedRevision}`);
99
+ }
100
+ for (const change of page.changes) {
101
+ if (change.revision <= requestedRevision || change.revision > page.throughRevision) {
102
+ violations.push(`change revision ${change.revision} is outside (${requestedRevision}, ${page.throughRevision}]`);
103
+ }
104
+ }
105
+ return violations;
106
+ }
107
+ //# sourceMappingURL=hook-binding-feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-binding-feed.js","sourceRoot":"","sources":["../../../src/hook/lib/hook-binding-feed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { z } from 'zod';
2
+ import { type HookBinding } from './hook-binding';
3
+ import { HookFailureCode, HookMode, HookParticipation, HookPhase, HookProjectionState } from './hook-enums';
4
+ import type { HookPointLimits } from './hook-point';
5
+ export interface HookBindingSetSnapshot {
6
+ readonly hookPointId: string;
7
+ readonly revision: number;
8
+ readonly bindings: readonly HookBinding[];
9
+ }
10
+ export declare const HookBindingSetSnapshotSchema: z.ZodType<HookBindingSetSnapshot>;
11
+ export type HookBindingProjection = {
12
+ readonly state: HookProjectionState.Synced;
13
+ readonly snapshot: HookBindingSetSnapshot;
14
+ } | {
15
+ readonly state: HookProjectionState.Unhydrated;
16
+ } | {
17
+ readonly state: HookProjectionState.Stale;
18
+ readonly syncedRevision: number;
19
+ } | {
20
+ readonly state: HookProjectionState.RevisionMismatched;
21
+ readonly syncedRevision: number;
22
+ } | {
23
+ readonly state: HookProjectionState.Failed;
24
+ };
25
+ export type HookProjectionResolution = {
26
+ readonly ok: true;
27
+ readonly snapshot: HookBindingSetSnapshot;
28
+ } | {
29
+ readonly ok: false;
30
+ readonly state: Exclude<HookProjectionState, HookProjectionState.Synced>;
31
+ };
32
+ export declare function resolveHookBindingProjection(projection: HookBindingProjection, requiredRevision: number): HookProjectionResolution;
33
+ export interface HookApplication {
34
+ readonly key: string;
35
+ readonly mode: HookMode;
36
+ readonly participation: HookParticipation;
37
+ readonly bindings: readonly HookBinding[];
38
+ }
39
+ export interface HookFanOutSkip {
40
+ readonly bindingId: string;
41
+ readonly code: HookFailureCode.Saturation;
42
+ }
43
+ export interface HookPhaseFanOut {
44
+ readonly applications: readonly HookApplication[];
45
+ readonly skipped: readonly HookFanOutSkip[];
46
+ }
47
+ export type HookFanOutPlan = {
48
+ readonly ok: true;
49
+ readonly phases: Readonly<Record<HookPhase, HookPhaseFanOut>>;
50
+ } | {
51
+ readonly ok: false;
52
+ readonly code: HookFailureCode.Saturation;
53
+ readonly bindingCount: number;
54
+ readonly maxFanOut: number;
55
+ };
56
+ export declare function planHookFanOut(snapshot: HookBindingSetSnapshot, limits: HookPointLimits): HookFanOutPlan;
57
+ export declare function isHookRecursion(synchronousChain: readonly string[], hookPointId: string): boolean;
58
+ //# sourceMappingURL=hook-binding-set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-binding-set.d.ts","sourceRoot":"","sources":["../../../src/hook/lib/hook-binding-set.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HookBindingSetSnapshotSchema = void 0;
4
+ exports.resolveHookBindingProjection = resolveHookBindingProjection;
5
+ exports.planHookFanOut = planHookFanOut;
6
+ exports.isHookRecursion = isHookRecursion;
7
+ const zod_1 = require("zod");
8
+ const hook_binding_1 = require("./hook-binding");
9
+ const hook_enums_1 = require("./hook-enums");
10
+ const hook_identifiers_1 = require("./hook-identifiers");
11
+ exports.HookBindingSetSnapshotSchema = zod_1.z
12
+ .object({
13
+ hookPointId: hook_identifiers_1.HookPointIdSchema,
14
+ revision: hook_identifiers_1.HookRevisionSchema,
15
+ bindings: zod_1.z.array(hook_binding_1.HookBindingSchema).readonly(),
16
+ })
17
+ .strict();
18
+ function resolveHookBindingProjection(projection, requiredRevision) {
19
+ if (projection.state !== hook_enums_1.HookProjectionState.Synced) {
20
+ return { ok: false, state: projection.state };
21
+ }
22
+ const { revision } = projection.snapshot;
23
+ if (revision < requiredRevision) {
24
+ return { ok: false, state: hook_enums_1.HookProjectionState.Stale };
25
+ }
26
+ if (revision > requiredRevision) {
27
+ return { ok: false, state: hook_enums_1.HookProjectionState.RevisionMismatched };
28
+ }
29
+ return { ok: true, snapshot: projection.snapshot };
30
+ }
31
+ const byKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0;
32
+ function groupApplications(snapshot) {
33
+ const grouped = new Map();
34
+ for (const binding of snapshot.bindings) {
35
+ const key = (0, hook_binding_1.hookApplicationKey)(binding);
36
+ const group = grouped.get(key);
37
+ if (group === undefined)
38
+ grouped.set(key, [binding]);
39
+ else
40
+ group.push(binding);
41
+ }
42
+ return [...grouped.entries()].map(([key, group]) => {
43
+ const bindings = [...group].sort((a, b) => a.bindingId < b.bindingId ? -1 : a.bindingId > b.bindingId ? 1 : 0);
44
+ return {
45
+ key,
46
+ mode: bindings[0].mode,
47
+ participation: bindings.some((binding) => binding.participation === hook_enums_1.HookParticipation.Required)
48
+ ? hook_enums_1.HookParticipation.Required
49
+ : hook_enums_1.HookParticipation.Optional,
50
+ bindings,
51
+ };
52
+ });
53
+ }
54
+ function planHookFanOut(snapshot, limits) {
55
+ const applications = groupApplications(snapshot).sort(byKey);
56
+ const required = applications.filter((application) => application.participation === hook_enums_1.HookParticipation.Required);
57
+ let count = required.reduce((sum, a) => sum + a.bindings.length, 0);
58
+ if (count > limits.maxFanOut) {
59
+ return {
60
+ ok: false,
61
+ code: hook_enums_1.HookFailureCode.Saturation,
62
+ bindingCount: count,
63
+ maxFanOut: limits.maxFanOut,
64
+ };
65
+ }
66
+ const admitted = new Set(required);
67
+ const skipped = {
68
+ [hook_enums_1.HookPhase.Transform]: [],
69
+ [hook_enums_1.HookPhase.Validate]: [],
70
+ };
71
+ for (const phase of [hook_enums_1.HookPhase.Transform, hook_enums_1.HookPhase.Validate]) {
72
+ for (const application of applications) {
73
+ if (application.participation === hook_enums_1.HookParticipation.Required ||
74
+ hook_enums_1.HOOK_MODE_PHASE[application.mode] !== phase) {
75
+ continue;
76
+ }
77
+ if (count + application.bindings.length <= limits.maxFanOut) {
78
+ admitted.add(application);
79
+ count += application.bindings.length;
80
+ }
81
+ else {
82
+ for (const binding of application.bindings) {
83
+ skipped[phase].push({ bindingId: binding.bindingId, code: hook_enums_1.HookFailureCode.Saturation });
84
+ }
85
+ }
86
+ }
87
+ }
88
+ const phaseFanOut = (phase) => ({
89
+ applications: applications.filter((application) => admitted.has(application) && hook_enums_1.HOOK_MODE_PHASE[application.mode] === phase),
90
+ skipped: skipped[phase],
91
+ });
92
+ return {
93
+ ok: true,
94
+ phases: {
95
+ [hook_enums_1.HookPhase.Transform]: phaseFanOut(hook_enums_1.HookPhase.Transform),
96
+ [hook_enums_1.HookPhase.Validate]: phaseFanOut(hook_enums_1.HookPhase.Validate),
97
+ },
98
+ };
99
+ }
100
+ function isHookRecursion(synchronousChain, hookPointId) {
101
+ return synchronousChain.includes(hookPointId);
102
+ }
103
+ //# sourceMappingURL=hook-binding-set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-binding-set.js","sourceRoot":"","sources":["../../../src/hook/lib/hook-binding-set.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { z } from 'zod';
2
+ import { type CapabilityInvocationDescriptorBinding } from '../../capability-error';
3
+ import { type SpaceRef } from '../../space';
4
+ import { SubjectKind, type SubjectRef } from '../../subject';
5
+ import { ActionCatalogKind } from '../../action-catalog';
6
+ import { HookBindingRefusalCode, HookMode, HookParticipation, HookScopeRefusalCode } from './hook-enums';
7
+ import { type HookPointDeclaration } from './hook-point';
8
+ export interface HookHandlerRef {
9
+ readonly actionKind: ActionCatalogKind;
10
+ readonly descriptor: CapabilityInvocationDescriptorBinding;
11
+ }
12
+ export declare const HookHandlerRefSchema: z.ZodType<HookHandlerRef>;
13
+ export interface HookBinding {
14
+ readonly bindingId: string;
15
+ readonly revision: number;
16
+ readonly hookPointId: string;
17
+ readonly space: SpaceRef;
18
+ readonly mode: HookMode;
19
+ readonly participation: HookParticipation;
20
+ readonly handler: HookHandlerRef;
21
+ readonly projection: readonly string[];
22
+ readonly executeAs: SubjectRef;
23
+ }
24
+ export declare const HookBindingSchema: z.ZodType<HookBinding>;
25
+ export declare const HOOK_EXECUTE_AUTHORITY_SUBJECT_KINDS: ReadonlySet<SubjectKind>;
26
+ export declare function admitHookBinding(declaration: HookPointDeclaration, binding: HookBinding): readonly HookBindingRefusalCode[];
27
+ export interface HookBindingSuppression {
28
+ readonly space: SpaceRef;
29
+ readonly bindingId: string;
30
+ }
31
+ export declare const HookBindingSuppressionSchema: z.ZodType<HookBindingSuppression>;
32
+ export interface HookScopeRefusal {
33
+ readonly code: HookScopeRefusalCode;
34
+ readonly bindingId: string;
35
+ readonly space: string;
36
+ }
37
+ export type HookScopeResolution = {
38
+ readonly ok: true;
39
+ readonly bindings: readonly HookBinding[];
40
+ } | {
41
+ readonly ok: false;
42
+ readonly refusals: readonly HookScopeRefusal[];
43
+ };
44
+ export declare function resolveEffectiveHookBindings(input: {
45
+ readonly hookPointId: string;
46
+ readonly operationSpace: SpaceRef;
47
+ readonly bindings: readonly HookBinding[];
48
+ readonly suppressions: readonly HookBindingSuppression[];
49
+ }): HookScopeResolution;
50
+ export declare function hookApplicationKey(binding: HookBinding): string;
51
+ //# sourceMappingURL=hook-binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-binding.d.ts","sourceRoot":"","sources":["../../../src/hook/lib/hook-binding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAEL,KAAK,qCAAqC,EAC3C,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAoB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EACL,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,sBAAsB,EACtB,QAAQ,EAER,iBAAiB,EAEjB,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAQtB,OAAO,EAAwB,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAmB/E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,qCAAqC,CAAC;CAC5D;AAED,eAAO,MAAM,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAKhD,CAAC;AAEZ,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IAEjC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAEvC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;CAChC;AAED,eAAO,MAAM,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAYL,CAAC;AAQjD,eAAO,MAAM,oCAAoC,EAAE,WAAW,CAAC,WAAW,CAQvE,CAAC;AAOJ,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,oBAAoB,EACjC,OAAO,EAAE,WAAW,GACnB,SAAS,sBAAsB,EAAE,CA0BnC;AAGD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,4BAA4B,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAKhB,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAAE,CAAC;AAa3E,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAC1D,GAAG,mBAAmB,CAyCtB;AAGD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAU/D"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HookBindingSuppressionSchema = exports.HOOK_EXECUTE_AUTHORITY_SUBJECT_KINDS = exports.HookBindingSchema = exports.HookHandlerRefSchema = void 0;
4
+ exports.admitHookBinding = admitHookBinding;
5
+ exports.resolveEffectiveHookBindings = resolveEffectiveHookBindings;
6
+ exports.hookApplicationKey = hookApplicationKey;
7
+ const zod_1 = require("zod");
8
+ const capability_error_1 = require("../../capability-error");
9
+ const space_1 = require("../../space");
10
+ const subject_1 = require("../../subject");
11
+ const action_catalog_1 = require("../../action-catalog");
12
+ const hook_enums_1 = require("./hook-enums");
13
+ const hook_identifiers_1 = require("./hook-identifiers");
14
+ const hook_point_1 = require("./hook-point");
15
+ exports.HookHandlerRefSchema = zod_1.z
16
+ .object({
17
+ actionKind: action_catalog_1.ActionCatalogKindSchema,
18
+ descriptor: capability_error_1.CapabilityInvocationDescriptorBindingSchema,
19
+ })
20
+ .strict();
21
+ exports.HookBindingSchema = zod_1.z
22
+ .object({
23
+ bindingId: hook_identifiers_1.HookRecordIdSchema,
24
+ revision: hook_identifiers_1.HookRevisionSchema,
25
+ hookPointId: hook_identifiers_1.HookPointIdSchema,
26
+ space: space_1.StrictSpaceRefSchema,
27
+ mode: hook_enums_1.HookModeSchema,
28
+ participation: hook_enums_1.HookParticipationSchema,
29
+ handler: exports.HookHandlerRefSchema,
30
+ projection: zod_1.z.array(hook_identifiers_1.HookFieldPointerSchema).min(1).readonly(),
31
+ executeAs: subject_1.SubjectRefSchema,
32
+ })
33
+ .strict();
34
+ exports.HOOK_EXECUTE_AUTHORITY_SUBJECT_KINDS = Object.freeze(new Set([
35
+ subject_1.SubjectKind.User,
36
+ subject_1.SubjectKind.Agent,
37
+ subject_1.SubjectKind.App,
38
+ subject_1.SubjectKind.Organization,
39
+ ]));
40
+ function admitHookBinding(declaration, binding) {
41
+ const refusals = [];
42
+ if (binding.hookPointId !== declaration.id) {
43
+ refusals.push(hook_enums_1.HookBindingRefusalCode.HookPointMismatch);
44
+ }
45
+ const actionKinds = (0, hook_point_1.hookPointActionKinds)(declaration, binding.mode);
46
+ if (actionKinds === undefined) {
47
+ refusals.push(hook_enums_1.HookBindingRefusalCode.ModeNotDeclared);
48
+ }
49
+ else if (!actionKinds.includes(binding.handler.actionKind)) {
50
+ refusals.push(hook_enums_1.HookBindingRefusalCode.ActionKindIncompatible);
51
+ }
52
+ if (!declaration.participation.includes(binding.participation)) {
53
+ refusals.push(hook_enums_1.HookBindingRefusalCode.ParticipationNotAllowed);
54
+ }
55
+ const projectable = binding.projection.every((field) => declaration.inputProjection.some((allowed) => (0, hook_identifiers_1.isHookFieldPointerWithin)(field, allowed)));
56
+ if (!projectable) {
57
+ refusals.push(hook_enums_1.HookBindingRefusalCode.ProjectionOutsideDeclaration);
58
+ }
59
+ if (!exports.HOOK_EXECUTE_AUTHORITY_SUBJECT_KINDS.has(binding.executeAs.kind)) {
60
+ refusals.push(hook_enums_1.HookBindingRefusalCode.AmbientExecuteAuthority);
61
+ }
62
+ return refusals;
63
+ }
64
+ exports.HookBindingSuppressionSchema = zod_1.z
65
+ .object({
66
+ space: space_1.StrictSpaceRefSchema,
67
+ bindingId: hook_identifiers_1.HookRecordIdSchema,
68
+ })
69
+ .strict();
70
+ function resolveEffectiveHookBindings(input) {
71
+ const chain = (0, space_1.walkAncestors)(input.operationSpace).map((ref) => (0, space_1.formatSpaceRef)(ref));
72
+ const depthOf = (ref) => chain.indexOf((0, space_1.formatSpaceRef)(ref));
73
+ const applicable = input.bindings.filter((binding) => binding.hookPointId === input.hookPointId && depthOf(binding.space) >= 0);
74
+ const refusals = [];
75
+ const suppressed = new Set();
76
+ for (const suppression of input.suppressions) {
77
+ const suppressionDepth = depthOf(suppression.space);
78
+ if (suppressionDepth < 0)
79
+ continue;
80
+ const target = applicable.find((binding) => binding.bindingId === suppression.bindingId &&
81
+ depthOf(binding.space) >= suppressionDepth);
82
+ const space = (0, space_1.formatSpaceRef)(suppression.space);
83
+ if (target === undefined) {
84
+ refusals.push({
85
+ code: hook_enums_1.HookScopeRefusalCode.UnknownBindingSuppressed,
86
+ bindingId: suppression.bindingId,
87
+ space,
88
+ });
89
+ }
90
+ else if (target.participation === hook_enums_1.HookParticipation.Required) {
91
+ refusals.push({
92
+ code: hook_enums_1.HookScopeRefusalCode.RequiredBindingSuppressed,
93
+ bindingId: suppression.bindingId,
94
+ space,
95
+ });
96
+ }
97
+ else {
98
+ suppressed.add(target.bindingId);
99
+ }
100
+ }
101
+ if (refusals.length > 0)
102
+ return { ok: false, refusals };
103
+ const bindings = applicable
104
+ .filter((binding) => !suppressed.has(binding.bindingId))
105
+ .sort((a, b) => (a.bindingId < b.bindingId ? -1 : a.bindingId > b.bindingId ? 1 : 0));
106
+ return { ok: true, bindings };
107
+ }
108
+ function hookApplicationKey(binding) {
109
+ return JSON.stringify([
110
+ binding.mode,
111
+ binding.handler.actionKind,
112
+ binding.handler.descriptor.ref,
113
+ binding.handler.descriptor.expectedDescriptorHash,
114
+ binding.executeAs.kind,
115
+ binding.executeAs.id,
116
+ [...binding.projection].sort(),
117
+ ]);
118
+ }
119
+ //# sourceMappingURL=hook-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-binding.js","sourceRoot":"","sources":["../../../src/hook/lib/hook-binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { z } from 'zod';
2
+ import { HookDecisionOutcome, HookDeferralEffect, HookDeferralEventKind, HookDeferralState } from './hook-enums';
3
+ import { type HookDecisionRequirement } from './hook-verdict';
4
+ export interface HookDeferralRecord {
5
+ readonly key: string;
6
+ readonly hookPointId: string;
7
+ readonly candidateId: string;
8
+ readonly candidateVersion: number;
9
+ readonly generation: number;
10
+ readonly bindingSetRevision: number;
11
+ readonly requirements: readonly HookDecisionRequirement[];
12
+ readonly approved: readonly HookDecisionRequirement[];
13
+ readonly state: HookDeferralState;
14
+ }
15
+ export declare const HookDeferralGenerationSchema: z.ZodNumber;
16
+ export declare const HookDeferralRecordSchema: z.ZodType<HookDeferralRecord>;
17
+ export declare function hookDeferralKey(input: {
18
+ readonly hookPointId: string;
19
+ readonly candidateId: string;
20
+ readonly candidateVersion: number;
21
+ readonly generation: number;
22
+ }): string;
23
+ export type HookDeferralEvent = {
24
+ readonly kind: HookDeferralEventKind.Settled;
25
+ readonly candidateVersion: number;
26
+ readonly requirement: HookDecisionRequirement;
27
+ readonly outcome: HookDecisionOutcome;
28
+ } | {
29
+ readonly kind: HookDeferralEventKind.Cancelled;
30
+ } | {
31
+ readonly kind: HookDeferralEventKind.Expired;
32
+ };
33
+ export declare const HookDeferralEventSchema: z.ZodType<HookDeferralEvent>;
34
+ export interface HookDeferralTransition {
35
+ readonly record: HookDeferralRecord;
36
+ readonly effect: HookDeferralEffect;
37
+ }
38
+ export declare function transitionHookDeferral(record: HookDeferralRecord, event: HookDeferralEvent): HookDeferralTransition;
39
+ export declare function isHookCommitCurrent(evaluated: {
40
+ readonly candidateId: string;
41
+ readonly candidateVersion: number;
42
+ }, current: {
43
+ readonly candidateId: string;
44
+ readonly candidateVersion: number;
45
+ }): boolean;
46
+ //# sourceMappingURL=hook-deferral.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-deferral.d.ts","sourceRoot":"","sources":["../../../src/hook/lib/hook-deferral.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EACL,mBAAmB,EAEnB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EAElB,MAAM,cAAc,CAAC;AAMtB,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,gBAAgB,CAAC;AAgBxB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAOlC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAE1D,QAAQ,CAAC,QAAQ,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACtD,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;CACnC;AAED,eAAO,MAAM,4BAA4B,aAA0B,CAAC;AAEpE,eAAO,MAAM,wBAAwB,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAiC/D,CAAC;AAGL,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAElC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAET;AAED,MAAM,MAAM,iBAAiB,GACzB;IACE,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC,OAAO,CAAC;IAE7C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAElC,QAAQ,CAAC,WAAW,EAAE,uBAAuB,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;CACvC,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC,SAAS,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC,OAAO,CAAA;CAAE,CAAC;AAErD,eAAO,MAAM,uBAAuB,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAcrB,CAAC;AAE7C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;CACrC;AAuCD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,iBAAiB,GACvB,sBAAsB,CAsBxB;AAMD,wBAAgB,mBAAmB,CACjC,SAAS,EAAE;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,EAC9E,OAAO,EAAE;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GAC3E,OAAO,CAKT"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HookDeferralEventSchema = exports.HookDeferralRecordSchema = exports.HookDeferralGenerationSchema = void 0;
4
+ exports.hookDeferralKey = hookDeferralKey;
5
+ exports.transitionHookDeferral = transitionHookDeferral;
6
+ exports.isHookCommitCurrent = isHookCommitCurrent;
7
+ const zod_1 = require("zod");
8
+ const state_version_1 = require("../../state-version");
9
+ const hook_enums_1 = require("./hook-enums");
10
+ const hook_identifiers_1 = require("./hook-identifiers");
11
+ const hook_verdict_1 = require("./hook-verdict");
12
+ exports.HookDeferralGenerationSchema = zod_1.z.number().int().min(0);
13
+ exports.HookDeferralRecordSchema = zod_1.z
14
+ .object({
15
+ key: zod_1.z.string().min(1).max(1024),
16
+ hookPointId: hook_identifiers_1.HookPointIdSchema,
17
+ candidateId: hook_identifiers_1.HookRecordIdSchema,
18
+ candidateVersion: state_version_1.StateVersionSchema,
19
+ generation: exports.HookDeferralGenerationSchema,
20
+ bindingSetRevision: hook_identifiers_1.HookRevisionSchema,
21
+ requirements: zod_1.z.array(hook_verdict_1.HookDecisionRequirementSchema).min(1).readonly(),
22
+ approved: zod_1.z.array(hook_verdict_1.HookDecisionRequirementSchema).readonly(),
23
+ state: hook_enums_1.HookDeferralStateSchema,
24
+ })
25
+ .strict()
26
+ .superRefine((record, context) => {
27
+ const keys = record.requirements.map(hook_verdict_1.hookDecisionRequirementKey);
28
+ if (new Set(keys).size !== keys.length) {
29
+ context.addIssue({
30
+ code: zod_1.z.ZodIssueCode.custom,
31
+ path: ['requirements'],
32
+ message: 'Requirements must be distinct.',
33
+ });
34
+ }
35
+ const approvedKeys = record.approved.map(hook_verdict_1.hookDecisionRequirementKey);
36
+ if (new Set(approvedKeys).size !== approvedKeys.length ||
37
+ !approvedKeys.every((key) => keys.includes(key))) {
38
+ context.addIssue({
39
+ code: zod_1.z.ZodIssueCode.custom,
40
+ path: ['approved'],
41
+ message: 'Approved requirements must be distinct members of `requirements`.',
42
+ });
43
+ }
44
+ });
45
+ function hookDeferralKey(input) {
46
+ return `hook-deferral:${input.hookPointId}:${input.candidateId}:${input.candidateVersion}:${input.generation}`;
47
+ }
48
+ exports.HookDeferralEventSchema = zod_1.z.discriminatedUnion('kind', [
49
+ zod_1.z
50
+ .object({
51
+ kind: zod_1.z.literal(hook_enums_1.HookDeferralEventKind.Settled),
52
+ candidateVersion: state_version_1.StateVersionSchema,
53
+ requirement: hook_verdict_1.HookDecisionRequirementSchema,
54
+ outcome: hook_enums_1.HookDecisionOutcomeSchema,
55
+ })
56
+ .strict(),
57
+ zod_1.z.object({ kind: zod_1.z.literal(hook_enums_1.HookDeferralEventKind.Cancelled) }).strict(),
58
+ zod_1.z.object({ kind: zod_1.z.literal(hook_enums_1.HookDeferralEventKind.Expired) }).strict(),
59
+ ]);
60
+ function settle(record, event) {
61
+ if (event.candidateVersion !== record.candidateVersion) {
62
+ return { record, effect: hook_enums_1.HookDeferralEffect.RefuseChangedCandidate };
63
+ }
64
+ const key = (0, hook_verdict_1.hookDecisionRequirementKey)(event.requirement);
65
+ if (!record.requirements.some((entry) => (0, hook_verdict_1.hookDecisionRequirementKey)(entry) === key)) {
66
+ return { record, effect: hook_enums_1.HookDeferralEffect.RefuseUnknownRequirement };
67
+ }
68
+ if (record.approved.some((entry) => (0, hook_verdict_1.hookDecisionRequirementKey)(entry) === key)) {
69
+ return { record, effect: hook_enums_1.HookDeferralEffect.None };
70
+ }
71
+ if (event.outcome === hook_enums_1.HookDecisionOutcome.Rejected) {
72
+ return {
73
+ record: { ...record, state: hook_enums_1.HookDeferralState.Rejected },
74
+ effect: hook_enums_1.HookDeferralEffect.Reject,
75
+ };
76
+ }
77
+ const approved = [...record.approved, event.requirement];
78
+ if (approved.length < record.requirements.length) {
79
+ return { record: { ...record, approved }, effect: hook_enums_1.HookDeferralEffect.None };
80
+ }
81
+ return {
82
+ record: { ...record, approved, state: hook_enums_1.HookDeferralState.Resumed },
83
+ effect: hook_enums_1.HookDeferralEffect.Resume,
84
+ };
85
+ }
86
+ function transitionHookDeferral(record, event) {
87
+ if (record.state !== hook_enums_1.HookDeferralState.Pending) {
88
+ return { record, effect: hook_enums_1.HookDeferralEffect.None };
89
+ }
90
+ switch (event.kind) {
91
+ case hook_enums_1.HookDeferralEventKind.Settled:
92
+ return settle(record, event);
93
+ case hook_enums_1.HookDeferralEventKind.Cancelled:
94
+ return {
95
+ record: { ...record, state: hook_enums_1.HookDeferralState.Cancelled },
96
+ effect: hook_enums_1.HookDeferralEffect.None,
97
+ };
98
+ case hook_enums_1.HookDeferralEventKind.Expired:
99
+ return {
100
+ record: { ...record, state: hook_enums_1.HookDeferralState.Expired },
101
+ effect: hook_enums_1.HookDeferralEffect.None,
102
+ };
103
+ default: {
104
+ const exhaustive = event;
105
+ throw new Error(`transitionHookDeferral: unhandled event ${JSON.stringify(exhaustive)}.`);
106
+ }
107
+ }
108
+ }
109
+ function isHookCommitCurrent(evaluated, current) {
110
+ return (evaluated.candidateId === current.candidateId &&
111
+ evaluated.candidateVersion === current.candidateVersion);
112
+ }
113
+ //# sourceMappingURL=hook-deferral.js.map