@hyperscale0/hsx 1.0.0-beta.1 → 1.0.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 (255) hide show
  1. package/CHANGELOG.md +58 -9
  2. package/LICENSING.md +3 -3
  3. package/README.md +39 -149
  4. package/TRADEMARKS.md +4 -4
  5. package/bin/hsx.ts +2 -0
  6. package/dist/bin/hsx.js +2 -0
  7. package/dist/bin/hsx.js.map +1 -1
  8. package/dist/src/ast.d.ts +135 -10
  9. package/dist/src/ast.d.ts.map +1 -1
  10. package/dist/src/ast.js +24 -0
  11. package/dist/src/ast.js.map +1 -1
  12. package/dist/src/cli.d.ts +4 -1
  13. package/dist/src/cli.d.ts.map +1 -1
  14. package/dist/src/cli.js +172 -16
  15. package/dist/src/cli.js.map +1 -1
  16. package/dist/src/compile.d.ts +42 -7
  17. package/dist/src/compile.d.ts.map +1 -1
  18. package/dist/src/compile.js +82 -16
  19. package/dist/src/compile.js.map +1 -1
  20. package/dist/src/cost.d.ts +78 -0
  21. package/dist/src/cost.d.ts.map +1 -0
  22. package/dist/src/cost.js +369 -0
  23. package/dist/src/cost.js.map +1 -0
  24. package/dist/src/diagnostics.d.ts +11 -0
  25. package/dist/src/diagnostics.d.ts.map +1 -0
  26. package/dist/src/diagnostics.js +420 -0
  27. package/dist/src/diagnostics.js.map +1 -0
  28. package/dist/src/emit.d.ts +34 -0
  29. package/dist/src/emit.d.ts.map +1 -0
  30. package/dist/src/emit.js +137 -0
  31. package/dist/src/emit.js.map +1 -0
  32. package/dist/src/entry-overrides.d.ts +17 -3
  33. package/dist/src/entry-overrides.d.ts.map +1 -1
  34. package/dist/src/entry-overrides.js +180 -35
  35. package/dist/src/entry-overrides.js.map +1 -1
  36. package/dist/src/format.d.ts +10 -0
  37. package/dist/src/format.d.ts.map +1 -0
  38. package/dist/src/format.js +183 -0
  39. package/dist/src/format.js.map +1 -0
  40. package/dist/src/index.d.ts +11 -4
  41. package/dist/src/index.d.ts.map +1 -1
  42. package/dist/src/index.js +10 -3
  43. package/dist/src/index.js.map +1 -1
  44. package/dist/src/ir.d.ts +66 -0
  45. package/dist/src/ir.d.ts.map +1 -0
  46. package/dist/src/ir.js +15 -0
  47. package/dist/src/ir.js.map +1 -0
  48. package/dist/src/lex.d.ts +9 -1
  49. package/dist/src/lex.d.ts.map +1 -1
  50. package/dist/src/lex.js +50 -4
  51. package/dist/src/lex.js.map +1 -1
  52. package/dist/src/limits.d.ts +2 -3
  53. package/dist/src/limits.d.ts.map +1 -1
  54. package/dist/src/limits.js +2 -3
  55. package/dist/src/limits.js.map +1 -1
  56. package/dist/src/lsp/server.d.ts +32 -0
  57. package/dist/src/lsp/server.d.ts.map +1 -0
  58. package/dist/src/lsp/server.js +391 -0
  59. package/dist/src/lsp/server.js.map +1 -0
  60. package/dist/src/modules.d.ts +38 -0
  61. package/dist/src/modules.d.ts.map +1 -0
  62. package/dist/src/modules.js +368 -0
  63. package/dist/src/modules.js.map +1 -0
  64. package/dist/src/parse.d.ts.map +1 -1
  65. package/dist/src/parse.js +590 -17
  66. package/dist/src/parse.js.map +1 -1
  67. package/dist/src/std-bundle.d.ts +2 -0
  68. package/dist/src/std-bundle.d.ts.map +1 -0
  69. package/dist/src/std-bundle.js +88 -0
  70. package/dist/src/std-bundle.js.map +1 -0
  71. package/dist/src/std-library.d.ts +5 -0
  72. package/dist/src/std-library.d.ts.map +1 -0
  73. package/dist/src/std-library.js +9 -0
  74. package/dist/src/std-library.js.map +1 -0
  75. package/dist/src/typecheck.d.ts +8 -0
  76. package/dist/src/typecheck.d.ts.map +1 -0
  77. package/dist/src/typecheck.js +2958 -0
  78. package/dist/src/typecheck.js.map +1 -0
  79. package/dist/src/version.d.ts +4 -15
  80. package/dist/src/version.d.ts.map +1 -1
  81. package/dist/src/version.js +4 -15
  82. package/dist/src/version.js.map +1 -1
  83. package/docs/README.md +26 -0
  84. package/docs/guide/01-first-program.md +24 -0
  85. package/docs/guide/02-money.md +25 -0
  86. package/docs/guide/03-instruments.md +22 -0
  87. package/docs/guide/04-lifecycles.md +25 -0
  88. package/docs/guide/05-fees-and-splits.md +45 -0
  89. package/docs/guide/06-schedules.md +22 -0
  90. package/docs/guide/07-composition.md +46 -0
  91. package/docs/guide/08-writing-a-module.md +26 -0
  92. package/docs/guide/09-cost.md +24 -0
  93. package/docs/guide/10-diagnostics.md +27 -0
  94. package/docs/llms-full.txt +1739 -0
  95. package/docs/llms.txt +45 -0
  96. package/docs/playground.md +54 -0
  97. package/docs/reference/cli.md +35 -0
  98. package/docs/reference/diagnostics.md +619 -0
  99. package/docs/reference/grammar.md +39 -0
  100. package/docs/reference/std/advance.md +35 -0
  101. package/docs/reference/std/cancellable_booking.md +35 -0
  102. package/docs/reference/std/captured_payment.md +43 -0
  103. package/docs/reference/std/conditional_disbursement.md +33 -0
  104. package/docs/reference/std/credit_facility.md +35 -0
  105. package/docs/reference/std/held_payment.md +64 -0
  106. package/docs/reference/std/instant_transfer.md +30 -0
  107. package/docs/reference/std/metered.md +27 -0
  108. package/docs/reference/std/pooled_split.md +26 -0
  109. package/docs/reference/std/premium_forward.md +39 -0
  110. package/docs/reference/std/reconciled_payout.md +33 -0
  111. package/docs/reference/std/recurring_collection.md +25 -0
  112. package/docs/reference/std/rotating_pool.md +42 -0
  113. package/docs/reference/std/scheduled.md +51 -0
  114. package/docs/reference/std/security_deposit.md +46 -0
  115. package/docs/reference/std/settlement_batch.md +42 -0
  116. package/docs/reference/std/swap.md +46 -0
  117. package/docs/reference/std/threshold_pool.md +47 -0
  118. package/docs/reference/std/weighted_distribution.md +39 -0
  119. package/docs/reference/types.md +20 -0
  120. package/docs/reference/udl-output.md +13 -0
  121. package/docs/sessions/2026-09-02-two-instruments.hsx +21 -0
  122. package/docs/sessions/2026-09-02-two-instruments.md +41 -0
  123. package/examples/01-first-program/README.md +45 -0
  124. package/examples/01-first-program/tip-jar.hsx +17 -0
  125. package/examples/02-imports-and-archetypes/README.md +96 -0
  126. package/examples/02-imports-and-archetypes/photo-booth.hsx +37 -0
  127. package/examples/03-diagnostics/README.md +68 -0
  128. package/examples/03-diagnostics/corner-shop-fixed.hsx +22 -0
  129. package/examples/03-diagnostics/corner-shop.hsx +19 -0
  130. package/examples/04-complete-product/README.md +84 -0
  131. package/examples/04-complete-product/study-hall.hsx +67 -0
  132. package/examples/05-watch-club/README.md +9 -0
  133. package/examples/05-watch-club/watch-club.hsx +124 -0
  134. package/examples/README.md +18 -0
  135. package/examples/advance/README.md +3 -0
  136. package/examples/advance/advance.hsx +13 -0
  137. package/examples/advance/advance.udl +339 -0
  138. package/examples/cancellable_booking/README.md +3 -0
  139. package/examples/cancellable_booking/cancellable_booking.hsx +14 -0
  140. package/examples/cancellable_booking/cancellable_booking.udl +391 -0
  141. package/examples/captured_payment/README.md +3 -0
  142. package/examples/captured_payment/captured_payment.hsx +21 -0
  143. package/examples/captured_payment/captured_payment.udl +677 -0
  144. package/examples/conditional_disbursement/README.md +3 -0
  145. package/examples/conditional_disbursement/conditional_disbursement.hsx +17 -0
  146. package/examples/conditional_disbursement/conditional_disbursement.udl +412 -0
  147. package/examples/cost-table.json +386 -0
  148. package/examples/credit_facility/README.md +3 -0
  149. package/examples/credit_facility/credit_facility.hsx +27 -0
  150. package/examples/credit_facility/credit_facility.udl +1373 -0
  151. package/examples/held_payment/README.md +3 -0
  152. package/examples/held_payment/held_payment.hsx +13 -0
  153. package/examples/held_payment/held_payment.udl +507 -0
  154. package/examples/instant_transfer/README.md +3 -0
  155. package/examples/instant_transfer/instant_transfer.hsx +16 -0
  156. package/examples/instant_transfer/instant_transfer.udl +364 -0
  157. package/examples/metered/README.md +3 -0
  158. package/examples/metered/metered.hsx +13 -0
  159. package/examples/metered/metered.udl +247 -0
  160. package/examples/pooled_split/README.md +3 -0
  161. package/examples/pooled_split/pooled_split.hsx +15 -0
  162. package/examples/pooled_split/pooled_split.udl +425 -0
  163. package/examples/premium_forward/README.md +3 -0
  164. package/examples/premium_forward/premium_forward.hsx +19 -0
  165. package/examples/premium_forward/premium_forward.udl +594 -0
  166. package/examples/reconciled_payout/README.md +3 -0
  167. package/examples/reconciled_payout/reconciled_payout.hsx +13 -0
  168. package/examples/reconciled_payout/reconciled_payout.udl +303 -0
  169. package/examples/recurring_collection/README.md +3 -0
  170. package/examples/recurring_collection/recurring_collection.hsx +21 -0
  171. package/examples/recurring_collection/recurring_collection.udl +1130 -0
  172. package/examples/rotating_pool/README.md +3 -0
  173. package/examples/rotating_pool/rotating_pool.hsx +18 -0
  174. package/examples/rotating_pool/rotating_pool.udl +4352 -0
  175. package/examples/scheduled/README.md +3 -0
  176. package/examples/scheduled/scheduled.hsx +12 -0
  177. package/examples/scheduled/scheduled.udl +335 -0
  178. package/examples/security_deposit/README.md +3 -0
  179. package/examples/security_deposit/security_deposit.hsx +21 -0
  180. package/examples/security_deposit/security_deposit.udl +293 -0
  181. package/examples/settlement_batch/README.md +3 -0
  182. package/examples/settlement_batch/settlement_batch.hsx +19 -0
  183. package/examples/settlement_batch/settlement_batch.udl +753 -0
  184. package/examples/swap/README.md +3 -0
  185. package/examples/swap/swap.hsx +19 -0
  186. package/examples/swap/swap.udl +876 -0
  187. package/examples/threshold_pool/README.md +3 -0
  188. package/examples/threshold_pool/threshold_pool.hsx +16 -0
  189. package/examples/threshold_pool/threshold_pool.udl +667 -0
  190. package/examples/weighted_distribution/README.md +3 -0
  191. package/examples/weighted_distribution/weighted_distribution.hsx +20 -0
  192. package/examples/weighted_distribution/weighted_distribution.udl +337 -0
  193. package/package.json +27 -6
  194. package/skills/hsx/SKILL.md +483 -0
  195. package/src/ast.ts +193 -9
  196. package/src/cli.ts +191 -20
  197. package/src/compile.ts +160 -23
  198. package/src/cost.ts +579 -0
  199. package/src/diagnostics.ts +442 -0
  200. package/src/emit.ts +201 -0
  201. package/src/entry-overrides.ts +263 -48
  202. package/src/format.ts +261 -0
  203. package/src/index.ts +34 -4
  204. package/src/ir.ts +99 -0
  205. package/src/lex.ts +59 -4
  206. package/src/limits.ts +2 -3
  207. package/src/lsp/server.ts +460 -0
  208. package/src/modules.ts +446 -0
  209. package/src/parse.ts +655 -21
  210. package/src/std-bundle.ts +91 -0
  211. package/src/std-library.ts +12 -0
  212. package/src/typecheck.ts +3876 -0
  213. package/src/version.ts +4 -16
  214. package/std/SEMANTICS.md +130 -0
  215. package/std/settlements/advance.hsx +177 -0
  216. package/std/settlements/cancellable_booking.hsx +87 -0
  217. package/std/settlements/captured_payment.hsx +144 -0
  218. package/std/settlements/conditional_disbursement.hsx +185 -0
  219. package/std/settlements/credit_facility.hsx +167 -0
  220. package/std/settlements/held_payment.hsx +578 -0
  221. package/std/settlements/index.hsx +3 -0
  222. package/std/settlements/instant_transfer.hsx +190 -0
  223. package/std/settlements/metered.hsx +67 -0
  224. package/std/settlements/pooled_split.hsx +68 -0
  225. package/std/settlements/premium_forward.hsx +257 -0
  226. package/std/settlements/reconciled_payout.hsx +77 -0
  227. package/std/settlements/recurring_collection.hsx +27 -0
  228. package/std/settlements/rotating_pool.hsx +252 -0
  229. package/std/settlements/scheduled.hsx +641 -0
  230. package/std/settlements/security_deposit.hsx +166 -0
  231. package/std/settlements/settlement_batch.hsx +122 -0
  232. package/std/settlements/swap.hsx +1114 -0
  233. package/std/settlements/threshold_pool.hsx +221 -0
  234. package/std/settlements/weighted_distribution.hsx +141 -0
  235. package/dist/src/archetypes.d.ts +0 -17
  236. package/dist/src/archetypes.d.ts.map +0 -1
  237. package/dist/src/archetypes.js +0 -327
  238. package/dist/src/archetypes.js.map +0 -1
  239. package/dist/src/check.d.ts +0 -12
  240. package/dist/src/check.d.ts.map +0 -1
  241. package/dist/src/check.js +0 -1910
  242. package/dist/src/check.js.map +0 -1
  243. package/dist/src/lower.d.ts +0 -146
  244. package/dist/src/lower.d.ts.map +0 -1
  245. package/dist/src/lower.js +0 -4570
  246. package/dist/src/lower.js.map +0 -1
  247. package/dist/src/model.d.ts +0 -467
  248. package/dist/src/model.d.ts.map +0 -1
  249. package/dist/src/model.js +0 -15
  250. package/dist/src/model.js.map +0 -1
  251. package/spec/hsx-ir.schema.json +0 -920
  252. package/src/archetypes.ts +0 -340
  253. package/src/check.ts +0 -2938
  254. package/src/lower.ts +0 -5416
  255. package/src/model.ts +0 -519
