@hyperscale0/udl 2.6.1 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/CHANGELOG.md +4 -328
  2. package/LICENSING.md +1 -2
  3. package/README.md +3 -114
  4. package/TRADEMARKS.md +2 -2
  5. package/dist/diagnostics.d.ts +21 -201
  6. package/dist/diagnostics.d.ts.map +1 -1
  7. package/dist/diagnostics.js +29 -193
  8. package/dist/diagnostics.js.map +1 -1
  9. package/dist/evolution.d.ts +3 -132
  10. package/dist/evolution.d.ts.map +1 -1
  11. package/dist/evolution.js +29 -633
  12. package/dist/evolution.js.map +1 -1
  13. package/dist/finance.d.ts +5 -72
  14. package/dist/finance.d.ts.map +1 -1
  15. package/dist/finance.js +233 -737
  16. package/dist/finance.js.map +1 -1
  17. package/dist/index.d.ts +7 -18
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +7 -12
  20. package/dist/index.js.map +1 -1
  21. package/dist/instrument-references.d.ts.map +1 -1
  22. package/dist/instrument-references.js +3 -2
  23. package/dist/instrument-references.js.map +1 -1
  24. package/dist/schema.d.ts +2079 -4564
  25. package/dist/schema.d.ts.map +1 -1
  26. package/dist/schema.js +270 -1609
  27. package/dist/schema.js.map +1 -1
  28. package/dist/validation.d.ts +8 -104
  29. package/dist/validation.d.ts.map +1 -1
  30. package/dist/validation.js +653 -3271
  31. package/dist/validation.js.map +1 -1
  32. package/docs/README.md +148 -14
  33. package/package.json +7 -11
  34. package/spec/README.md +152 -164
  35. package/spec/darb.udl.json +249 -0
  36. package/spec/udl.schema.json +4104 -3202
  37. package/src/diagnostics.ts +51 -246
  38. package/src/evolution.ts +39 -1045
  39. package/src/finance.ts +287 -1127
  40. package/src/index.ts +18 -142
  41. package/src/instrument-references.ts +3 -2
  42. package/src/schema.ts +285 -1843
  43. package/src/validation.ts +870 -5611
  44. package/conformance/README.md +0 -82
  45. package/conformance/evolution/action-contract.expected.json +0 -10
  46. package/conformance/evolution/action-contract.live.udl +0 -44
  47. package/conformance/evolution/action-contract.next.udl +0 -45
  48. package/conformance/evolution/product-identity.expected.json +0 -10
  49. package/conformance/evolution/product-identity.live.udl +0 -55
  50. package/conformance/evolution/product-identity.next.udl +0 -55
  51. package/conformance/evolution/version-required.expected.json +0 -10
  52. package/conformance/evolution/version-required.live.udl +0 -55
  53. package/conformance/evolution/version-required.next.udl +0 -58
  54. package/conformance/invalid/action-without-transition.expected.json +0 -10
  55. package/conformance/invalid/action-without-transition.udl +0 -60
  56. package/conformance/invalid/agent-description-too-long.expected.json +0 -10
  57. package/conformance/invalid/agent-description-too-long.udl +0 -57
  58. package/conformance/invalid/blank-title.expected.json +0 -10
  59. package/conformance/invalid/blank-title.udl +0 -54
  60. package/conformance/invalid/call-binds-results.expected.json +0 -10
  61. package/conformance/invalid/call-binds-results.udl +0 -314
  62. package/conformance/invalid/call-unknown-action.expected.json +0 -10
  63. package/conformance/invalid/call-unknown-action.udl +0 -314
  64. package/conformance/invalid/composition-dial-duplicate-key.expected.json +0 -10
  65. package/conformance/invalid/composition-dial-duplicate-key.udl +0 -73
  66. package/conformance/invalid/depth-budget.expected.json +0 -10
  67. package/conformance/invalid/depth-budget.udl +0 -49
  68. package/conformance/invalid/duplicate-subject.expected.json +0 -10
  69. package/conformance/invalid/duplicate-subject.udl +0 -230
  70. package/conformance/invalid/forged-effects.expected.json +0 -10
  71. package/conformance/invalid/forged-effects.udl +0 -76
  72. package/conformance/invalid/format-version.expected.json +0 -10
  73. package/conformance/invalid/format-version.udl +0 -54
  74. package/conformance/invalid/instrument-id-not-snake-case.expected.json +0 -10
  75. package/conformance/invalid/instrument-id-not-snake-case.udl +0 -54
  76. package/conformance/invalid/invalid-aggregate-gate-shape.expected.json +0 -10
  77. package/conformance/invalid/invalid-aggregate-gate-shape.udl +0 -1819
  78. package/conformance/invalid/invalid-check-duration.expected.json +0 -10
  79. package/conformance/invalid/invalid-check-duration.udl +0 -219
  80. package/conformance/invalid/invalid-dial-anchor.expected.json +0 -10
  81. package/conformance/invalid/invalid-dial-anchor.udl +0 -219
  82. package/conformance/invalid/invalid-exception-parent-ref.expected.json +0 -10
  83. package/conformance/invalid/invalid-exception-parent-ref.udl +0 -2487
  84. package/conformance/invalid/invalid-exposure-shape.expected.json +0 -10
  85. package/conformance/invalid/invalid-exposure-shape.udl +0 -1819
  86. package/conformance/invalid/invalid-journeys.expected.json +0 -10
  87. package/conformance/invalid/invalid-journeys.udl +0 -77
  88. package/conformance/invalid/invalid-remainder.expected.json +0 -10
  89. package/conformance/invalid/invalid-remainder.udl +0 -220
  90. package/conformance/invalid/invalid-schema-keyword.expected.json +0 -10
  91. package/conformance/invalid/invalid-schema-keyword.udl +0 -220
  92. package/conformance/invalid/invalid-utf8.expected.json +0 -10
  93. package/conformance/invalid/invalid-utf8.udl +0 -1
  94. package/conformance/invalid/leaf-effect-mismatch.expected.json +0 -10
  95. package/conformance/invalid/leaf-effect-mismatch.udl +0 -314
  96. package/conformance/invalid/malformed-json.expected.json +0 -10
  97. package/conformance/invalid/malformed-json.udl +0 -1
  98. package/conformance/invalid/missing-create-action.expected.json +0 -10
  99. package/conformance/invalid/missing-create-action.udl +0 -48
  100. package/conformance/invalid/missing-exception-amount-field.expected.json +0 -10
  101. package/conformance/invalid/missing-exception-amount-field.udl +0 -2487
  102. package/conformance/invalid/missing-exception-contract.expected.json +0 -14
  103. package/conformance/invalid/missing-exception-contract.udl +0 -2523
  104. package/conformance/invalid/missing-exception-reason-field.expected.json +0 -10
  105. package/conformance/invalid/missing-exception-reason-field.udl +0 -2487
  106. package/conformance/invalid/not-an-object.expected.json +0 -10
  107. package/conformance/invalid/not-an-object.udl +0 -1
  108. package/conformance/invalid/payout-reconcile-not-a-bank-debit.expected.json +0 -10
  109. package/conformance/invalid/payout-reconcile-not-a-bank-debit.udl +0 -259
  110. package/conformance/invalid/piece-plan-without-partition.expected.json +0 -10
  111. package/conformance/invalid/piece-plan-without-partition.udl +0 -305
  112. package/conformance/invalid/private-action-independent-approval.expected.json +0 -10
  113. package/conformance/invalid/private-action-independent-approval.udl +0 -314
  114. package/conformance/invalid/quote-freeze-set-incomplete.expected.json +0 -10
  115. package/conformance/invalid/quote-freeze-set-incomplete.udl +0 -261
  116. package/conformance/invalid/quote-named-reference-gate.expected.json +0 -10
  117. package/conformance/invalid/quote-named-reference-gate.udl +0 -50
  118. package/conformance/invalid/reconcile-named-reference-gate.expected.json +0 -10
  119. package/conformance/invalid/reconcile-named-reference-gate.udl +0 -50
  120. package/conformance/invalid/unfund-order-not-reversed.expected.json +0 -10
  121. package/conformance/invalid/unfund-order-not-reversed.udl +0 -314
  122. package/conformance/invalid/unknown-key.expected.json +0 -10
  123. package/conformance/invalid/unknown-key.udl +0 -55
  124. package/conformance/invalid/unknown-reference-gate-field.expected.json +0 -10
  125. package/conformance/invalid/unknown-reference-gate-field.udl +0 -1819
  126. package/conformance/invalid/unknown-required-field.expected.json +0 -10
  127. package/conformance/invalid/unknown-required-field.udl +0 -220
  128. package/conformance/invalid/unreachable-state.expected.json +0 -10
  129. package/conformance/invalid/unreachable-state.udl +0 -55
  130. package/conformance/invalid/wrong-exception-amount-field.expected.json +0 -10
  131. package/conformance/invalid/wrong-exception-amount-field.udl +0 -2487
  132. package/conformance/invalid/wrong-exception-reason-field.expected.json +0 -10
  133. package/conformance/invalid/wrong-exception-reason-field.udl +0 -2487
  134. package/conformance/valid/agent-description.expected.json +0 -6
  135. package/conformance/valid/agent-description.udl +0 -66
  136. package/conformance/valid/attested.expected.json +0 -6
  137. package/conformance/valid/attested.udl +0 -251
  138. package/conformance/valid/cards.expected.json +0 -6
  139. package/conformance/valid/cards.udl +0 -1579
  140. package/conformance/valid/commerce-escrow.expected.json +0 -6
  141. package/conformance/valid/commerce-escrow.udl +0 -1512
  142. package/conformance/valid/compiled-crowdfunding.expected.json +0 -6
  143. package/conformance/valid/compiled-crowdfunding.udl +0 -1843
  144. package/conformance/valid/compiled-watch-club.expected.json +0 -6
  145. package/conformance/valid/compiled-watch-club.udl +0 -2486
  146. package/conformance/valid/complete-contract.expected.json +0 -6
  147. package/conformance/valid/complete-contract.udl +0 -218
  148. package/conformance/valid/effect-signatures.expected.json +0 -6
  149. package/conformance/valid/effect-signatures.udl +0 -75
  150. package/conformance/valid/hand-edited.expected.json +0 -6
  151. package/conformance/valid/hand-edited.udl +0 -1
  152. package/conformance/valid/insured-car-marketplace.expected.json +0 -6
  153. package/conformance/valid/insured-car-marketplace.udl +0 -1050
  154. package/conformance/valid/insured-travel.expected.json +0 -6
  155. package/conformance/valid/insured-travel.udl +0 -3469
  156. package/conformance/valid/minimal.expected.json +0 -6
  157. package/conformance/valid/minimal.udl +0 -62
  158. package/conformance/valid/piece-plan-calls.expected.json +0 -6
  159. package/conformance/valid/piece-plan-calls.udl +0 -314
  160. package/conformance/valid/protection.expected.json +0 -6
  161. package/conformance/valid/protection.udl +0 -1551
  162. package/conformance/valid/string-escaping.expected.json +0 -6
  163. package/conformance/valid/string-escaping.udl +0 -54
  164. package/conformance/valid/vocabulary.expected.json +0 -6
  165. package/conformance/valid/vocabulary.udl +0 -2012
  166. package/dist/allocation.d.ts +0 -60
  167. package/dist/allocation.d.ts.map +0 -1
  168. package/dist/allocation.js +0 -177
  169. package/dist/allocation.js.map +0 -1
  170. package/dist/check-profiles.d.ts +0 -57
  171. package/dist/check-profiles.d.ts.map +0 -1
  172. package/dist/check-profiles.js +0 -62
  173. package/dist/check-profiles.js.map +0 -1
  174. package/dist/distribution.d.ts +0 -15
  175. package/dist/distribution.d.ts.map +0 -1
  176. package/dist/distribution.js +0 -49
  177. package/dist/distribution.js.map +0 -1
  178. package/dist/effects.d.ts +0 -58
  179. package/dist/effects.d.ts.map +0 -1
  180. package/dist/effects.js +0 -1126
  181. package/dist/effects.js.map +0 -1
  182. package/dist/reference.d.ts +0 -3
  183. package/dist/reference.d.ts.map +0 -1
  184. package/dist/reference.js +0 -28
  185. package/dist/reference.js.map +0 -1
  186. package/dist/vocabulary.d.ts +0 -23
  187. package/dist/vocabulary.d.ts.map +0 -1
  188. package/dist/vocabulary.js +0 -1052
  189. package/dist/vocabulary.js.map +0 -1
  190. package/docs/funding-custody.md +0 -165
  191. package/docs/guide/01-a-document.md +0 -37
  192. package/docs/guide/02-money-steps.md +0 -23
  193. package/docs/guide/03-laws.md +0 -18
  194. package/docs/guide/04-fees-and-remainder.md +0 -36
  195. package/docs/guide/05-checks-updates-dials.md +0 -7
  196. package/docs/guide/06-effects.md +0 -11
  197. package/docs/guide/07-evolution.md +0 -11
  198. package/docs/guide/08-implementing.md +0 -13
  199. package/docs/guide/09-schedules-and-allocation.md +0 -132
  200. package/docs/llms-full.txt +0 -2008
  201. package/docs/llms.txt +0 -14
  202. package/docs/piece-plans.md +0 -148
  203. package/docs/reference/canonical.md +0 -16
  204. package/docs/reference/clauses.md +0 -1585
  205. package/docs/reference/cli.md +0 -24
  206. package/docs/reference/diagnostics.md +0 -38
  207. package/skills/udl/SKILL.md +0 -28
  208. package/src/allocation.ts +0 -259
  209. package/src/check-profiles.ts +0 -80
  210. package/src/distribution.ts +0 -61
  211. package/src/effects.ts +0 -1920
  212. package/src/reference.ts +0 -31
  213. package/src/vocabulary.ts +0 -1635
