@crowdedkingdoms/crowdyjs 17.13.0-dev.1 → 18.0.0-dev.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 (284) hide show
  1. package/MIGRATION.md +163 -1
  2. package/README.md +142 -146
  3. package/dist/crowdy-client.d.ts +12 -31
  4. package/dist/crowdy-client.d.ts.map +1 -1
  5. package/dist/crowdy-client.js +15 -37
  6. package/dist/crowdy-dsh/bridge.d.ts.map +1 -1
  7. package/dist/crowdy-dsh/bridge.js +3 -6
  8. package/dist/crowdy-studio/controller.d.ts +59 -57
  9. package/dist/crowdy-studio/controller.d.ts.map +1 -1
  10. package/dist/crowdy-studio/controller.js +268 -206
  11. package/dist/crowdy-studio/diagnostics.d.ts +3 -12
  12. package/dist/crowdy-studio/diagnostics.d.ts.map +1 -1
  13. package/dist/crowdy-studio/dom-shell.d.ts +2 -4
  14. package/dist/crowdy-studio/dom-shell.d.ts.map +1 -1
  15. package/dist/crowdy-studio/dom-shell.js +16 -47
  16. package/dist/crowdy-studio/embed/hud-layer.d.ts +1 -1
  17. package/dist/crowdy-studio/embed/panel.d.ts +3 -12
  18. package/dist/crowdy-studio/embed/panel.d.ts.map +1 -1
  19. package/dist/crowdy-studio/embed/panel.js +3 -6
  20. package/dist/crowdy-studio/index.d.ts +1 -3
  21. package/dist/crowdy-studio/index.d.ts.map +1 -1
  22. package/dist/crowdy-studio/index.js +0 -2
  23. package/dist/crowdy-studio/models.d.ts +3 -4
  24. package/dist/crowdy-studio/models.d.ts.map +1 -1
  25. package/dist/crowdy-studio/starter-projects.d.ts +8 -4
  26. package/dist/crowdy-studio/starter-projects.d.ts.map +1 -1
  27. package/dist/crowdy-studio/starter-projects.js +83 -100
  28. package/dist/domains/appAccess.d.ts +14 -1
  29. package/dist/domains/appAccess.d.ts.map +1 -1
  30. package/dist/domains/appAccess.js +37 -1
  31. package/dist/domains/exec.d.ts +162 -15
  32. package/dist/domains/exec.d.ts.map +1 -1
  33. package/dist/domains/exec.js +180 -18
  34. package/dist/domains/host.d.ts +3 -3
  35. package/dist/domains/host.js +3 -3
  36. package/dist/domains/marketplace.d.ts +9 -58
  37. package/dist/domains/marketplace.d.ts.map +1 -1
  38. package/dist/domains/marketplace.js +9 -106
  39. package/dist/domains/playerWallet.d.ts +6 -12
  40. package/dist/domains/playerWallet.d.ts.map +1 -1
  41. package/dist/domains/playerWallet.js +6 -21
  42. package/dist/errors.d.ts +7 -13
  43. package/dist/errors.d.ts.map +1 -1
  44. package/dist/errors.js +6 -10
  45. package/dist/generated/graphql.d.ts +1384 -7977
  46. package/dist/generated/graphql.d.ts.map +1 -1
  47. package/dist/generated/graphql.js +22 -321
  48. package/dist/grid-mods/exec-client-halves.d.ts +156 -0
  49. package/dist/grid-mods/exec-client-halves.d.ts.map +1 -0
  50. package/dist/grid-mods/exec-client-halves.js +356 -0
  51. package/dist/grid-mods/grid-host-calls.d.ts +29 -15
  52. package/dist/grid-mods/grid-host-calls.d.ts.map +1 -1
  53. package/dist/grid-mods/grid-host-calls.js +40 -44
  54. package/dist/grid-mods/index.d.ts +1 -0
  55. package/dist/grid-mods/index.d.ts.map +1 -1
  56. package/dist/grid-mods/index.js +1 -0
  57. package/dist/grid-mods/mod-runtime.d.ts +21 -6
  58. package/dist/grid-mods/mod-runtime.d.ts.map +1 -1
  59. package/dist/grid-mods/mod-runtime.js +6 -2
  60. package/dist/grid-scope.d.ts +0 -188
  61. package/dist/grid-scope.d.ts.map +1 -1
  62. package/dist/grid-scope.js +0 -69
  63. package/dist/index.d.ts +12 -18
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +11 -16
  66. package/dist/kit/actions.d.ts +5 -9
  67. package/dist/kit/actions.d.ts.map +1 -1
  68. package/dist/kit/actions.js +5 -9
  69. package/dist/kit/index.d.ts +2 -33
  70. package/dist/kit/index.d.ts.map +1 -1
  71. package/dist/kit/index.js +1 -32
  72. package/dist/kit/kit.d.ts +8 -208
  73. package/dist/kit/kit.d.ts.map +1 -1
  74. package/dist/kit/kit.js +5 -163
  75. package/dist/kit/social.d.ts +1 -3
  76. package/dist/kit/social.d.ts.map +1 -1
  77. package/dist/kit/social.js +1 -3
  78. package/dist/kit/wire.d.ts +16 -5
  79. package/dist/kit/wire.d.ts.map +1 -1
  80. package/dist/kit/wire.js +19 -5
  81. package/dist/live-coding/assets/browser-authoring-index.json +1 -1
  82. package/dist/live-coding/assets/manifest.json +1 -1
  83. package/dist/live-coding/browser-authoring-index.generated.d.ts.map +1 -1
  84. package/dist/live-coding/browser-authoring-index.generated.js +1496 -4386
  85. package/dist/live-coding/rust-analysis.d.ts.map +1 -1
  86. package/dist/live-coding/rust-analysis.js +31 -23
  87. package/dist/player-runtime/client-host-calls.d.ts +8 -0
  88. package/dist/player-runtime/client-host-calls.d.ts.map +1 -0
  89. package/dist/player-runtime/client-host-calls.js +28 -0
  90. package/dist/player-runtime/glue-runtime.d.ts +27 -10
  91. package/dist/player-runtime/glue-runtime.d.ts.map +1 -1
  92. package/dist/player-runtime/glue-runtime.js +40 -45
  93. package/dist/player-runtime/glue-sab.d.ts +2 -2
  94. package/dist/player-runtime/glue-sab.js +2 -2
  95. package/dist/player-runtime/player-code-broker.d.ts +80 -24
  96. package/dist/player-runtime/player-code-broker.d.ts.map +1 -1
  97. package/dist/player-runtime/player-code-broker.js +169 -41
  98. package/dist/player-runtime/player-glue-worker.d.ts +8 -8
  99. package/dist/player-runtime/player-glue-worker.d.ts.map +1 -1
  100. package/dist/player-runtime/player-glue-worker.js +26 -9
  101. package/dist/stores/actors.d.ts +12 -2
  102. package/dist/stores/actors.d.ts.map +1 -1
  103. package/dist/stores/actors.js +43 -18
  104. package/dist/stores/chunks.d.ts +12 -0
  105. package/dist/stores/chunks.d.ts.map +1 -1
  106. package/dist/stores/chunks.js +112 -39
  107. package/dist/stores/durable.d.ts.map +1 -1
  108. package/dist/stores/durable.js +2 -1
  109. package/dist/stores/inbox.d.ts +1 -1
  110. package/dist/stores/inbox.d.ts.map +1 -1
  111. package/dist/stores/index.d.ts +0 -11
  112. package/dist/stores/index.d.ts.map +1 -1
  113. package/dist/stores/index.js +0 -4
  114. package/dist/stores/session.d.ts +0 -2
  115. package/dist/stores/session.d.ts.map +1 -1
  116. package/package.json +1 -1
  117. package/dist/crowdy-studio/model-lint-log.d.ts +0 -76
  118. package/dist/crowdy-studio/model-lint-log.d.ts.map +0 -1
  119. package/dist/crowdy-studio/model-lint-log.js +0 -93
  120. package/dist/crowdy-studio/model-lint.d.ts +0 -61
  121. package/dist/crowdy-studio/model-lint.d.ts.map +0 -1
  122. package/dist/crowdy-studio/model-lint.js +0 -45
  123. package/dist/domains/compute.d.ts +0 -208
  124. package/dist/domains/compute.d.ts.map +0 -1
  125. package/dist/domains/compute.js +0 -274
  126. package/dist/domains/controlPlane.d.ts +0 -38
  127. package/dist/domains/controlPlane.d.ts.map +0 -1
  128. package/dist/domains/controlPlane.js +0 -43
  129. package/dist/domains/gameModel.d.ts +0 -1174
  130. package/dist/domains/gameModel.d.ts.map +0 -1
  131. package/dist/domains/gameModel.js +0 -1333
  132. package/dist/domains/playerCompute.d.ts +0 -91
  133. package/dist/domains/playerCompute.d.ts.map +0 -1
  134. package/dist/domains/playerCompute.js +0 -136
  135. package/dist/domains/playerModel.d.ts +0 -20
  136. package/dist/domains/playerModel.d.ts.map +0 -1
  137. package/dist/domains/playerModel.js +0 -54
  138. package/dist/kit/abilities.d.ts +0 -66
  139. package/dist/kit/abilities.d.ts.map +0 -1
  140. package/dist/kit/abilities.js +0 -71
  141. package/dist/kit/blueprints/combat.d.ts +0 -81
  142. package/dist/kit/blueprints/combat.d.ts.map +0 -1
  143. package/dist/kit/blueprints/combat.js +0 -357
  144. package/dist/kit/blueprints/core.d.ts +0 -222
  145. package/dist/kit/blueprints/core.d.ts.map +0 -1
  146. package/dist/kit/blueprints/core.js +0 -185
  147. package/dist/kit/blueprints/decks.d.ts +0 -50
  148. package/dist/kit/blueprints/decks.d.ts.map +0 -1
  149. package/dist/kit/blueprints/decks.js +0 -163
  150. package/dist/kit/blueprints/economy.d.ts +0 -88
  151. package/dist/kit/blueprints/economy.d.ts.map +0 -1
  152. package/dist/kit/blueprints/economy.js +0 -533
  153. package/dist/kit/blueprints/guild.d.ts +0 -51
  154. package/dist/kit/blueprints/guild.d.ts.map +0 -1
  155. package/dist/kit/blueprints/guild.js +0 -50
  156. package/dist/kit/blueprints/index.d.ts +0 -23
  157. package/dist/kit/blueprints/index.d.ts.map +0 -1
  158. package/dist/kit/blueprints/index.js +0 -22
  159. package/dist/kit/blueprints/inventory.d.ts +0 -84
  160. package/dist/kit/blueprints/inventory.d.ts.map +0 -1
  161. package/dist/kit/blueprints/inventory.js +0 -257
  162. package/dist/kit/blueprints/leaderboards.d.ts +0 -49
  163. package/dist/kit/blueprints/leaderboards.d.ts.map +0 -1
  164. package/dist/kit/blueprints/leaderboards.js +0 -126
  165. package/dist/kit/blueprints/liveops.d.ts +0 -42
  166. package/dist/kit/blueprints/liveops.d.ts.map +0 -1
  167. package/dist/kit/blueprints/liveops.js +0 -170
  168. package/dist/kit/blueprints/locks.d.ts +0 -82
  169. package/dist/kit/blueprints/locks.d.ts.map +0 -1
  170. package/dist/kit/blueprints/locks.js +0 -155
  171. package/dist/kit/blueprints/loot.d.ts +0 -90
  172. package/dist/kit/blueprints/loot.d.ts.map +0 -1
  173. package/dist/kit/blueprints/loot.js +0 -229
  174. package/dist/kit/blueprints/matches.d.ts +0 -84
  175. package/dist/kit/blueprints/matches.d.ts.map +0 -1
  176. package/dist/kit/blueprints/matches.js +0 -349
  177. package/dist/kit/blueprints/moderation.d.ts +0 -32
  178. package/dist/kit/blueprints/moderation.d.ts.map +0 -1
  179. package/dist/kit/blueprints/moderation.js +0 -140
  180. package/dist/kit/blueprints/npcs.d.ts +0 -78
  181. package/dist/kit/blueprints/npcs.d.ts.map +0 -1
  182. package/dist/kit/blueprints/npcs.js +0 -125
  183. package/dist/kit/blueprints/plots.d.ts +0 -63
  184. package/dist/kit/blueprints/plots.d.ts.map +0 -1
  185. package/dist/kit/blueprints/plots.js +0 -151
  186. package/dist/kit/blueprints/progression.d.ts +0 -68
  187. package/dist/kit/blueprints/progression.d.ts.map +0 -1
  188. package/dist/kit/blueprints/progression.js +0 -324
  189. package/dist/kit/blueprints/quests.d.ts +0 -72
  190. package/dist/kit/blueprints/quests.d.ts.map +0 -1
  191. package/dist/kit/blueprints/quests.js +0 -285
  192. package/dist/kit/blueprints/worldsim.d.ts +0 -91
  193. package/dist/kit/blueprints/worldsim.d.ts.map +0 -1
  194. package/dist/kit/blueprints/worldsim.js +0 -468
  195. package/dist/kit/combat.d.ts +0 -141
  196. package/dist/kit/combat.d.ts.map +0 -1
  197. package/dist/kit/combat.js +0 -196
  198. package/dist/kit/decks.d.ts +0 -157
  199. package/dist/kit/decks.d.ts.map +0 -1
  200. package/dist/kit/decks.js +0 -186
  201. package/dist/kit/director.d.ts +0 -88
  202. package/dist/kit/director.d.ts.map +0 -1
  203. package/dist/kit/director.js +0 -86
  204. package/dist/kit/economy.d.ts +0 -289
  205. package/dist/kit/economy.d.ts.map +0 -1
  206. package/dist/kit/economy.js +0 -427
  207. package/dist/kit/engine.d.ts +0 -48
  208. package/dist/kit/engine.d.ts.map +0 -1
  209. package/dist/kit/engine.js +0 -113
  210. package/dist/kit/features.d.ts +0 -60
  211. package/dist/kit/features.d.ts.map +0 -1
  212. package/dist/kit/features.js +0 -65
  213. package/dist/kit/instances.d.ts +0 -52
  214. package/dist/kit/instances.d.ts.map +0 -1
  215. package/dist/kit/instances.js +0 -60
  216. package/dist/kit/inventory.d.ts +0 -129
  217. package/dist/kit/inventory.d.ts.map +0 -1
  218. package/dist/kit/inventory.js +0 -200
  219. package/dist/kit/leaderboards.d.ts +0 -86
  220. package/dist/kit/leaderboards.d.ts.map +0 -1
  221. package/dist/kit/leaderboards.js +0 -133
  222. package/dist/kit/liveops.d.ts +0 -112
  223. package/dist/kit/liveops.d.ts.map +0 -1
  224. package/dist/kit/liveops.js +0 -183
  225. package/dist/kit/loot.d.ts +0 -128
  226. package/dist/kit/loot.d.ts.map +0 -1
  227. package/dist/kit/loot.js +0 -160
  228. package/dist/kit/matches.d.ts +0 -301
  229. package/dist/kit/matches.d.ts.map +0 -1
  230. package/dist/kit/matches.js +0 -458
  231. package/dist/kit/matchmaking.d.ts +0 -57
  232. package/dist/kit/matchmaking.d.ts.map +0 -1
  233. package/dist/kit/matchmaking.js +0 -59
  234. package/dist/kit/minigames.d.ts +0 -30
  235. package/dist/kit/minigames.d.ts.map +0 -1
  236. package/dist/kit/minigames.js +0 -38
  237. package/dist/kit/mobs.d.ts +0 -90
  238. package/dist/kit/mobs.d.ts.map +0 -1
  239. package/dist/kit/mobs.js +0 -98
  240. package/dist/kit/moderation.d.ts +0 -73
  241. package/dist/kit/moderation.d.ts.map +0 -1
  242. package/dist/kit/moderation.js +0 -103
  243. package/dist/kit/movement.d.ts +0 -78
  244. package/dist/kit/movement.d.ts.map +0 -1
  245. package/dist/kit/movement.js +0 -103
  246. package/dist/kit/notifications.d.ts +0 -45
  247. package/dist/kit/notifications.d.ts.map +0 -1
  248. package/dist/kit/notifications.js +0 -67
  249. package/dist/kit/npcs.d.ts +0 -226
  250. package/dist/kit/npcs.d.ts.map +0 -1
  251. package/dist/kit/npcs.js +0 -141
  252. package/dist/kit/objects.d.ts +0 -116
  253. package/dist/kit/objects.d.ts.map +0 -1
  254. package/dist/kit/objects.js +0 -119
  255. package/dist/kit/pets.d.ts +0 -85
  256. package/dist/kit/pets.d.ts.map +0 -1
  257. package/dist/kit/pets.js +0 -96
  258. package/dist/kit/plots.d.ts +0 -85
  259. package/dist/kit/plots.d.ts.map +0 -1
  260. package/dist/kit/plots.js +0 -113
  261. package/dist/kit/progression.d.ts +0 -181
  262. package/dist/kit/progression.d.ts.map +0 -1
  263. package/dist/kit/progression.js +0 -265
  264. package/dist/kit/quests.d.ts +0 -171
  265. package/dist/kit/quests.d.ts.map +0 -1
  266. package/dist/kit/quests.js +0 -237
  267. package/dist/kit/racing.d.ts +0 -85
  268. package/dist/kit/racing.d.ts.map +0 -1
  269. package/dist/kit/racing.js +0 -99
  270. package/dist/kit/shared.d.ts +0 -73
  271. package/dist/kit/shared.d.ts.map +0 -1
  272. package/dist/kit/shared.js +0 -101
  273. package/dist/kit/telemetry.d.ts +0 -66
  274. package/dist/kit/telemetry.d.ts.map +0 -1
  275. package/dist/kit/telemetry.js +0 -133
  276. package/dist/kit/territory.d.ts +0 -97
  277. package/dist/kit/territory.d.ts.map +0 -1
  278. package/dist/kit/territory.js +0 -114
  279. package/dist/kit/worldsim.d.ts +0 -263
  280. package/dist/kit/worldsim.d.ts.map +0 -1
  281. package/dist/kit/worldsim.js +0 -268
  282. package/dist/stores/model.d.ts +0 -81
  283. package/dist/stores/model.d.ts.map +0 -1
  284. package/dist/stores/model.js +0 -163