@@ -0,0 +1,124 @@
1
+ // A watch club whose money rules remain explicit from member checkout through
2
+ // seller payout. Each item owns its sale, deposit, and trade lifecycle. The
3
+ // club membership schedule opens periods but never moves money on a timeout.
4
+
5
+ program watch_club "Watch club"
6
+
7
+ import {
8
+ security_deposit,
9
+ instant_transfer,
10
+ recurring_collection,
11
+ scheduled,
12
+ settlement_batch,
13
+ swap
14
+ } from "std/settlements"
15
+
16
+ party member: person
17
+ party seller: business
18
+ party club: business
19
+ party payout_destination: business
20
+
21
+ asset watch: good { title_transfer: on_platform }
22
+
23
+ settlement purchase = instant_transfer {
24
+ payer: member
25
+ payee: seller
26
+ amount: purchasePrice: money(SAR)
27
+ fees {
28
+ member: checkoutFee: money(SAR)
29
+ seller {
30
+ tier {
31
+ from: 0
32
+ to: 10000
33
+ fee: 1%
34
+ }
35
+ tier {
36
+ from: 10000
37
+ fee: highValueFee: money(SAR)
38
+ }
39
+ }
40
+ }
41
+ }
42
+
43
+ settlement inspection_deposit = security_deposit {
44
+ payer: member
45
+ holder: seller
46
+ amount: depositAmount: money(SAR)
47
+ claim: port assess_watch
48
+ claim_amount: decided {
49
+ field: damageAmount
50
+ bound: depositAmount
51
+ remainder: return
52
+ }
53
+ return: port return_deposit
54
+ }
55
+
56
+ settlement membership = scheduled {
57
+ mode: obligation
58
+ payer: member
59
+ payee: club
60
+ debtor: member
61
+ amount: monthlyFee: money(SAR)
62
+ every: P1M
63
+ first_due: firstPeriodAt
64
+ until: port cancel_membership
65
+ month_end: clamp_to_last_day
66
+ period_liability: one_open
67
+ termination_drain: cancel_membership
68
+ mandate: port collect_membership
69
+ }
70
+
71
+ settlement member_trade = swap {
72
+ between: [member, seller]
73
+ amounts {
74
+ member: memberPays: money(SAR)
75
+ seller: sellerPays: money(SAR)
76
+ }
77
+ fees {
78
+ member: memberTradeFee: money(SAR)
79
+ seller: sellerTradeFee: money(SAR)
80
+ }
81
+ release: port confirm_trade
82
+ dispute: port resolve_trade within P14D
83
+ }
84
+
85
+ settlement seller_payout = settlement_batch {
86
+ settlement_account: club
87
+ source_capture_refs: captureReference
88
+ fee_entries: feeReference
89
+ external_reversal_offsets: externalReversalReference
90
+ close_trigger: closeAt
91
+ payout_destination: payout_destination
92
+ negative_position: reject
93
+ payout_acknowledgement: port acknowledge_payout
94
+ payout_beneficiary_ref: payoutBeneficiaryId
95
+ }
96
+
97
+ port assess_watch {
98
+ allowed: [seller]
99
+ shape {
100
+ damageAmount: money(SAR)
101
+ evidence: text
102
+ }
103
+ }
104
+
105
+ port return_deposit { allowed: [seller] }
106
+
107
+ port collect_membership {
108
+ allowed: [member]
109
+ shape { evidenceReference: text }
110
+ }
111
+
112
+ port cancel_membership {
113
+ allowed: [member]
114
+ shape { reason: text }
115
+ }
116
+
117
+ port confirm_trade { allowed: [member, seller] }
118
+
119
+ port resolve_trade { allowed: [member, seller] }
120
+
121
+ port acknowledge_payout {
122
+ allowed: [payout_destination]
123
+ shape { acknowledgementReference: text }
124
+ }
@@ -0,0 +1,18 @@
1
+ # Examples
2
+
3
+ Each standard-library module has its own directory with an HSX program, a
4
+ short lesson, and pinned canonical UDL bytes. The test suite reads the module
5
+ list from `std/settlements`, compiles every program, and compares each emitted
6
+ document byte for byte.
7
+
8
+ The numbered examples remain as longer lessons. They cover a first program,
9
+ imports, diagnostic repair, a composed product, and a multi-instrument club.
10
+
11
+ Run an example with the installed CLI:
12
+
13
+ ```sh
14
+ hsx check examples/instant_transfer/instant_transfer.hsx
15
+ hsx build examples/instant_transfer/instant_transfer.hsx --out program.udl
16
+ ```
17
+
18
+ Every company and person in these files is invented.
@@ -0,0 +1,3 @@
1
+ # advance
2
+
3
+ This example applies the `advance` standard-library module. Its sibling UDL file pins the canonical compiler output byte for byte. The company and parties are invented.
@@ -0,0 +1,13 @@
1
+ program advance_example "Advance example"
2
+ import { advance } from "std/settlements"
3
+ party funder: business
4
+ party recipient: business
5
+ settlement advance_payment = advance {
6
+ funder: funder
7
+ to: recipient
8
+ amount: principal: money(SAR)
9
+ fee: 2.5%
10
+ count: 2
11
+ every: P30D
12
+ first_due: firstDueAt
13
+ }
@@ -0,0 +1,339 @@
1
+ {
2
+ "instruments": [
3
+ {
4
+ "actionOrder": [
5
+ "create",
6
+ "disburse",
7
+ "collect_repayment_1",
8
+ "collect_repayment_2"
9
+ ],
10
+ "actions": {
11
+ "collect_repayment_1": {
12
+ "due": {
13
+ "field": "firstDueAt"
14
+ },
15
+ "effects": {
16
+ "moves": [
17
+ {
18
+ "signature": "moves.transfer.internal",
19
+ "source": "moves[0]"
20
+ }
21
+ ],
22
+ "schedules": [
23
+ {
24
+ "signature": "schedules.due",
25
+ "source": "due"
26
+ }
27
+ ]
28
+ },
29
+ "moves": [
30
+ {
31
+ "bind": {
32
+ "amount": {
33
+ "from": "instance",
34
+ "path": "fields.repayment1Amount"
35
+ },
36
+ "currency": {
37
+ "from": "instance",
38
+ "path": "fields.currency"
39
+ },
40
+ "destinationAccountId": {
41
+ "from": "instance",
42
+ "path": "fields.funderAccountId"
43
+ },
44
+ "metadata.instrumentId": {
45
+ "from": "const",
46
+ "value": "advance_payment"
47
+ },
48
+ "metadata.instrumentInstanceId": {
49
+ "from": "instance",
50
+ "path": "instrumentInstanceId"
51
+ },
52
+ "metadata.phase": {
53
+ "from": "const",
54
+ "value": "collect_repayment_1"
55
+ },
56
+ "productId": {
57
+ "from": "instance",
58
+ "path": "productId"
59
+ },
60
+ "sourceAccountId": {
61
+ "from": "instance",
62
+ "path": "fields.recipientAccountId"
63
+ }
64
+ },
65
+ "capture": {
66
+ "collectRepayment1TransferTransferId": "transferId"
67
+ },
68
+ "key": "transfer",
69
+ "operation": "internal_transfer.create"
70
+ }
71
+ ],
72
+ "steps": [],
73
+ "summary": "Collect repayment 1 of 2"
74
+ },
75
+ "collect_repayment_2": {
76
+ "due": {
77
+ "field": "firstDueAt",
78
+ "offset": "P30D"
79
+ },
80
+ "effects": {
81
+ "moves": [
82
+ {
83
+ "signature": "moves.transfer.internal",
84
+ "source": "moves[0]"
85
+ }
86
+ ],
87
+ "schedules": [
88
+ {
89
+ "signature": "schedules.due",
90
+ "source": "due"
91
+ }
92
+ ]
93
+ },
94
+ "moves": [
95
+ {
96
+ "bind": {
97
+ "amount": {
98
+ "from": "instance",
99
+ "path": "fields.repayment2Amount"
100
+ },
101
+ "currency": {
102
+ "from": "instance",
103
+ "path": "fields.currency"
104
+ },
105
+ "destinationAccountId": {
106
+ "from": "instance",
107
+ "path": "fields.funderAccountId"
108
+ },
109
+ "metadata.instrumentId": {
110
+ "from": "const",
111
+ "value": "advance_payment"
112
+ },
113
+ "metadata.instrumentInstanceId": {
114
+ "from": "instance",
115
+ "path": "instrumentInstanceId"
116
+ },
117
+ "metadata.phase": {
118
+ "from": "const",
119
+ "value": "collect_repayment_2"
120
+ },
121
+ "productId": {
122
+ "from": "instance",
123
+ "path": "productId"
124
+ },
125
+ "sourceAccountId": {
126
+ "from": "instance",
127
+ "path": "fields.recipientAccountId"
128
+ }
129
+ },
130
+ "capture": {
131
+ "collectRepayment2TransferTransferId": "transferId"
132
+ },
133
+ "key": "transfer",
134
+ "operation": "internal_transfer.create"
135
+ }
136
+ ],
137
+ "steps": [],
138
+ "summary": "Collect repayment 2 of 2"
139
+ },
140
+ "create": {
141
+ "agentDescription": "Open the advance row before any money moves. The caller supplies the principal, the fee amount, the repayable total, and the first repayment date. The repayment fields must partition the repayable total exactly. Nothing is disbursed here.",
142
+ "moves": [],
143
+ "publicAction": "createAdvancePayment",
144
+ "steps": [],
145
+ "summary": "Create a advance payment"
146
+ },
147
+ "disburse": {
148
+ "agentDescription": "Pay the principal from the funder to the recipient and start the repayment schedule. The advance must be created. The transfer posts straight out and does not unwind. Each repayment is collected on its own stored date anchor.",
149
+ "effects": {
150
+ "moves": [
151
+ {
152
+ "signature": "moves.transfer.internal",
153
+ "source": "moves[0]"
154
+ }
155
+ ]
156
+ },
157
+ "moves": [
158
+ {
159
+ "bind": {
160
+ "amount": {
161
+ "from": "instance",
162
+ "path": "fields.principal"
163
+ },
164
+ "currency": {
165
+ "from": "instance",
166
+ "path": "fields.currency"
167
+ },
168
+ "destinationAccountId": {
169
+ "from": "instance",
170
+ "path": "fields.recipientAccountId"
171
+ },
172
+ "metadata.instrumentId": {
173
+ "from": "const",
174
+ "value": "advance_payment"
175
+ },
176
+ "metadata.instrumentInstanceId": {
177
+ "from": "instance",
178
+ "path": "instrumentInstanceId"
179
+ },
180
+ "metadata.phase": {
181
+ "from": "const",
182
+ "value": "disburse"
183
+ },
184
+ "productId": {
185
+ "from": "instance",
186
+ "path": "productId"
187
+ },
188
+ "sourceAccountId": {
189
+ "from": "instance",
190
+ "path": "fields.funderAccountId"
191
+ }
192
+ },
193
+ "capture": {
194
+ "disburseTransferTransferId": "transferId"
195
+ },
196
+ "key": "transfer",
197
+ "operation": "internal_transfer.create"
198
+ }
199
+ ],
200
+ "publicAction": "disburseAdvancePayment",
201
+ "steps": [],
202
+ "summary": "Disburse the principal to the recipient"
203
+ }
204
+ },
205
+ "agentDescription": "Reach for advance when the funder pays the recipient up front and is repaid afterwards, either out of a carved hold release or over scheduled repayments. Pick deposit for a refundable reservation and instant transfer when nobody repays the payer.",
206
+ "description": "Advance: the funder disburses principal to the recipient, repaid over 2 scheduled repayments plus the funder's discount",
207
+ "fields": {
208
+ "currency": {
209
+ "description": "ISO 4217 currency code",
210
+ "maxLength": 3,
211
+ "minLength": 3,
212
+ "pattern": "^[A-Z]{3}$",
213
+ "type": "string"
214
+ },
215
+ "feeAmount": {
216
+ "description": "2.5% of principal, the funder's discount repaid on top of the advance",
217
+ "pattern": "^[1-9][0-9]{0,17}$",
218
+ "type": "string"
219
+ },
220
+ "firstDueAt": {
221
+ "description": "Due date of the first repayment; repayment k falls P30D after its predecessor",
222
+ "format": "hyperscale-date-time",
223
+ "type": "string"
224
+ },
225
+ "funderAccountId": {
226
+ "description": "The funder account",
227
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
228
+ "type": "string",
229
+ "x-hyperscale-reference-filter": {
230
+ "column": "role",
231
+ "values": [
232
+ "customer_balance"
233
+ ]
234
+ }
235
+ },
236
+ "principal": {
237
+ "description": "The advanced amount in SAR minor units, disbursed to the recipient up front",
238
+ "pattern": "^[1-9][0-9]{0,17}$",
239
+ "type": "string"
240
+ },
241
+ "recipientAccountId": {
242
+ "description": "The recipient account",
243
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
244
+ "type": "string",
245
+ "x-hyperscale-reference-filter": {
246
+ "column": "role",
247
+ "values": [
248
+ "customer_balance"
249
+ ]
250
+ }
251
+ },
252
+ "repayableAmount": {
253
+ "description": "principal + feeAmount: the total the repayment fields below partition exactly",
254
+ "pattern": "^[1-9][0-9]{0,17}$",
255
+ "type": "string"
256
+ },
257
+ "repayment1Amount": {
258
+ "description": "Repayment 1 of 2 (carries the integer-division remainder): about 33.34% of repayableAmount, collected on its own stored-date anchor",
259
+ "pattern": "^[1-9][0-9]{0,17}$",
260
+ "type": "string"
261
+ },
262
+ "repayment2Amount": {
263
+ "description": "Repayment 2 of 2: about 33.33% of repayableAmount, collected on its own stored-date anchor",
264
+ "pattern": "^[1-9][0-9]{0,17}$",
265
+ "type": "string"
266
+ }
267
+ },
268
+ "id": "advance_payment",
269
+ "idPrefix": "ap",
270
+ "lifecycle": {
271
+ "initial": "created",
272
+ "states": [
273
+ "created",
274
+ "advanced",
275
+ "repaying_1",
276
+ "repaid"
277
+ ],
278
+ "transitions": {
279
+ "collect_repayment_1": {
280
+ "from": [
281
+ "advanced"
282
+ ],
283
+ "to": "repaying_1"
284
+ },
285
+ "collect_repayment_2": {
286
+ "from": [
287
+ "repaying_1"
288
+ ],
289
+ "to": "repaid"
290
+ },
291
+ "disburse": {
292
+ "from": [
293
+ "created"
294
+ ],
295
+ "to": "advanced"
296
+ }
297
+ }
298
+ },
299
+ "parties": {
300
+ "beneficiary": "recipientAccountId",
301
+ "payer": "funderAccountId"
302
+ },
303
+ "partitions": [
304
+ {
305
+ "pieceFields": [
306
+ "repayment1Amount",
307
+ "repayment2Amount"
308
+ ],
309
+ "totalField": "repayableAmount"
310
+ },
311
+ {
312
+ "pieceFields": [
313
+ "principal",
314
+ "feeAmount"
315
+ ],
316
+ "totalField": "repayableAmount"
317
+ }
318
+ ],
319
+ "required": [
320
+ "funderAccountId",
321
+ "recipientAccountId",
322
+ "principal",
323
+ "feeAmount",
324
+ "repayableAmount",
325
+ "firstDueAt",
326
+ "repayment1Amount",
327
+ "repayment2Amount",
328
+ "currency"
329
+ ],
330
+ "summary": "Advance to recipient repaid over 2 anchors",
331
+ "title": "Advance payment"
332
+ }
333
+ ],
334
+ "product": "advance_example",
335
+ "subjects": [],
336
+ "title": "Advance example",
337
+ "udl": 1,
338
+ "version": 1
339
+ }
@@ -0,0 +1,3 @@
1
+ # cancellable_booking
2
+
3
+ This example applies the `cancellable_booking` standard-library module. Its sibling UDL file pins the canonical compiler output byte for byte. The company and parties are invented.
@@ -0,0 +1,14 @@
1
+ program cancellable_booking_example "Cancellable booking example"
2
+ import { cancellable_booking } from "std/settlements"
3
+ party guest: person
4
+ party studio: business
5
+ settlement studio_session = cancellable_booking {
6
+ guest: guest
7
+ host: studio
8
+ amount: sessionPrice: money(SAR)
9
+ starts_at: startsAt
10
+ late_penalty_bps: 5000
11
+ late_within: P2D
12
+ early_penalty_bps: 1000
13
+ offer_life: PT30M
14
+ }