@@ -1,60 +0,0 @@
1
- export type AllocationBucketKey = "principal" | "profit" | "cost" | "fine";
2
- export interface AllocationBalance {
3
- readonly key: AllocationBucketKey;
4
- readonly assessmentId: string;
5
- readonly destinationAccountId: string;
6
- readonly amount: bigint;
7
- readonly consumed: bigint;
8
- }
9
- export interface AllocationSlice {
10
- readonly id: string;
11
- readonly dueAt: string;
12
- readonly position: number;
13
- readonly paid: boolean;
14
- readonly buckets: readonly AllocationBalance[];
15
- }
16
- export interface AllocationInput {
17
- readonly asOf: string;
18
- readonly earningRule: "per_slice_on_due" | "on_disbursement";
19
- readonly mode: "payment" | "payoff" | "write_off";
20
- readonly payment?: bigint | undefined;
21
- readonly assessmentId?: string;
22
- readonly slices: readonly AllocationSlice[];
23
- }
24
- export interface AllocationPosting {
25
- readonly sliceId: string;
26
- readonly assessmentId: string;
27
- readonly bucket: AllocationBucketKey;
28
- readonly destinationAccountId: string;
29
- readonly amount: bigint;
30
- }
31
- export interface AllocationCancellation {
32
- readonly sliceId: string;
33
- readonly assessmentId: string;
34
- readonly bucket: AllocationBucketKey;
35
- readonly amount: bigint;
36
- readonly reason: "unearned_profit" | "write_off";
37
- }
38
- /** Plan from locked balances. The engine owns identity claims and atomic posting. */
39
- export declare function planAllocation(contract: {
40
- readonly buckets: readonly {
41
- readonly key: AllocationBucketKey;
42
- }[];
43
- }, input: AllocationInput): {
44
- postings: AllocationPosting[];
45
- cancellations: AllocationCancellation[];
46
- amount: bigint;
47
- };
48
- /** Reverse recorded postings once, without reopening the consumed assessment. */
49
- export declare function planAllocationRefund(postings: readonly AllocationPosting[], originalPayer: string, refundedAssessments: readonly string[], assessmentId?: string): {
50
- assessmentId: string;
51
- amount: bigint;
52
- sourceAccountId: string;
53
- destinationAccountId: string;
54
- }[];
55
- /** Evaluate a slice gate from the same locked consumption balances used to allocate. */
56
- export declare function matchesAllocationConsumption(clause: {
57
- readonly buckets: readonly AllocationBucketKey[];
58
- readonly check: "settled" | "outstanding";
59
- }, slice: AllocationSlice): boolean;
60
- //# sourceMappingURL=allocation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"allocation.d.ts","sourceRoot":"","sources":["../src/allocation.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAC3E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AACD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAChD;AACD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,kBAAkB,GAAG,iBAAiB,CAAC;IAC7D,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;IAClD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C;AACD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAAC;CAClD;AAcD,qFAAqF;AACrF,wBAAgB,cAAc,CAC5B,QAAQ,EAAE;IACR,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAA;KAAE,EAAE,CAAC;CACpE,EACD,KAAK,EAAE,eAAe;cA4HK,iBAAiB,EAAE;;;EAoB/C;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,EACtC,aAAa,EAAE,MAAM,EACrB,mBAAmB,EAAE,SAAS,MAAM,EAAE,EACtC,YAAY,CAAC,EAAE,MAAM;;;;;IA2BtB;AAED,wFAAwF;AACxF,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE;IACN,QAAQ,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,aAAa,CAAC;CAC3C,EACD,KAAK,EAAE,eAAe,GACrB,OAAO,CAgBT"}
@@ -1,177 +0,0 @@
1
- function clock(value) {
2
- if (!/^\d{4}-\d\d-\d\d(?:T\d\d:\d\d:\d\d(?:\.\d+)?Z)?$/.test(value))
3
- throw new Error("allocation needs an authoritative UTC time");
4
- const result = Date.parse(value);
5
- if (!Number.isFinite(result) ||
6
- new Date(`${value.slice(0, 10)}T00:00:00Z`).toISOString().slice(0, 10) !==
7
- value.slice(0, 10))
8
- throw new Error("invalid allocation time");
9
- return result;
10
- }
11
- /** Plan from locked balances. The engine owns identity claims and atomic posting. */
12
- export function planAllocation(contract, input) {
13
- const priority = contract.buckets.map((bucket) => bucket.key);
14
- const keys = new Set(priority);
15
- if (priority.length < 2 ||
16
- priority.length > 4 ||
17
- keys.size !== priority.length ||
18
- !keys.has("principal") ||
19
- !keys.has("profit") ||
20
- priority.some((key) => !["principal", "profit", "cost", "fine"].includes(key)))
21
- throw new Error("invalid allocation priority");
22
- if (!["per_slice_on_due", "on_disbursement"].includes(input.earningRule) ||
23
- !["payment", "payoff", "write_off"].includes(input.mode))
24
- throw new Error("invalid earning rule or allocation mode");
25
- if (!input.slices.length || input.slices.length > 366)
26
- throw new Error("allocation requires 1 to 366 slices");
27
- if (input.assessmentId !== undefined &&
28
- (input.mode !== "payment" || !input.assessmentId))
29
- throw new Error("assessment selection requires payment mode");
30
- const asOf = clock(input.asOf);
31
- if (input.mode === "write_off"
32
- ? input.payment !== undefined
33
- : input.payment === undefined
34
- ? input.mode !== "payoff" && input.assessmentId === undefined
35
- : typeof input.payment !== "bigint" ||
36
- input.payment < 0n ||
37
- (input.mode === "payment" && input.payment === 0n))
38
- throw new Error("invalid allocation payment");
39
- const ids = new Set();
40
- const positions = new Set();
41
- const assessments = new Set();
42
- const slices = input.slices
43
- .map((slice) => {
44
- const due = clock(slice.dueAt);
45
- if (!slice.id ||
46
- ids.has(slice.id) ||
47
- !Number.isInteger(slice.position) ||
48
- slice.position < 1 ||
49
- positions.has(slice.position) ||
50
- typeof slice.paid !== "boolean" ||
51
- slice.buckets.length > 256)
52
- throw new Error("invalid or duplicate slice");
53
- ids.add(slice.id);
54
- positions.add(slice.position);
55
- for (const balance of slice.buckets) {
56
- if (!keys.has(balance.key) ||
57
- !balance.assessmentId ||
58
- assessments.has(balance.assessmentId) ||
59
- !balance.destinationAccountId ||
60
- typeof balance.amount !== "bigint" ||
61
- typeof balance.consumed !== "bigint" ||
62
- balance.amount < 0n ||
63
- balance.consumed < 0n ||
64
- balance.consumed > balance.amount)
65
- throw new Error("invalid or duplicate assessment balance");
66
- assessments.add(balance.assessmentId);
67
- }
68
- return { slice, due };
69
- })
70
- .sort((a, b) => a.due - b.due || a.slice.position - b.slice.position);
71
- const candidates = [];
72
- const cancellations = [];
73
- for (const { slice, due } of slices) {
74
- const earned = input.earningRule === "on_disbursement" || due <= asOf || slice.paid;
75
- for (const key of priority) {
76
- // Multiple assessed charges of one kind have a deterministic identity order.
77
- const balances = slice.buckets
78
- .filter((balance) => balance.key === key)
79
- .sort((a, b) => a.assessmentId < b.assessmentId
80
- ? -1
81
- : a.assessmentId > b.assessmentId
82
- ? 1
83
- : 0);
84
- for (const balance of balances) {
85
- const amount = balance.amount - balance.consumed;
86
- if (input.assessmentId !== undefined &&
87
- balance.assessmentId !== input.assessmentId)
88
- continue;
89
- if (amount === 0n)
90
- continue;
91
- const unearned = key === "profit" && !earned;
92
- if (input.mode === "write_off" ||
93
- (input.mode === "payoff" && unearned)) {
94
- cancellations.push({
95
- sliceId: slice.id,
96
- assessmentId: balance.assessmentId,
97
- bucket: key,
98
- amount,
99
- reason: unearned ? "unearned_profit" : "write_off",
100
- });
101
- }
102
- else {
103
- candidates.push({
104
- sliceId: slice.id,
105
- assessmentId: balance.assessmentId,
106
- bucket: key,
107
- destinationAccountId: balance.destinationAccountId,
108
- amount,
109
- });
110
- }
111
- }
112
- }
113
- }
114
- const outstanding = candidates.reduce((sum, row) => sum + row.amount, 0n);
115
- if (input.mode === "write_off")
116
- return { postings: [], cancellations, amount: 0n };
117
- if (input.assessmentId !== undefined && !assessments.has(input.assessmentId))
118
- throw new Error("assessment is not in the allocation");
119
- const payment = input.payment ?? outstanding;
120
- if (input.mode === "payment" && payment === 0n)
121
- throw new Error("assessment already consumed");
122
- if (payment > outstanding ||
123
- (input.mode === "payoff" && payment !== outstanding))
124
- throw new Error("payment does not match outstanding allocation");
125
- let remaining = payment;
126
- const postings = [];
127
- for (const candidate of candidates) {
128
- const amount = candidate.amount < remaining ? candidate.amount : remaining;
129
- if (amount > 0n)
130
- postings.push({ ...candidate, amount });
131
- remaining -= amount;
132
- if (remaining === 0n)
133
- break;
134
- }
135
- return { postings, cancellations, amount: payment };
136
- }
137
- /** Reverse recorded postings once, without reopening the consumed assessment. */
138
- export function planAllocationRefund(postings, originalPayer, refundedAssessments, assessmentId) {
139
- if (!originalPayer || postings.length > 366 * 256)
140
- throw new Error("invalid allocation receipt");
141
- const selected = postings.filter((row) => assessmentId === undefined || row.assessmentId === assessmentId);
142
- if (!selected.length)
143
- throw new Error("assessment has no recorded allocation");
144
- const seen = new Set();
145
- return selected.map((row) => {
146
- if (row.amount <= 0n ||
147
- !row.destinationAccountId ||
148
- !row.assessmentId ||
149
- seen.has(row.assessmentId) ||
150
- refundedAssessments.includes(row.assessmentId))
151
- throw new Error("assessment already refunded or invalid receipt");
152
- seen.add(row.assessmentId);
153
- return {
154
- assessmentId: row.assessmentId,
155
- amount: row.amount,
156
- sourceAccountId: row.destinationAccountId,
157
- destinationAccountId: originalPayer,
158
- };
159
- });
160
- }
161
- /** Evaluate a slice gate from the same locked consumption balances used to allocate. */
162
- export function matchesAllocationConsumption(clause, slice) {
163
- if (!clause.buckets.length ||
164
- new Set(clause.buckets).size !== clause.buckets.length)
165
- throw new Error("allocation gate needs distinct buckets");
166
- const settled = clause.buckets
167
- .map((key) => {
168
- const rows = slice.buckets.filter((bucket) => bucket.key === key);
169
- for (const row of rows)
170
- if (row.consumed < 0n || row.consumed > row.amount || row.amount < 0n)
171
- throw new Error("invalid consumption");
172
- return rows.every((row) => row.consumed === row.amount);
173
- })
174
- .every(Boolean);
175
- return clause.check === "settled" ? settled : !settled;
176
- }
177
- //# sourceMappingURL=allocation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"allocation.js","sourceRoot":"","sources":["../src/allocation.ts"],"names":[],"mappings":"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"}
@@ -1,57 +0,0 @@
1
- /**
2
- * Evidence profiles that an instrument action may require before it runs.
3
- * The public grammar and the runtime both read this table. A pair absent here
4
- * cannot gate an action.
5
- */
6
- export interface UdlCheckEvidenceProfile {
7
- readonly family: string;
8
- readonly checkKind: string;
9
- readonly kindField?: string;
10
- readonly statusField: string;
11
- readonly statuses: readonly string[];
12
- }
13
- export declare const udlCheckEvidenceProfiles: readonly [{
14
- readonly family: "national_identity";
15
- readonly checkKind: "identity_verification";
16
- readonly kindField: "checkKind";
17
- readonly statusField: "verificationStatus";
18
- readonly statuses: readonly ["requested", "waiting", "completed", "rejected", "expired", "error"];
19
- }, {
20
- readonly family: "national_identity";
21
- readonly checkKind: "contact_ownership_verification";
22
- readonly kindField: "checkKind";
23
- readonly statusField: "matchResult";
24
- readonly statuses: readonly ["match", "no_match"];
25
- }, {
26
- readonly family: "credit_bureau";
27
- readonly checkKind: "consumer_inquiry";
28
- readonly kindField: "inquiryType";
29
- readonly statusField: "bureauStatus";
30
- readonly statuses: readonly ["returned", "acknowledged", "correction_required"];
31
- }, {
32
- readonly family: "credit_bureau";
33
- readonly checkKind: "commercial_inquiry";
34
- readonly kindField: "inquiryType";
35
- readonly statusField: "bureauStatus";
36
- readonly statuses: readonly ["returned", "acknowledged", "correction_required"];
37
- }, {
38
- readonly family: "credit_bureau";
39
- readonly checkKind: "facility_report";
40
- readonly kindField: "inquiryType";
41
- readonly statusField: "bureauStatus";
42
- readonly statuses: readonly ["returned", "acknowledged", "correction_required"];
43
- }, {
44
- readonly family: "sanctions_screening";
45
- readonly checkKind: "screen";
46
- readonly kindField: "checkKind";
47
- readonly statusField: "screeningStatus";
48
- readonly statuses: readonly ["clear", "hit", "manual_review"];
49
- }, {
50
- readonly family: "enforcement_instrument";
51
- readonly checkKind: "note_request";
52
- readonly statusField: "requestStatus";
53
- readonly statuses: readonly ["debtor_approved", "debtor_rejected", "auto_cancelled"];
54
- }];
55
- /** Returns the tenant-gateable evidence profile for one family and check. */
56
- export declare function udlCheckEvidenceProfile(family: string, checkKind: string): UdlCheckEvidenceProfile | undefined;
57
- //# sourceMappingURL=check-profiles.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"check-profiles.d.ts","sourceRoot":"","sources":["../src/check-profiles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,eAAO,MAAM,wBAAwB;qBAEzB,mBAAmB;wBAChB,uBAAuB;wBACvB,WAAW;0BACT,oBAAoB;;;qBAWzB,mBAAmB;wBAChB,gCAAgC;wBAChC,WAAW;0BACT,aAAa;;;qBAIlB,eAAe;wBACZ,kBAAkB;wBAClB,aAAa;0BACX,cAAc;;;qBAInB,eAAe;wBACZ,oBAAoB;wBACpB,aAAa;0BACX,cAAc;;;qBAInB,eAAe;wBACZ,iBAAiB;wBACjB,aAAa;0BACX,cAAc;;;qBAInB,qBAAqB;wBAClB,QAAQ;wBACR,WAAW;0BACT,iBAAiB;;;qBAItB,wBAAwB;wBACrB,cAAc;0BACZ,eAAe;;EAGuB,CAAC;AAExD,6EAA6E;AAC7E,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,uBAAuB,GAAG,SAAS,CAIrC"}
@@ -1,62 +0,0 @@
1
- export const udlCheckEvidenceProfiles = [
2
- {
3
- family: "national_identity",
4
- checkKind: "identity_verification",
5
- kindField: "checkKind",
6
- statusField: "verificationStatus",
7
- statuses: [
8
- "requested",
9
- "waiting",
10
- "completed",
11
- "rejected",
12
- "expired",
13
- "error",
14
- ],
15
- },
16
- {
17
- family: "national_identity",
18
- checkKind: "contact_ownership_verification",
19
- kindField: "checkKind",
20
- statusField: "matchResult",
21
- statuses: ["match", "no_match"],
22
- },
23
- {
24
- family: "credit_bureau",
25
- checkKind: "consumer_inquiry",
26
- kindField: "inquiryType",
27
- statusField: "bureauStatus",
28
- statuses: ["returned", "acknowledged", "correction_required"],
29
- },
30
- {
31
- family: "credit_bureau",
32
- checkKind: "commercial_inquiry",
33
- kindField: "inquiryType",
34
- statusField: "bureauStatus",
35
- statuses: ["returned", "acknowledged", "correction_required"],
36
- },
37
- {
38
- family: "credit_bureau",
39
- checkKind: "facility_report",
40
- kindField: "inquiryType",
41
- statusField: "bureauStatus",
42
- statuses: ["returned", "acknowledged", "correction_required"],
43
- },
44
- {
45
- family: "sanctions_screening",
46
- checkKind: "screen",
47
- kindField: "checkKind",
48
- statusField: "screeningStatus",
49
- statuses: ["clear", "hit", "manual_review"],
50
- },
51
- {
52
- family: "enforcement_instrument",
53
- checkKind: "note_request",
54
- statusField: "requestStatus",
55
- statuses: ["debtor_approved", "debtor_rejected", "auto_cancelled"],
56
- },
57
- ];
58
- /** Returns the tenant-gateable evidence profile for one family and check. */
59
- export function udlCheckEvidenceProfile(family, checkKind) {
60
- return udlCheckEvidenceProfiles.find((profile) => profile.family === family && profile.checkKind === checkKind);
61
- }
62
- //# sourceMappingURL=check-profiles.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"check-profiles.js","sourceRoot":"","sources":["../src/check-profiles.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC;QACE,MAAM,EAAE,mBAAmB;QAC3B,SAAS,EAAE,uBAAuB;QAClC,SAAS,EAAE,WAAW;QACtB,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE;YACR,WAAW;YACX,SAAS;YACT,WAAW;YACX,UAAU;YACV,SAAS;YACT,OAAO;SACR;KACF;IACD;QACE,MAAM,EAAE,mBAAmB;QAC3B,SAAS,EAAE,gCAAgC;QAC3C,SAAS,EAAE,WAAW;QACtB,WAAW,EAAE,aAAa;QAC1B,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;KAChC;IACD;QACE,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,kBAAkB;QAC7B,SAAS,EAAE,aAAa;QACxB,WAAW,EAAE,cAAc;QAC3B,QAAQ,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,qBAAqB,CAAC;KAC9D;IACD;QACE,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,oBAAoB;QAC/B,SAAS,EAAE,aAAa;QACxB,WAAW,EAAE,cAAc;QAC3B,QAAQ,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,qBAAqB,CAAC;KAC9D;IACD;QACE,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,iBAAiB;QAC5B,SAAS,EAAE,aAAa;QACxB,WAAW,EAAE,cAAc;QAC3B,QAAQ,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,qBAAqB,CAAC;KAC9D;IACD;QACE,MAAM,EAAE,qBAAqB;QAC7B,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,WAAW;QACtB,WAAW,EAAE,iBAAiB;QAC9B,QAAQ,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC;KAC5C;IACD;QACE,MAAM,EAAE,wBAAwB;QAChC,SAAS,EAAE,cAAc;QACzB,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;KACnE;CACoD,CAAC;AAExD,6EAA6E;AAC7E,MAAM,UAAU,uBAAuB,CACrC,MAAc,EACd,SAAiB;IAEjB,OAAO,wBAAwB,CAAC,IAAI,CAClC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,CAC1E,CAAC;AACJ,CAAC"}
@@ -1,15 +0,0 @@
1
- import type { UdlAction } from "./schema.js";
2
- /** Arithmetic only. The host resolves and consumes the receipt and snapshot under locks. */
3
- export declare function distributeReceiptAmounts(clause: NonNullable<UdlAction["receiptDistribution"]>, principal: bigint, profit: bigint, tickets: readonly {
4
- readonly id: string;
5
- readonly weight: bigint;
6
- }[]): {
7
- fee: bigint;
8
- vat: bigint;
9
- residual: bigint;
10
- shares: {
11
- id: string;
12
- amount: bigint;
13
- }[];
14
- };
15
- //# sourceMappingURL=distribution.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"distribution.d.ts","sourceRoot":"","sources":["../src/distribution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,4FAA4F;AAC5F,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,EACrD,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,SAAS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE;;;;;;;;EAqDrE"}
@@ -1,49 +0,0 @@
1
- /** Arithmetic only. The host resolves and consumes the receipt and snapshot under locks. */
2
- export function distributeReceiptAmounts(clause, principal, profit, tickets) {
3
- if (principal < 0n || profit < 0n || tickets.length === 0)
4
- throw new Error("distribution requires nonnegative receipt amounts and tickets");
5
- if (new Set(tickets.map((ticket) => ticket.id)).size !== tickets.length ||
6
- tickets.some((ticket) => ticket.weight <= 0n))
7
- throw new Error("snapshot tickets must have unique identities and positive weights");
8
- const loss = clause.mode === "loss";
9
- if (loss && (profit !== 0n || clause.feeBps !== 0 || clause.vatBps !== 0))
10
- throw new Error("loss allocation contains only principal and no fees");
11
- const totalWeight = tickets.reduce((sum, ticket) => sum + ticket.weight, 0n);
12
- const fee = (profit * BigInt(clause.feeBps)) / 10000n;
13
- const vat = (fee * BigInt(clause.vatBps)) / 10000n;
14
- const amount = principal + profit - fee - vat;
15
- if (amount < 0n)
16
- throw new Error("fee and VAT exceed the receipt");
17
- const shares = tickets.map((ticket) => ({
18
- id: ticket.id,
19
- amount: (amount * ticket.weight) / totalWeight,
20
- }));
21
- let residual = amount - shares.reduce((sum, share) => sum + share.amount, 0n);
22
- if (loss) {
23
- // A loss cannot be paid to a residual cash beneficiary. Largest remainder
24
- // assigns every lost minor unit to an investor, with identity breaking ties.
25
- const ordered = tickets
26
- .map((ticket, index) => ({
27
- index,
28
- id: ticket.id,
29
- remainder: (amount * ticket.weight) % totalWeight,
30
- }))
31
- .sort((a, b) => a.remainder === b.remainder
32
- ? a.id < b.id
33
- ? -1
34
- : a.id > b.id
35
- ? 1
36
- : 0
37
- : a.remainder > b.remainder
38
- ? -1
39
- : 1);
40
- for (const ticket of ordered) {
41
- if (residual === 0n)
42
- break;
43
- shares[ticket.index].amount += 1n;
44
- residual -= 1n;
45
- }
46
- }
47
- return { fee, vat, residual, shares };
48
- }
49
- //# sourceMappingURL=distribution.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"distribution.js","sourceRoot":"","sources":["../src/distribution.ts"],"names":[],"mappings":"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"}
package/dist/effects.d.ts DELETED
@@ -1,58 +0,0 @@
1
- import { type UdlIssue } from "./diagnostics.js";
2
- import { type UdlEffectKind, type UdlInstrument, type UdlMove, type UdlStep } from "./schema.js";
3
- export { udlEffectKinds, type UdlEffectKind } from "./schema.js";
4
- type EffectDescriptor = {
5
- readonly kind: UdlEffectKind;
6
- readonly per: "clause" | "element";
7
- readonly signature: {
8
- readonly fixed: string;
9
- } | {
10
- readonly fromField: string;
11
- } | {
12
- readonly movementClass: true;
13
- };
14
- };
15
- type ActionClauseDescriptor = {
16
- readonly effects?: readonly EffectDescriptor[];
17
- readonly scope: "action" | "instrument";
18
- readonly target: string;
19
- };
20
- type EffectRow = {
21
- readonly channel?: string;
22
- readonly role?: string;
23
- readonly signature: string;
24
- readonly source: string;
25
- };
26
- export type DerivedUdlEffects = Partial<Readonly<Record<UdlEffectKind, readonly EffectRow[]>>>;
27
- export type UdlMovementClass = "collection.pay_in" | "deposit.attributed" | "payout.external" | "transfer.internal";
28
- interface Movement {
29
- readonly bind?: Readonly<Record<string, unknown>>;
30
- readonly operation: string;
31
- }
32
- export declare function movementClass(move: Movement): UdlMovementClass;
33
- /** Derive the ABI effect rows declared by the action-clause vocabulary. */
34
- export declare function deriveUdlActionEffects(action: Readonly<Record<string, unknown>>, vocabulary: readonly ActionClauseDescriptor[]): DerivedUdlEffects;
35
- export interface ResolvedActionPlanLeaf {
36
- readonly effects: readonly {
37
- readonly kind: UdlEffectKind;
38
- readonly signature: string;
39
- }[];
40
- readonly evidence: string;
41
- readonly originPath: readonly string[];
42
- readonly step: UdlMove | (Omit<UdlStep, "operation"> & {
43
- readonly operation: UdlStep["operation"] | "payout.create";
44
- });
45
- }
46
- export interface ResolvedActionPlan {
47
- readonly action: string;
48
- readonly effects: DerivedUdlEffects;
49
- readonly leaves: readonly ResolvedActionPlanLeaf[];
50
- readonly pieceId?: string;
51
- }
52
- export interface ResolvedActionPlansResult {
53
- readonly issues: readonly UdlIssue[];
54
- readonly plans: readonly ResolvedActionPlan[];
55
- }
56
- export declare function deriveActionEffectsFromPlan(leaves: readonly ResolvedActionPlanLeaf[]): DerivedUdlEffects;
57
- export declare function resolveUdlActionPlans(instrument: UdlInstrument): ResolvedActionPlansResult;
58
- //# sourceMappingURL=effects.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../src/effects.ts"],"names":[],"mappings":"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"}