@@ -1,533 +0,0 @@
1
- import { kitPolicyJson, ownerEquals, ownerEqualsCaller, ownerMirrorProperty, toSnakeCase, trustedAuthorityFields, } from './core.js';
2
- /** Compute the type/function names an economy blueprint (and its runtime helper) uses. */
3
- export function economyNames(typePrefix = '') {
4
- const fnPrefix = typePrefix ? `${toSnakeCase(typePrefix)}_` : '';
5
- return {
6
- walletType: `${typePrefix}Wallet`,
7
- listingType: `${typePrefix}ShopListing`,
8
- tradeType: `${typePrefix}TradeOffer`,
9
- marketType: `${typePrefix}MarketListing`,
10
- fnPrefix,
11
- buyListingFn: `${fnPrefix}buy_listing`,
12
- acceptTradeFn: `${fnPrefix}accept_trade`,
13
- cancelTradeFn: `${fnPrefix}cancel_trade`,
14
- buyMarketFn: `${fnPrefix}buy_market_listing`,
15
- cancelMarketFn: `${fnPrefix}cancel_market_listing`,
16
- restockFn: `${fnPrefix}restock_listing`,
17
- restockAutomation: `${fnPrefix.replace(/_/g, '-')}shop-restock`,
18
- };
19
- }
20
- /** The earn/spend function name for one currency. */
21
- export function economyCurrencyFn(verb, currency, typePrefix = '') {
22
- const fnPrefix = typePrefix ? `${toSnakeCase(typePrefix)}_` : '';
23
- return `${fnPrefix}${verb}_${toSnakeCase(currency)}`;
24
- }
25
- /**
26
- * Blueprint for a server-authoritative **economy**: per-player `Wallet`
27
- * containers (one int property per currency), an admin `ShopListing` catalog
28
- * with an atomic `buy_listing` (wallet debit + stock decrement + item grant
29
- * in ONE invoke), escrow `TradeOffer` swaps, and a player-to-player
30
- * `MarketListing` flow (buyer wallet → seller wallet + stack transfer, all
31
- * in one transaction).
32
- *
33
- * Anti-duplication is structural: every movement of currency or items is a
34
- * single function invocation whose condition guards check balances, stock,
35
- * item identity, and ownership mirrors server-side — never split a spend and
36
- * a grant across two invokes. Trusted mints (`earn_<c>`) default to
37
- * `invokeScope: "server"` (app admins only).
38
- *
39
- * Trade/market guards verify stack ownership through the kit-standard
40
- * `owner_user_id` mirror property on the stack type (the inventory blueprint
41
- * defines it; set it via `InventoryKit.createStack({ ownerUserId })`), and
42
- * pin the offer creator via the injected `$self_owner_id` — the server-truth
43
- * owner of the offer/listing container.
44
- *
45
- * Runtime counterpart: `client.kit(appId).economy`.
46
- */
47
- export function economyBlueprint(options = {}) {
48
- const { typePrefix = '', currencies = ['gold'], ownerIdKind = 'int', earnAuthority = 'server', } = options;
49
- if (currencies.length === 0) {
50
- throw new Error('economyBlueprint requires at least one currency');
51
- }
52
- const currency = options.shopCurrency ?? currencies[0];
53
- if (!currencies.includes(currency)) {
54
- throw new Error(`economyBlueprint shopCurrency '${currency}' must be one of the declared currencies`);
55
- }
56
- const names = economyNames(typePrefix);
57
- const kind = ownerIdKind;
58
- const propertyDefinitions = [
59
- // Wallet: owner mirror + one balance property per currency.
60
- ownerMirrorProperty(names.walletType, kind),
61
- ...currencies.map((c) => ({
62
- containerTypeName: names.walletType,
63
- key: c,
64
- valueType: 'int',
65
- defaultValueJson: '0',
66
- description: `Balance of the '${c}' currency.`,
67
- })),
68
- // Shop listing catalog row.
69
- {
70
- containerTypeName: names.listingType,
71
- key: 'item_id',
72
- valueType: 'string',
73
- description: 'The item this listing sells (matched against stack item_id).',
74
- },
75
- {
76
- containerTypeName: names.listingType,
77
- key: 'price',
78
- valueType: 'int',
79
- defaultValueJson: '0',
80
- description: `Price per unit in '${currency}'.`,
81
- },
82
- {
83
- containerTypeName: names.listingType,
84
- key: 'stock',
85
- valueType: 'int',
86
- defaultValueJson: '0',
87
- description: 'Units remaining; buying decrements atomically.',
88
- },
89
- {
90
- containerTypeName: names.listingType,
91
- key: 'max_stock',
92
- valueType: 'int',
93
- defaultValueJson: '0',
94
- description: 'Restock ceiling used by the shop-restock automation.',
95
- },
96
- // Escrow trade offer.
97
- {
98
- containerTypeName: names.tradeType,
99
- key: 'to_user_id',
100
- valueType: 'int',
101
- defaultValueJson: '0',
102
- description: 'The user invited to accept this trade.',
103
- },
104
- {
105
- containerTypeName: names.tradeType,
106
- key: 'give_stack_id',
107
- valueType: 'string',
108
- defaultValueJson: '""',
109
- description: "Container id of the offerer's escrowed source stack.",
110
- },
111
- {
112
- containerTypeName: names.tradeType,
113
- key: 'receive_stack_id',
114
- valueType: 'string',
115
- defaultValueJson: '""',
116
- description: "Container id of the offerer's stack that receives the wanted items.",
117
- },
118
- {
119
- containerTypeName: names.tradeType,
120
- key: 'give_item_id',
121
- valueType: 'string',
122
- defaultValueJson: '""',
123
- description: 'Item the offerer gives.',
124
- },
125
- {
126
- containerTypeName: names.tradeType,
127
- key: 'give_qty',
128
- valueType: 'int',
129
- defaultValueJson: '0',
130
- description: 'Quantity the offerer gives.',
131
- },
132
- {
133
- containerTypeName: names.tradeType,
134
- key: 'want_item_id',
135
- valueType: 'string',
136
- defaultValueJson: '""',
137
- description: 'Item the offerer wants in return.',
138
- },
139
- {
140
- containerTypeName: names.tradeType,
141
- key: 'want_qty',
142
- valueType: 'int',
143
- defaultValueJson: '0',
144
- description: 'Quantity the offerer wants in return.',
145
- },
146
- {
147
- containerTypeName: names.tradeType,
148
- key: 'status',
149
- valueType: 'string',
150
- defaultValueJson: '"open"',
151
- description: "Trade lifecycle: 'open' | 'accepted' | 'cancelled'.",
152
- },
153
- // Market listing.
154
- {
155
- containerTypeName: names.marketType,
156
- key: 'stack_id',
157
- valueType: 'string',
158
- defaultValueJson: '""',
159
- description: "Container id of the seller's escrowed source stack.",
160
- },
161
- {
162
- containerTypeName: names.marketType,
163
- key: 'item_id',
164
- valueType: 'string',
165
- defaultValueJson: '""',
166
- description: 'Item being sold.',
167
- },
168
- {
169
- containerTypeName: names.marketType,
170
- key: 'quantity',
171
- valueType: 'int',
172
- defaultValueJson: '0',
173
- description: 'Units transferred to the buyer on purchase.',
174
- },
175
- {
176
- containerTypeName: names.marketType,
177
- key: 'price',
178
- valueType: 'int',
179
- defaultValueJson: '0',
180
- description: `Ask price in '${currency}' paid straight into the seller's wallet.`,
181
- },
182
- {
183
- containerTypeName: names.marketType,
184
- key: 'active',
185
- valueType: 'bool',
186
- defaultValueJson: 'true',
187
- description: 'False once bought or cancelled.',
188
- },
189
- ];
190
- const functions = [];
191
- // earn/spend per currency.
192
- for (const c of currencies) {
193
- functions.push({
194
- name: economyCurrencyFn('earn', c, typePrefix),
195
- containerTypeName: names.walletType,
196
- returnType: 'int',
197
- parameters: [
198
- {
199
- name: 'amount',
200
- valueType: 'int',
201
- required: true,
202
- description: 'Units to add (negative values are ignored).',
203
- },
204
- ],
205
- mutations: [
206
- { target: 'self', property: c, expression: `self.${c} + max(0, $amount)` },
207
- ],
208
- returnExpression: `self.${c}`,
209
- ...trustedAuthorityFields(earnAuthority),
210
- description: `Mint '${c}' into this wallet — a trusted grant (default: app admins via server scope).`,
211
- });
212
- functions.push({
213
- name: economyCurrencyFn('spend', c, typePrefix),
214
- containerTypeName: names.walletType,
215
- returnType: 'int',
216
- parameters: [
217
- {
218
- name: 'amount',
219
- valueType: 'int',
220
- required: true,
221
- description: 'Units to deduct; must not exceed the balance.',
222
- },
223
- ],
224
- mutations: [
225
- { target: 'self', property: c, expression: `self.${c} - $amount` },
226
- ],
227
- returnExpression: `self.${c}`,
228
- invokePolicyJson: kitPolicyJson({
229
- type: 'and',
230
- rules: [
231
- { type: 'owner_of_self' },
232
- {
233
- type: 'condition',
234
- expression: `$amount > 0 && self.${c} >= $amount`,
235
- },
236
- ],
237
- }),
238
- description: `Spend '${c}' from the caller's own wallet; refuses to overdraw.`,
239
- });
240
- }
241
- // Shop: atomic wallet debit + stock decrement + item grant.
242
- functions.push({
243
- name: names.buyListingFn,
244
- containerTypeName: names.listingType,
245
- returnType: 'int',
246
- parameters: [
247
- {
248
- name: 'wallet_id',
249
- valueType: 'container_ref',
250
- required: true,
251
- description: "The buyer's wallet (must be owned by the caller).",
252
- },
253
- {
254
- name: 'to_stack_id',
255
- valueType: 'container_ref',
256
- required: true,
257
- description: 'A stack of the listed item that receives the unit.',
258
- },
259
- ],
260
- mutations: [
261
- {
262
- target: 'ref($wallet_id)',
263
- property: currency,
264
- expression: `ref($wallet_id).${currency} - self.price`,
265
- },
266
- { target: 'self', property: 'stock', expression: 'self.stock - 1' },
267
- {
268
- target: 'ref($to_stack_id)',
269
- property: 'quantity',
270
- expression: 'ref($to_stack_id).quantity + 1',
271
- },
272
- ],
273
- returnExpression: `ref($wallet_id).${currency}`,
274
- invokePolicyJson: kitPolicyJson({
275
- type: 'condition',
276
- expression: [
277
- 'self.stock > 0',
278
- ownerEqualsCaller('ref($wallet_id).owner_user_id', kind),
279
- `ref($wallet_id).${currency} >= self.price`,
280
- 'ref($to_stack_id).item_id == self.item_id',
281
- ].join(' && '),
282
- }),
283
- description: 'Buy one unit: wallet debit, stock decrement, and item grant in one transaction — money duplication is structurally impossible.',
284
- });
285
- // Escrow trade: atomic four-stack swap. $self_owner_id (injected,
286
- // unspoofable) is the offer creator, so a forged offer cannot drain a
287
- // third party's stacks.
288
- functions.push({
289
- name: names.acceptTradeFn,
290
- containerTypeName: names.tradeType,
291
- returnType: 'string',
292
- parameters: [
293
- {
294
- name: 'give_stack_id',
295
- valueType: 'container_ref',
296
- required: true,
297
- description: "The offerer's escrowed source stack (must match the recorded give_stack_id).",
298
- },
299
- {
300
- name: 'to_give_stack_id',
301
- valueType: 'container_ref',
302
- required: true,
303
- description: "The acceptor's stack that receives the given items.",
304
- },
305
- {
306
- name: 'want_stack_id',
307
- valueType: 'container_ref',
308
- required: true,
309
- description: "The acceptor's stack that pays the wanted items.",
310
- },
311
- {
312
- name: 'to_want_stack_id',
313
- valueType: 'container_ref',
314
- required: true,
315
- description: "The offerer's stack that receives the wanted items (must match the recorded receive_stack_id).",
316
- },
317
- ],
318
- mutations: [
319
- {
320
- target: 'ref($give_stack_id)',
321
- property: 'quantity',
322
- expression: 'ref($give_stack_id).quantity - self.give_qty',
323
- },
324
- {
325
- target: 'ref($to_give_stack_id)',
326
- property: 'quantity',
327
- expression: 'ref($to_give_stack_id).quantity + self.give_qty',
328
- },
329
- {
330
- target: 'ref($want_stack_id)',
331
- property: 'quantity',
332
- expression: 'ref($want_stack_id).quantity - self.want_qty',
333
- },
334
- {
335
- target: 'ref($to_want_stack_id)',
336
- property: 'quantity',
337
- expression: 'ref($to_want_stack_id).quantity + self.want_qty',
338
- },
339
- { target: 'self', property: 'status', expression: '"accepted"' },
340
- ],
341
- returnExpression: 'self.status',
342
- invokePolicyJson: kitPolicyJson({
343
- type: 'condition',
344
- expression: [
345
- 'self.status == "open"',
346
- 'self.to_user_id == $caller_user_id',
347
- '$give_stack_id == self.give_stack_id',
348
- '$to_want_stack_id == self.receive_stack_id',
349
- ownerEquals('ref($give_stack_id).owner_user_id', '$self_owner_id', kind),
350
- 'ref($give_stack_id).item_id == self.give_item_id',
351
- 'ref($give_stack_id).quantity >= self.give_qty',
352
- ownerEqualsCaller('ref($to_give_stack_id).owner_user_id', kind),
353
- 'ref($to_give_stack_id).item_id == self.give_item_id',
354
- ownerEqualsCaller('ref($want_stack_id).owner_user_id', kind),
355
- 'ref($want_stack_id).item_id == self.want_item_id',
356
- 'ref($want_stack_id).quantity >= self.want_qty',
357
- ownerEquals('ref($to_want_stack_id).owner_user_id', '$self_owner_id', kind),
358
- 'ref($to_want_stack_id).item_id == self.want_item_id',
359
- ].join(' && '),
360
- }),
361
- description: 'Accept an escrow trade: both stack pairs swap atomically after ownership/item/quantity guards; any failure rolls the whole swap back.',
362
- });
363
- functions.push({
364
- name: names.cancelTradeFn,
365
- containerTypeName: names.tradeType,
366
- returnType: 'string',
367
- mutations: [{ target: 'self', property: 'status', expression: '"cancelled"' }],
368
- returnExpression: 'self.status',
369
- invokePolicyJson: kitPolicyJson({
370
- type: 'condition',
371
- expression: 'self.status == "open" && ($self_owner_id == $caller_user_id || self.to_user_id == $caller_user_id)',
372
- }),
373
- description: 'Cancel an open trade (either party may).',
374
- });
375
- // Market: wallet→wallet payment + stack transfer, one invoke, 5 mutations.
376
- functions.push({
377
- name: names.buyMarketFn,
378
- containerTypeName: names.marketType,
379
- returnType: 'int',
380
- parameters: [
381
- {
382
- name: 'wallet_id',
383
- valueType: 'container_ref',
384
- required: true,
385
- description: "The buyer's wallet (must be owned by the caller).",
386
- },
387
- {
388
- name: 'seller_wallet_id',
389
- valueType: 'container_ref',
390
- required: true,
391
- description: "The seller's wallet that receives the payment.",
392
- },
393
- {
394
- name: 'from_stack_id',
395
- valueType: 'container_ref',
396
- required: true,
397
- description: "The seller's escrowed source stack (must match the recorded stack_id).",
398
- },
399
- {
400
- name: 'to_stack_id',
401
- valueType: 'container_ref',
402
- required: true,
403
- description: "The buyer's stack that receives the items.",
404
- },
405
- ],
406
- mutations: [
407
- {
408
- target: 'ref($wallet_id)',
409
- property: currency,
410
- expression: `ref($wallet_id).${currency} - self.price`,
411
- },
412
- {
413
- target: 'ref($seller_wallet_id)',
414
- property: currency,
415
- expression: `ref($seller_wallet_id).${currency} + self.price`,
416
- },
417
- {
418
- target: 'ref($from_stack_id)',
419
- property: 'quantity',
420
- expression: 'ref($from_stack_id).quantity - self.quantity',
421
- },
422
- {
423
- target: 'ref($to_stack_id)',
424
- property: 'quantity',
425
- expression: 'ref($to_stack_id).quantity + self.quantity',
426
- },
427
- { target: 'self', property: 'active', expression: 'false' },
428
- ],
429
- returnExpression: `ref($wallet_id).${currency}`,
430
- invokePolicyJson: kitPolicyJson({
431
- type: 'condition',
432
- expression: [
433
- 'self.active',
434
- ownerEqualsCaller('ref($wallet_id).owner_user_id', kind),
435
- `ref($wallet_id).${currency} >= self.price`,
436
- ownerEquals('ref($seller_wallet_id).owner_user_id', '$self_owner_id', kind),
437
- '$from_stack_id == self.stack_id',
438
- ownerEquals('ref($from_stack_id).owner_user_id', '$self_owner_id', kind),
439
- 'ref($from_stack_id).item_id == self.item_id',
440
- 'ref($from_stack_id).quantity >= self.quantity',
441
- ownerEqualsCaller('ref($to_stack_id).owner_user_id', kind),
442
- 'ref($to_stack_id).item_id == self.item_id',
443
- ].join(' && '),
444
- }),
445
- description: "Buy a market listing: buyer wallet → seller wallet payment plus the stack transfer, all atomic; the listing deactivates in the same transaction.",
446
- });
447
- functions.push({
448
- name: names.cancelMarketFn,
449
- containerTypeName: names.marketType,
450
- returnType: 'bool',
451
- mutations: [{ target: 'self', property: 'active', expression: 'false' }],
452
- returnExpression: 'self.active',
453
- invokePolicyJson: kitPolicyJson({
454
- type: 'condition',
455
- expression: 'self.active && $self_owner_id == $caller_user_id',
456
- }),
457
- description: 'Take a market listing down (seller only).',
458
- });
459
- const automations = [];
460
- if (options.restock) {
461
- functions.push({
462
- name: names.restockFn,
463
- containerTypeName: names.listingType,
464
- returnType: 'int',
465
- parameters: [
466
- {
467
- name: 'amount',
468
- valueType: 'int',
469
- required: true,
470
- description: 'Units to add per tick (clamped to max_stock).',
471
- },
472
- ],
473
- mutations: [
474
- {
475
- target: 'self',
476
- property: 'stock',
477
- expression: 'min(self.max_stock, self.stock + max(0, $amount))',
478
- },
479
- ],
480
- returnExpression: 'self.stock',
481
- invokePolicyJson: kitPolicyJson({ type: 'is_automation' }),
482
- autonomousInvocable: true,
483
- description: 'Server-driven shop restock tick (automation-only).',
484
- });
485
- automations.push({
486
- name: names.restockAutomation,
487
- functionName: names.restockFn,
488
- targetMode: 'type',
489
- targetTypeName: names.listingType,
490
- triggerType: 'schedule',
491
- scheduleKind: 'interval',
492
- intervalMs: options.restock.intervalMs,
493
- maxTargets: 32,
494
- selectorJson: JSON.stringify({
495
- selfWhere: [{ key: 'stock', op: '<', value: 'self.max_stock' }],
496
- }),
497
- paramsJson: JSON.stringify({ amount: options.restock.amount ?? 1 }),
498
- description: 'Periodically restocks shop listings below their max_stock.',
499
- });
500
- }
501
- return {
502
- name: names.walletType,
503
- containerTypes: [
504
- {
505
- typeName: names.walletType,
506
- displayName: names.walletType,
507
- instantiableBy: 'member',
508
- description: 'A per-player wallet holding currency balances.',
509
- },
510
- {
511
- typeName: names.listingType,
512
- displayName: names.listingType,
513
- instantiableBy: 'admin',
514
- description: 'A studio-priced shop listing (catalog row) players buy from.',
515
- },
516
- {
517
- typeName: names.tradeType,
518
- displayName: names.tradeType,
519
- instantiableBy: 'member',
520
- description: 'A player-to-player escrow trade offer, swapped atomically on accept.',
521
- },
522
- {
523
- typeName: names.marketType,
524
- displayName: names.marketType,
525
- instantiableBy: 'member',
526
- description: 'A player market listing paid straight into the seller wallet.',
527
- },
528
- ],
529
- propertyDefinitions,
530
- functions,
531
- ...(automations.length ? { automations } : {}),
532
- };
533
- }
@@ -1,51 +0,0 @@
1
- import { type KitBlueprint } from './core.js';
2
- /** Options for {@link guildBlueprint}. */
3
- export interface GuildBlueprintOptions {
4
- /**
5
- * Prefix for the composed type names (`'Guild'` → `GuildHall` /
6
- * `GuildBankInventory`). Defaults to `'Guild'`.
7
- */
8
- typePrefix?: string;
9
- /**
10
- * The guild team's group id — the hall's `group_permission` policy checks
11
- * membership of THIS group. Create the team first
12
- * (`kit.social.guild.create`), then deploy the blueprint. Deploy one
13
- * prefixed blueprint per guild that needs its own hall.
14
- */
15
- guildGroupId: string;
16
- /**
17
- * Optional group permission key the hall requires (e.g. a custom
18
- * `use_hall` role permission). Omit to admit every guild member.
19
- */
20
- hallPermission?: string;
21
- /** Also compose a guild-bank inventory (`<prefix>Bank*`). Defaults to true. */
22
- bank?: boolean;
23
- }
24
- /** Names derived by {@link guildBlueprint} for a given prefix. */
25
- export interface GuildNames {
26
- hallType: string;
27
- openHallFn: string;
28
- closeHallFn: string;
29
- bankTypePrefix: string;
30
- bankInventoryType: string;
31
- bankStackType: string;
32
- }
33
- /** Compute the type/function names a guild blueprint (and kit.social.guild) uses. */
34
- export declare function guildNames(typePrefix?: string): GuildNames;
35
- /**
36
- * Composite blueprint for a **guild's shared assets** — a demonstration of
37
- * blueprint composition: a `GuildHall` lockable whose open/close is gated on
38
- * membership of the guild team (`group_permission`), plus a prefixed
39
- * guild-bank inventory (`GuildBankInventory` / `GuildBankItemStack`) for
40
- * shared storage. The guild itself is a **team** (`kit.social.guild`), its
41
- * chat a **channel**, and its territory a grid group-grant
42
- * (`kit.social.guild.claimTerritory`) — no new model surface needed for
43
- * those.
44
- *
45
- * Runtime counterparts: `client.kit(appId).social.guild` (team/chat/territory),
46
- * `kit.objectsFor(guildNames().hallType)` (the hall), and
47
- * `client.kit(appId, { inventory: { typePrefix: guildNames().bankTypePrefix } })
48
- * .inventory` (the bank).
49
- */
50
- export declare function guildBlueprint(options: GuildBlueprintOptions): KitBlueprint;
51
- //# sourceMappingURL=guild.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"guild.d.ts","sourceRoot":"","sources":["../../../src/kit/blueprints/guild.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAIjE,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,kEAAkE;AAClE,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,UAAU,SAAU,GAAG,UAAU,CAW3D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,YAAY,CAoB3E"}
@@ -1,50 +0,0 @@
1
- import { composeBlueprints } from './core.js';
2
- import { inventoryBlueprint, inventoryNames } from './inventory.js';
3
- import { lockBlueprint, lockNames } from './locks.js';
4
- /** Compute the type/function names a guild blueprint (and kit.social.guild) uses. */
5
- export function guildNames(typePrefix = 'Guild') {
6
- const locks = lockNames(`${typePrefix}Hall`);
7
- const bank = inventoryNames(`${typePrefix}Bank`);
8
- return {
9
- hallType: locks.objectType,
10
- openHallFn: locks.openFn,
11
- closeHallFn: locks.closeFn,
12
- bankTypePrefix: `${typePrefix}Bank`,
13
- bankInventoryType: bank.inventoryType,
14
- bankStackType: bank.stackType,
15
- };
16
- }
17
- /**
18
- * Composite blueprint for a **guild's shared assets** — a demonstration of
19
- * blueprint composition: a `GuildHall` lockable whose open/close is gated on
20
- * membership of the guild team (`group_permission`), plus a prefixed
21
- * guild-bank inventory (`GuildBankInventory` / `GuildBankItemStack`) for
22
- * shared storage. The guild itself is a **team** (`kit.social.guild`), its
23
- * chat a **channel**, and its territory a grid group-grant
24
- * (`kit.social.guild.claimTerritory`) — no new model surface needed for
25
- * those.
26
- *
27
- * Runtime counterparts: `client.kit(appId).social.guild` (team/chat/territory),
28
- * `kit.objectsFor(guildNames().hallType)` (the hall), and
29
- * `client.kit(appId, { inventory: { typePrefix: guildNames().bankTypePrefix } })
30
- * .inventory` (the bank).
31
- */
32
- export function guildBlueprint(options) {
33
- const { typePrefix = 'Guild', guildGroupId, hallPermission, bank = true } = options;
34
- if (!guildGroupId) {
35
- throw new Error('guildBlueprint requires guildGroupId — create the guild team first, then deploy');
36
- }
37
- const hall = lockBlueprint({
38
- objectTypeName: `${typePrefix}Hall`,
39
- authority: {
40
- kind: 'groupPermission',
41
- groupId: guildGroupId,
42
- ...(hallPermission !== undefined ? { permission: hallPermission } : {}),
43
- },
44
- });
45
- const blueprints = [hall];
46
- if (bank) {
47
- blueprints.push(inventoryBlueprint({ typePrefix: `${typePrefix}Bank` }));
48
- }
49
- return composeBlueprints(typePrefix.toLowerCase(), blueprints);
50
- }
@@ -1,23 +0,0 @@
1
- /**
2
- * Blueprint builders for the Game Kit, one module per game concept, re-exported
3
- * here as a stable barrel (import paths from `kit/index.js` and the package
4
- * root are unchanged as builders are added).
5
- */
6
- export { andPolicies, composeBlueprints, featureGate, kitPolicyJson, mergeBlueprints, ownerEquals, ownerEqualsCaller, ownerMirrorProperty, toSnakeCase, trustedAuthorityFields, type KitAutomationSpec, type KitAutomationTriggerSpec, type KitBlueprint, type KitInvokePolicy, type KitOwnerIdKind, type KitSelectorSpec, type KitTrustedAuthority, type MergedBlueprints, type SelectorPermissionPredicate, } from './core.js';
7
- export { combatBlueprint, combatNames, type CombatBlueprintOptions, type CombatNames, } from './combat.js';
8
- export { decksBlueprint, decksNames, type DecksBlueprintOptions, type DecksNames, } from './decks.js';
9
- export { economyBlueprint, economyCurrencyFn, economyNames, type EconomyBlueprintOptions, type EconomyNames, } from './economy.js';
10
- export { guildBlueprint, guildNames, type GuildBlueprintOptions, type GuildNames, } from './guild.js';
11
- export { inventoryBlueprint, inventoryBarterFunctionName, inventoryCraftFunctionName, inventoryNames, type InventoryBarterSpec, type InventoryBlueprintOptions, type InventoryNames, type InventoryRecipeSpec, } from './inventory.js';
12
- export { leaderboardsBlueprint, leaderboardsNames, type LeaderboardsBlueprintOptions, type LeaderboardsNames, } from './leaderboards.js';
13
- export { lootBlueprint, lootNames, lootRollFn, type LootBlueprintOptions, type LootDropSpec, type LootEntrySpec, type LootNames, type LootTableSpec, } from './loot.js';
14
- export { lockBlueprint, lockNames, type LockAuthority, type LockBlueprintOptions, type LockNames, } from './locks.js';
15
- export { questsBlueprint, questsNames, type QuestAdvanceSpec, type QuestsBlueprintOptions, type QuestsNames, } from './quests.js';
16
- export { progressionBlueprint, progressionNames, type ProgressionBlueprintOptions, type ProgressionNames, } from './progression.js';
17
- export { plotBlueprint, plotNames, type PlotBlueprintOptions, type PlotNames, } from './plots.js';
18
- export { matchesBlueprint, matchesNames, type MatchesBlueprintOptions, type MatchesNames, } from './matches.js';
19
- export { npcBehaviorFunctionName, npcBlueprint, type NpcBehaviorSpec, type NpcBehaviorTrigger, type NpcBlueprintOptions, } from './npcs.js';
20
- export { worldsimBlueprint, worldsimNames, type WorldsimBlueprintOptions, type WorldsimNames, } from './worldsim.js';
21
- export { liveopsBlueprint, liveopsNames, type LiveopsBlueprintOptions, type LiveopsNames, } from './liveops.js';
22
- export { moderationBlueprint, moderationNames, type ModerationBlueprintOptions, type ModerationNames, } from './moderation.js';
23
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/kit/blueprints/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,2BAA2B,GACjC,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,eAAe,EACf,WAAW,EACX,KAAK,sBAAsB,EAC3B,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,EACd,UAAU,EACV,KAAK,qBAAqB,EAC1B,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,KAAK,uBAAuB,EAC5B,KAAK,YAAY,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,UAAU,EACV,KAAK,qBAAqB,EAC1B,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kBAAkB,EAClB,2BAA2B,EAC3B,0BAA0B,EAC1B,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,4BAA4B,EACjC,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,aAAa,EACb,SAAS,EACT,UAAU,EACV,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,aAAa,EACb,SAAS,EACT,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,SAAS,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,2BAA2B,EAChC,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,aAAa,EACb,SAAS,EACT,KAAK,oBAAoB,EACzB,KAAK,SAAS,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,KAAK,uBAAuB,EAC5B,KAAK,YAAY,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,KAAK,wBAAwB,EAC7B,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,KAAK,uBAAuB,EAC5B,KAAK,YAAY,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,KAAK,0BAA0B,EAC/B,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC"}