@almadar/std 17.0.3 → 17.1.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 (313) hide show
  1. package/behaviors/lolo/auth/atoms/std-dev-personas.lolo +27 -2
  2. package/behaviors/lolo/cli/atoms/std-orb-goldens.lolo +6 -3
  3. package/behaviors/lolo/cli/atoms/std-orb-lint-mem-handles.lolo +54 -34
  4. package/behaviors/lolo/cli/atoms/std-orb-lint-os-grants.lolo +4 -4
  5. package/behaviors/lolo/cli/atoms/std-orb-mcp.lolo +16 -21
  6. package/behaviors/lolo/cli/atoms/std-orb-serve.lolo +24 -4
  7. package/behaviors/lolo/codec/atoms/std-lolo-kotlin.lolo +26 -3
  8. package/behaviors/lolo/codec/atoms/std-lolo-python.lolo +15 -2
  9. package/behaviors/lolo/codec/atoms/std-lolo-rust.lolo +27 -2
  10. package/behaviors/lolo/codec/atoms/std-lolo-source.lolo +251 -60
  11. package/behaviors/lolo/codec/atoms/std-lolo-swift.lolo +24 -1
  12. package/behaviors/lolo/codec/atoms/std-lolo-typescript.lolo +24 -3
  13. package/behaviors/lolo/connect/atoms/std-meta-ads.lolo +4 -4
  14. package/behaviors/lolo/connect/atoms/std-stdio-lines.lolo +7 -4
  15. package/behaviors/lolo/connect/atoms/std-youtube.lolo +9 -9
  16. package/behaviors/lolo/dev/atoms/std-guest-session.lolo +122 -10
  17. package/behaviors/lolo/dev/atoms/std-mock-seed-marks.lolo +66 -0
  18. package/behaviors/lolo/dev/organisms/std-behavior-playground.lolo +5 -2
  19. package/behaviors/lolo/dev/organisms/std-launchpad.lolo +4 -3
  20. package/behaviors/lolo/gpu/atoms/std-gpu-compute.lolo +329 -0
  21. package/behaviors/lolo/net/atoms/std-http-client.lolo +4 -4
  22. package/behaviors/lolo/net/atoms/std-http-fetch.lolo +6 -6
  23. package/behaviors/lolo/net/atoms/std-npm-lookup.lolo +1 -1
  24. package/behaviors/lolo/net/atoms/std-npm-registry.lolo +2 -2
  25. package/behaviors/lolo/spec/auth/dev-personas.replay.goldens.json +263 -2
  26. package/behaviors/lolo/spec/cli/lint-all.lolo +1 -0
  27. package/behaviors/lolo/spec/cli/lint-item-action-event.replay.goldens.json +9 -9
  28. package/behaviors/lolo/spec/cli/lint-mem-handles.replay.goldens.json +3021 -1
  29. package/behaviors/lolo/spec/cli/lint-os-grants.replay.goldens.json +284 -12
  30. package/behaviors/lolo/spec/cli/mcp-server.replay.goldens.json +51 -55
  31. package/behaviors/lolo/spec/cli/orb-compile.replay.goldens.json +10 -4
  32. package/behaviors/lolo/spec/codec/lolo-kotlin.replay.goldens.json +7496 -7497
  33. package/behaviors/lolo/spec/codec/lolo-python.replay.goldens.json +341 -3
  34. package/behaviors/lolo/spec/codec/lolo-rust.replay.goldens.json +18931 -6142
  35. package/behaviors/lolo/spec/codec/lolo-source.fixtures/compose-pair.lolo +44 -0
  36. package/behaviors/lolo/spec/codec/lolo-source.fixtures/config-read.lolo +2 -1
  37. package/behaviors/lolo/spec/codec/lolo-source.fixtures/divide-default.lolo +2 -1
  38. package/behaviors/lolo/spec/codec/lolo-source.fixtures/divide-plain.lolo +2 -1
  39. package/behaviors/lolo/spec/codec/lolo-source.fixtures/get-past-end.lolo +2 -1
  40. package/behaviors/lolo/spec/codec/lolo-source.fixtures/list-call.lolo +2 -1
  41. package/behaviors/lolo/spec/codec/lolo-source.fixtures/list-plain.lolo +2 -1
  42. package/behaviors/lolo/spec/codec/lolo-source.fixtures/minus-binary.lolo +2 -1
  43. package/behaviors/lolo/spec/codec/lolo-source.fixtures/minus-unary.lolo +2 -1
  44. package/behaviors/lolo/spec/codec/lolo-source.fixtures/nested-let.lolo +2 -1
  45. package/behaviors/lolo/spec/codec/lolo-source.fixtures/no-machine.lolo +2 -1
  46. package/behaviors/lolo/spec/codec/lolo-source.fixtures/no-template.lolo +2 -1
  47. package/behaviors/lolo/spec/codec/lolo-source.fixtures/nth-past-end.lolo +2 -1
  48. package/behaviors/lolo/spec/codec/lolo-source.fixtures/nth-raw.lolo +2 -1
  49. package/behaviors/lolo/spec/codec/lolo-source.fixtures/ports-call.lolo +2 -1
  50. package/behaviors/lolo/spec/codec/lolo-source.fixtures/range-one.lolo +2 -1
  51. package/behaviors/lolo/spec/codec/lolo-source.fixtures/range-two.lolo +2 -1
  52. package/behaviors/lolo/spec/codec/lolo-source.fixtures/router-trio.lolo +88 -0
  53. package/behaviors/lolo/spec/codec/lolo-source.fixtures/store-pair.lolo +62 -0
  54. package/behaviors/lolo/spec/codec/lolo-source.fixtures/string-literal.lolo +2 -1
  55. package/behaviors/lolo/spec/codec/lolo-source.gen/knobs.py +27 -1
  56. package/behaviors/lolo/spec/codec/lolo-source.gen/src_assemble.in +54 -2
  57. package/behaviors/lolo/spec/codec/lolo-source.gen/src_finish.in +1 -1
  58. package/behaviors/lolo/spec/codec/lolo-source.gen/src_fold.in +24 -4
  59. package/behaviors/lolo/spec/codec/lolo-source.gen/src_head.in +8 -3
  60. package/behaviors/lolo/spec/codec/lolo-source.gen/src_prepare.in +6 -2
  61. package/behaviors/lolo/spec/codec/lolo-source.gen/src_trait.in +12 -2
  62. package/behaviors/lolo/spec/codec/lolo-source.parity/agent-step.lolo +2 -1
  63. package/behaviors/lolo/spec/codec/lolo-source.parity/agent-step.server.lolo +1 -0
  64. package/behaviors/lolo/spec/codec/lolo-source.parity/chunk.lolo +2 -1
  65. package/behaviors/lolo/spec/codec/lolo-source.parity/chunk.server.lolo +1 -0
  66. package/behaviors/lolo/spec/codec/lolo-source.parity/compose-pair.events.json +36 -0
  67. package/behaviors/lolo/spec/codec/lolo-source.parity/compose-pair.replay.goldens.json +91 -0
  68. package/behaviors/lolo/spec/codec/lolo-source.parity/cosine.lolo +2 -1
  69. package/behaviors/lolo/spec/codec/lolo-source.parity/cosine.server.lolo +1 -0
  70. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/kotlin/compose-pair.kt +31 -0
  71. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/kotlin/router-trio.kt +31 -0
  72. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/kotlin/store-pair.kt +31 -0
  73. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/python/compose-pair.py +18 -0
  74. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/python/router-trio.py +18 -0
  75. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/python/store-pair.py +17 -0
  76. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/rust/compose-pair.rs +37 -0
  77. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/rust/router-trio.rs +37 -0
  78. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/rust/store-pair.rs +36 -0
  79. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/swift/compose-pair.swift +24 -0
  80. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/swift/router-trio.swift +24 -0
  81. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/swift/store-pair.swift +23 -0
  82. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/typescript/compose-pair.mts +24 -0
  83. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/typescript/router-trio.mts +24 -0
  84. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/typescript/store-pair.mts +22 -0
  85. package/behaviors/lolo/spec/codec/lolo-source.parity/recall-at-k.lolo +2 -1
  86. package/behaviors/lolo/spec/codec/lolo-source.parity/recall-at-k.server.lolo +1 -0
  87. package/behaviors/lolo/spec/codec/lolo-source.parity/router-trio.events.json +18 -0
  88. package/behaviors/lolo/spec/codec/lolo-source.parity/router-trio.replay.goldens.json +87 -0
  89. package/behaviors/lolo/spec/codec/lolo-source.parity/store-pair.events.json +58 -0
  90. package/behaviors/lolo/spec/codec/lolo-source.parity/store-pair.replay.goldens.json +238 -0
  91. package/behaviors/lolo/spec/codec/lolo-swift.replay.goldens.json +15599 -2204
  92. package/behaviors/lolo/spec/codec/lolo-typescript.replay.goldens.json +28930 -28929
  93. package/behaviors/lolo/spec/connect/bearer-api.replay.goldens.json +1 -1
  94. package/behaviors/lolo/spec/connect/esign.replay.goldens.json +3 -3
  95. package/behaviors/lolo/spec/connect/github.replay.goldens.json +13 -13
  96. package/behaviors/lolo/spec/connect/google-calendar.replay.goldens.json +2 -2
  97. package/behaviors/lolo/spec/connect/image.replay.goldens.json +1 -1
  98. package/behaviors/lolo/spec/connect/meta-ads.replay.goldens.json +2 -2
  99. package/behaviors/lolo/spec/connect/stdio-lines.replay.goldens.json +90 -0
  100. package/behaviors/lolo/spec/connect/twilio.replay.goldens.json +2 -2
  101. package/behaviors/lolo/spec/connect/youtube.replay.goldens.json +1 -1
  102. package/behaviors/lolo/spec/dev/guest-session.replay.goldens.json +824 -0
  103. package/behaviors/lolo/spec/dev/mock-seed-marks.replay.goldens.json +365 -0
  104. package/behaviors/lolo/spec/dev/verify-walk.replay.goldens.json +2 -1
  105. package/behaviors/lolo/spec/gpu/gpu-compute.replay.goldens.json +784 -0
  106. package/behaviors/lolo/spec/mem/mem-buffer.replay.goldens.json +97 -1
  107. package/behaviors/lolo/spec/ml/vector-write.goldens.json +1 -1
  108. package/behaviors/lolo/spec/ml/vector-write.replay.goldens.json +2 -2
  109. package/behaviors/lolo/spec/net/http-client-call-host.replay.goldens.json +3 -3
  110. package/behaviors/lolo/spec/net/http-client-env-host.replay.goldens.json +3 -3
  111. package/behaviors/lolo/spec/net/http-client.replay.goldens.json +56 -56
  112. package/behaviors/lolo/spec/net/http-fetch.replay.goldens.json +2 -2
  113. package/behaviors/lolo/spec/net/npm-lookup.replay.goldens.json +1 -1
  114. package/behaviors/lolo/spec/net/npm-registry.replay.goldens.json +2 -2
  115. package/behaviors/lolo/spec/net/server-declared-traits.replay.goldens.json +6 -3
  116. package/behaviors/lolo/spec/net/server-external-inputs.replay.goldens.json +16 -8
  117. package/behaviors/lolo/spec/net/server-retargeted-leg.replay.goldens.json +4 -2
  118. package/behaviors/lolo/spec/net/server-untargeted-discovery.replay.goldens.json +50 -45
  119. package/behaviors/lolo/spec/ops/llm-spend-board.replay.goldens.json +112 -16
  120. package/behaviors/lolo/spec/store/firestore-twin.replay.goldens.json +1 -1
  121. package/behaviors/lolo/spec/store/row-store-postgres.gen/record_real_sql.py +1 -1
  122. package/behaviors/lolo/spec/ui/game/fx-particles.replay.goldens.json +37 -0
  123. package/behaviors/lolo/ui/avl/atoms/std-avl-cosmic-zoom.lolo +2 -2
  124. package/behaviors/lolo/ui/game/atoms/std-fx-particles.lolo +10 -1
  125. package/behaviors/lolo/ui/game/atoms/ui-draw-fx-layer.lolo +4 -4
  126. package/behaviors/lolo/ui/game/organisms/std-arcade-board-3d.lolo +9 -9
  127. package/behaviors/lolo/ui/game/organisms/std-crew-board-2d.lolo +4 -4
  128. package/behaviors/lolo/ui/game/organisms/std-dungeon-board-2d.lolo +5 -5
  129. package/behaviors/lolo/ui/game/organisms/std-market-board-3d.lolo +9 -9
  130. package/behaviors/lolo/ui/game/organisms/std-objective-board-3d.lolo +9 -9
  131. package/behaviors/lolo/ui/game/organisms/std-platformer-board-2d.lolo +5 -5
  132. package/behaviors/lolo/ui/game/organisms/std-platformer-puzzle.lolo +4 -4
  133. package/behaviors/lolo/ui/game/organisms/std-survival-board-3d.lolo +9 -9
  134. package/behaviors/lolo/ui/game/organisms/std-tactics-board-2d.lolo +5 -5
  135. package/behaviors/lolo/ui/game/organisms/std-tactics-board-3d.lolo +9 -9
  136. package/behaviors/registry/auth/atoms/std-dev-personas.orb +1 -1
  137. package/behaviors/registry/cli/atoms/std-orb-goldens.orb +1 -1
  138. package/behaviors/registry/cli/atoms/std-orb-lint-mem-handles.orb +1 -1
  139. package/behaviors/registry/cli/atoms/std-orb-lint-os-grants.orb +1 -1
  140. package/behaviors/registry/cli/atoms/std-orb-mcp.orb +1 -1
  141. package/behaviors/registry/cli/atoms/std-orb-serve.orb +1 -1
  142. package/behaviors/registry/codec/atoms/std-lolo-kotlin.orb +1 -1
  143. package/behaviors/registry/codec/atoms/std-lolo-python.orb +1 -1
  144. package/behaviors/registry/codec/atoms/std-lolo-rust.orb +1 -1
  145. package/behaviors/registry/codec/atoms/std-lolo-source.orb +1 -1
  146. package/behaviors/registry/codec/atoms/std-lolo-swift.orb +1 -1
  147. package/behaviors/registry/codec/atoms/std-lolo-typescript.orb +1 -1
  148. package/behaviors/registry/connect/atoms/std-meta-ads.orb +1 -1
  149. package/behaviors/registry/connect/atoms/std-stdio-lines.orb +1 -1
  150. package/behaviors/registry/connect/atoms/std-youtube.orb +1 -1
  151. package/behaviors/registry/dev/atoms/std-guest-session.orb +1 -1
  152. package/behaviors/registry/dev/atoms/std-mock-seed-marks.orb +1 -0
  153. package/behaviors/registry/dev/organisms/std-behavior-playground.orb +37 -0
  154. package/behaviors/registry/dev/organisms/std-launchpad.orb +25 -0
  155. package/behaviors/registry/gpu/atoms/std-gpu-compute.orb +1 -0
  156. package/behaviors/registry/net/atoms/std-http-client.orb +1 -1
  157. package/behaviors/registry/net/atoms/std-http-fetch.orb +1 -1
  158. package/behaviors/registry/net/atoms/std-npm-lookup.orb +1 -1
  159. package/behaviors/registry/net/atoms/std-npm-registry.orb +1 -1
  160. package/behaviors/registry/spec/cli/lint-all.orb +1 -1
  161. package/behaviors/registry/spec/codec/lolo-source.fixtures/compose-pair.orb +1 -0
  162. package/behaviors/registry/spec/codec/lolo-source.fixtures/config-read.orb +1 -1
  163. package/behaviors/registry/spec/codec/lolo-source.fixtures/divide-default.orb +1 -1
  164. package/behaviors/registry/spec/codec/lolo-source.fixtures/divide-plain.orb +1 -1
  165. package/behaviors/registry/spec/codec/lolo-source.fixtures/get-past-end.orb +1 -1
  166. package/behaviors/registry/spec/codec/lolo-source.fixtures/list-call.orb +1 -1
  167. package/behaviors/registry/spec/codec/lolo-source.fixtures/list-plain.orb +1 -1
  168. package/behaviors/registry/spec/codec/lolo-source.fixtures/minus-binary.orb +1 -1
  169. package/behaviors/registry/spec/codec/lolo-source.fixtures/minus-unary.orb +1 -1
  170. package/behaviors/registry/spec/codec/lolo-source.fixtures/nested-let.orb +1 -1
  171. package/behaviors/registry/spec/codec/lolo-source.fixtures/no-machine.orb +1 -1
  172. package/behaviors/registry/spec/codec/lolo-source.fixtures/no-template.orb +1 -1
  173. package/behaviors/registry/spec/codec/lolo-source.fixtures/nth-past-end.orb +1 -1
  174. package/behaviors/registry/spec/codec/lolo-source.fixtures/nth-raw.orb +1 -1
  175. package/behaviors/registry/spec/codec/lolo-source.fixtures/ports-call.orb +1 -1
  176. package/behaviors/registry/spec/codec/lolo-source.fixtures/range-one.orb +1 -1
  177. package/behaviors/registry/spec/codec/lolo-source.fixtures/range-two.orb +1 -1
  178. package/behaviors/registry/spec/codec/lolo-source.fixtures/router-trio.orb +1 -0
  179. package/behaviors/registry/spec/codec/lolo-source.fixtures/store-pair.orb +1 -0
  180. package/behaviors/registry/spec/codec/lolo-source.fixtures/string-literal.orb +1 -1
  181. package/behaviors/registry/spec/codec/lolo-source.parity/agent-step.orb +1 -1
  182. package/behaviors/registry/spec/codec/lolo-source.parity/agent-step.server.orb +1 -1
  183. package/behaviors/registry/spec/codec/lolo-source.parity/chunk.orb +1 -1
  184. package/behaviors/registry/spec/codec/lolo-source.parity/chunk.server.orb +1 -1
  185. package/behaviors/registry/spec/codec/lolo-source.parity/cosine.orb +1 -1
  186. package/behaviors/registry/spec/codec/lolo-source.parity/cosine.server.orb +1 -1
  187. package/behaviors/registry/spec/codec/lolo-source.parity/recall-at-k.orb +1 -1
  188. package/behaviors/registry/spec/codec/lolo-source.parity/recall-at-k.server.orb +1 -1
  189. package/behaviors/registry/ui/avl/atoms/std-avl-cosmic-zoom.orb +1 -1
  190. package/behaviors/registry/ui/game/atoms/std-fx-particles.orb +1 -1
  191. package/behaviors/registry/ui/game/atoms/ui-draw-fx-layer.orb +1 -1
  192. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +20 -13
  193. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +9 -5
  194. package/behaviors/registry/ui/game/organisms/std-dungeon-board-2d.orb +17 -7
  195. package/behaviors/registry/ui/game/organisms/std-market-board-3d.orb +19 -15
  196. package/behaviors/registry/ui/game/organisms/std-objective-board-3d.orb +15 -12
  197. package/behaviors/registry/ui/game/organisms/std-platformer-board-2d.orb +17 -7
  198. package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +4 -0
  199. package/behaviors/registry/ui/game/organisms/std-survival-board-3d.orb +15 -12
  200. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +13 -6
  201. package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +14 -12
  202. package/canonical-operators.json +1426 -103
  203. package/dist/{chunk-EK22WRB6.js → chunk-2UGHBVU2.js} +2 -2
  204. package/dist/{chunk-GDMH5T4J.js → chunk-3DK7GI2C.js} +2 -2
  205. package/dist/chunk-3MDASC5C.js +26 -0
  206. package/dist/{chunk-K5ZI27PB.js → chunk-3PHO4RRF.js} +1 -1
  207. package/dist/{chunk-7IEMMYM6.js → chunk-4MJCLAZW.js} +1 -1
  208. package/dist/{chunk-W4IEV4BY.js → chunk-55JPIL7A.js} +2 -2
  209. package/dist/{chunk-RUGBZTV3.js → chunk-66BLZLFI.js} +1 -1
  210. package/dist/{chunk-YWFISV7L.js → chunk-66RAJFOD.js} +1 -1
  211. package/dist/{chunk-JWOWWGNZ.js → chunk-6ED4SUC6.js} +1 -1
  212. package/dist/{chunk-LL7P6EII.js → chunk-6KFCHNE2.js} +2 -2
  213. package/dist/{chunk-GFBL2TW6.js → chunk-A4QB3Y6L.js} +1 -1
  214. package/dist/chunk-BVWMLS32.js +123 -0
  215. package/dist/{chunk-5KQCGSNC.js → chunk-CRKVDCY7.js} +1 -1
  216. package/dist/{chunk-WHQDLLC3.js → chunk-EKWEY4OJ.js} +1 -1
  217. package/dist/{chunk-Y3BRVNYK.js → chunk-EU22GCGV.js} +2 -2
  218. package/dist/{chunk-XQPYTDZ4.js → chunk-FB6PKNRS.js} +1 -1
  219. package/dist/{chunk-UX3MDFX6.js → chunk-FSVOJQLP.js} +1 -1
  220. package/dist/{chunk-LDBD2FBQ.js → chunk-GAKLBWBR.js} +1 -1
  221. package/dist/{chunk-C3IEMPRZ.js → chunk-GO3FKBV2.js} +2 -2
  222. package/dist/{chunk-LZSPEHSM.js → chunk-GPDTJHYY.js} +1 -1
  223. package/dist/{chunk-W5ABMOXU.js → chunk-JQBWLH5V.js} +1 -1
  224. package/dist/{chunk-63X6RNY6.js → chunk-KKW3JHTC.js} +1 -1
  225. package/dist/{chunk-5PLJE42Q.js → chunk-LF2EZVAM.js} +1 -1
  226. package/dist/{chunk-RXWBYWQB.js → chunk-LGCKOZP3.js} +2 -2
  227. package/dist/{chunk-JJEADYP7.js → chunk-LMZ6XJFB.js} +2 -2
  228. package/dist/{chunk-CWYSQZJU.js → chunk-M2YQNSAZ.js} +2 -2
  229. package/dist/{chunk-GNCKJV3P.js → chunk-MKWHYBIS.js} +1 -1
  230. package/dist/{chunk-ZB2CLGEG.js → chunk-MXBGYTYF.js} +1 -1
  231. package/dist/{chunk-UN76TRSK.js → chunk-NH6MXHZR.js} +41 -41
  232. package/dist/{chunk-II2VW7T6.js → chunk-ODBIX4DB.js} +1 -1
  233. package/dist/{chunk-3F3CNWOG.js → chunk-OYDQR6DT.js} +2 -2
  234. package/dist/{chunk-FVL6BT6L.js → chunk-PD6POR44.js} +1 -1
  235. package/dist/{chunk-U6USXZ5M.js → chunk-PHFT3QNS.js} +2 -2
  236. package/dist/{chunk-RJYKIZMS.js → chunk-PQZ6PVKG.js} +2 -2
  237. package/dist/{chunk-TQPQXCSZ.js → chunk-Q6NHXIOZ.js} +2 -2
  238. package/dist/{chunk-KYGWVCTM.js → chunk-QMDVYTB7.js} +1 -1
  239. package/dist/{chunk-XKTATY45.js → chunk-RW2KMSG5.js} +4 -4
  240. package/dist/{chunk-UHNSPTFT.js → chunk-SA2ZS24W.js} +1 -1
  241. package/dist/{chunk-6YPUQK36.js → chunk-SFWP4UMK.js} +2 -2
  242. package/dist/{chunk-ZZYLFHBU.js → chunk-TLNEQA4D.js} +1 -1
  243. package/dist/{chunk-RGTBRWWA.js → chunk-TOODE5AD.js} +2 -2
  244. package/dist/{chunk-QGWAHOFR.js → chunk-U57GY7SM.js} +2 -2
  245. package/dist/{chunk-FDJZKB7J.js → chunk-UIDQQJSX.js} +1 -1
  246. package/dist/{chunk-LLH3WXM3.js → chunk-UVFP2B7I.js} +1 -1
  247. package/dist/{chunk-4OF7727E.js → chunk-VEGZPCTZ.js} +2 -2
  248. package/dist/{chunk-73YUPNIT.js → chunk-VXN4V7LC.js} +1 -1
  249. package/dist/{chunk-4D3W6AAE.js → chunk-YHQVZWPG.js} +1 -1
  250. package/dist/{chunk-XXYBHYLM.js → chunk-YQO3TO66.js} +2 -2
  251. package/dist/{chunk-YZAYFR5A.js → chunk-ZSJ3GEOJ.js} +1 -1
  252. package/dist/index.d.ts +3 -3
  253. package/dist/index.js +50 -50
  254. package/dist/modules/anim.js +2 -2
  255. package/dist/modules/array.js +2 -2
  256. package/dist/modules/auth.js +3 -3
  257. package/dist/modules/behavior.js +2 -2
  258. package/dist/modules/bit.js +2 -2
  259. package/dist/modules/browser.js +2 -2
  260. package/dist/modules/bytes.js +2 -2
  261. package/dist/modules/codec.js +3 -3
  262. package/dist/modules/composition.js +2 -2
  263. package/dist/modules/core.js +2 -2
  264. package/dist/modules/csv.js +2 -2
  265. package/dist/modules/ffi.js +3 -3
  266. package/dist/modules/format.js +2 -2
  267. package/dist/modules/geo.js +2 -2
  268. package/dist/modules/gpu.d.ts +12 -0
  269. package/dist/modules/gpu.js +3 -0
  270. package/dist/modules/grid.js +2 -2
  271. package/dist/modules/i18n.js +2 -2
  272. package/dist/modules/index.d.ts +1 -2
  273. package/dist/modules/index.js +45 -46
  274. package/dist/modules/json.js +2 -2
  275. package/dist/modules/kernel.js +3 -3
  276. package/dist/modules/kv.js +3 -3
  277. package/dist/modules/llm.js +2 -2
  278. package/dist/modules/math.js +2 -2
  279. package/dist/modules/mem.js +3 -3
  280. package/dist/modules/object.js +2 -2
  281. package/dist/modules/os-common.d.ts +1 -1
  282. package/dist/modules/os-common.js +2 -2
  283. package/dist/modules/os-desktop.js +3 -3
  284. package/dist/modules/os-dev.js +3 -3
  285. package/dist/modules/os-dir.js +3 -3
  286. package/dist/modules/os-env-stdio.js +3 -3
  287. package/dist/modules/os-fs.js +3 -3
  288. package/dist/modules/os-net.js +3 -3
  289. package/dist/modules/os-path.js +3 -3
  290. package/dist/modules/os-process.js +3 -3
  291. package/dist/modules/os-sys.js +3 -3
  292. package/dist/modules/os-time-users.js +3 -3
  293. package/dist/modules/os.js +13 -13
  294. package/dist/modules/path.js +2 -2
  295. package/dist/modules/prob.js +2 -2
  296. package/dist/modules/program.js +2 -2
  297. package/dist/modules/session.js +2 -2
  298. package/dist/modules/str.js +2 -2
  299. package/dist/modules/time.js +2 -2
  300. package/dist/modules/validate.js +2 -2
  301. package/dist/modules/vector.js +2 -2
  302. package/dist/modules/workspace.js +2 -2
  303. package/dist/modules/xml.js +2 -2
  304. package/dist/modules/yaml.js +2 -2
  305. package/dist/registry.d.ts +2 -2
  306. package/dist/registry.js +49 -49
  307. package/dist/{types-BA4LkhNJ.d.ts → types-CgiGhK6t.d.ts} +17 -3
  308. package/package.json +5 -5
  309. package/dist/chunk-F5TP25JA.js +0 -26
  310. package/dist/chunk-NE4WSTN7.js +0 -26
  311. package/dist/modules/trace.d.ts +0 -15
  312. package/dist/modules/trace.js +0 -2
  313. /package/dist/{chunk-SHSBTDDX.js → chunk-QUQ33UXH.js} +0 -0
@@ -74,8 +74,8 @@ orbital CosmicZoomOrbital {
74
74
 
75
75
  entity CosmicZoomView [runtime] {
76
76
  id : string!
77
- program : CosmicProgram? = none
78
- source : CosmicProgram? = none
77
+ program : CosmicProgram? = null
78
+ source : CosmicProgram? = null
79
79
  highlighted : string = ""
80
80
  orbital : string = ""
81
81
  trait : string = ""
@@ -1,11 +1,18 @@
1
1
  app std-fx-particles [
2
2
  version: "1.1.0",
3
- description: "Headless transient-fx mechanic serving BOTH game boards and learning shells: appends spawned particles on BURST — stamping maxTtl (fade envelope) and bornAt (epoch ms, smooth render interpolation) when absent — decays each entry's ttl every tick, drops the dead ones, and clears on RESTART. Name-blind mechanism: the effect-kind vocabulary is consumer-declared (FxPreset tables at the render call sites). Composed onto a [runtime, shared] entity; renders nothing — the board/shell owns the single render authority (draw-fx-layer for space \"world\", fx-overlay for space \"screen\"). Corresponds to the design-sheet field(s): feedback, rewards."
3
+ description: "Headless transient-fx mechanic serving BOTH game boards and learning shells: appends spawned particles on BURST — stamping maxTtl (fade envelope), bornAt (epoch ms, smooth render interpolation) and position (scene {x, y: ground row z, z: height y}) when absent — decays each entry's ttl every tick, drops the dead ones, and clears on RESTART. Name-blind mechanism: the effect-kind vocabulary is consumer-declared (FxPreset tables at the render call sites). Composed onto a [runtime, shared] entity; renders nothing — the board/shell owns the single render authority (draw-fx-layer for space \"world\", fx-overlay for space \"screen\"). Corresponds to the design-sheet field(s): feedback, rewards."
4
4
  ]
5
5
  orbital FxParticlesOrbital {
6
+ type FxPos = {
7
+ x : number!
8
+ y : number!
9
+ z : number
10
+ }
11
+
6
12
  type Fx = {
7
13
  id : string!
8
14
  type : string!
15
+ position : FxPos
9
16
  x : number!
10
17
  z : number
11
18
  y : number
@@ -37,11 +44,13 @@ orbital FxParticlesOrbital {
37
44
  (set @entity.fx (array/map @config.fx (fn p (object/merge @p {
38
45
  maxTtl: (object/get @p maxTtl (object/get @p ttl))
39
46
  bornAt: (object/get @p bornAt (time/now))
47
+ position: (object/get @p position { x: @p.x, y: @p.z, z: @p.y })
40
48
  }))))
41
49
  BURST -> active
42
50
  (set @entity.fx (array/concat @entity.fx (array/map @payload.particles (fn p (object/merge @p {
43
51
  maxTtl: (object/get @p maxTtl (object/get @p ttl))
44
52
  bornAt: (object/get @p bornAt (time/now))
53
+ position: (object/get @p position { x: @p.x, y: @p.z, z: @p.y })
45
54
  })))))
46
55
  RESTART -> active
47
56
  (set @entity.fx [])
@@ -38,10 +38,10 @@ orbital DrawFxLayerOrbital {
38
38
  shape : "spark" | "ring" | "puff" | "streak"
39
39
  count : number
40
40
  glow : number
41
- gravity : number
42
- vx : number
43
- vy : number
44
- vz : number
41
+ gravity : number!
42
+ vx : number!
43
+ vy : number!
44
+ vz : number!
45
45
  space : "world" | "screen"
46
46
  effect : "confetti" | "flash" | "shake" | "sparkle" | "float-text" | "streak-glow"
47
47
  particleCount : number
@@ -77,10 +77,10 @@ orbital ArcadeBoard3DFrameOrbital {
77
77
  shape : string
78
78
  count : number
79
79
  glow : number
80
- gravity : number
81
- vx : number
82
- vy : number
83
- vz : number
80
+ gravity : number!
81
+ vx : number!
82
+ vy : number!
83
+ vz : number!
84
84
  space : string
85
85
  effect : string
86
86
  particleCount : number
@@ -238,12 +238,12 @@ orbital ArcadeBoard3DFrameOrbital {
238
238
  { type: draw-sprite-layer, items: (array/map @entity.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y), z: (object/get @t z) }, asset: (if (and (validate/required (object/get @t modelUrl)) (validate/required (object/get (object/get @t modelUrl) url))) (object/get @t modelUrl) (if (validate/required (object/get @t assetKey)) (object/get @entity.assetByKey (object/get @t assetKey)) null)) })) }
239
239
  { type: draw-sprite-layer, items: (array/map @entity.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y), z: (object/get @f z) }, asset: (object/get @f assetUrl) })) }
240
240
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m z), z: 0 }, fill: "rgba(74,222,128,0.4)" })) }
241
- { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, radiusX: 0.5, radiusY: 0.2, stroke: "rgba(0,200,255,0.8)", strokeWidth: 3 })) }
241
+ { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, radiusX: 0.5, radiusY: 0.5, stroke: "rgba(0,200,255,0.8)" })) }
242
242
  { type: draw-sprite-layer, items: (array/map (array/filter @entity.units (fn u (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))))) (fn u { type: draw-sprite, position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, asset: (if (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (object/get @u modelUrl) (if (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey))) (object/get @entity.assetByKey (object/get @u assetKey)) null)), id: (object/get @u id), width: 0.8, height: 0.8, anchor: "ground" })) }
243
243
  { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))) false))) (fn u { type: draw-shape, shape: @config.unitPlaceholderShape, position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, id: (object/get @u id), radiusX: 0.3, radiusY: 0.3, width: 0.6, height: 0.6, fill: @config.unitPlaceholderFill, anchor: "ground" })) }
244
244
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.6, width: 0.8, height: 0.12, fill: "rgba(0,0,0,0.6)" })) }
245
245
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.6, width: (* 0.8 (default (/ (object/get @u health) (object/get @u maxHealth)) 0)), height: 0.12, fill: "#22c55e" })) }
246
- { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.85, color: "#ffffff" })) }
246
+ { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, color: "#ffffff" })) }
247
247
  { type: draw-fx-layer, items: @entity.fx, tickMs: 500, presets: @config.fxPresets, sprites: (object/get @config.assetManifest effects {}) }
248
248
  ] } ]
249
249
  })
@@ -285,12 +285,12 @@ orbital ArcadeBoard3DFrameOrbital {
285
285
  { type: draw-sprite-layer, items: (array/map @entity.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y), z: (object/get @t z) }, asset: (if (and (validate/required (object/get @t modelUrl)) (validate/required (object/get (object/get @t modelUrl) url))) (object/get @t modelUrl) (if (validate/required (object/get @t assetKey)) (object/get @entity.assetByKey (object/get @t assetKey)) null)) })) }
286
286
  { type: draw-sprite-layer, items: (array/map @entity.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y), z: (object/get @f z) }, asset: (object/get @f assetUrl) })) }
287
287
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m z), z: 0 }, fill: "rgba(74,222,128,0.4)" })) }
288
- { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, radiusX: 0.5, radiusY: 0.2, stroke: "rgba(0,200,255,0.8)", strokeWidth: 3 })) }
288
+ { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, radiusX: 0.5, radiusY: 0.5, stroke: "rgba(0,200,255,0.8)" })) }
289
289
  { type: draw-sprite-layer, items: (array/map (array/filter @entity.units (fn u (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))))) (fn u { type: draw-sprite, position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, asset: (if (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (object/get @u modelUrl) (if (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey))) (object/get @entity.assetByKey (object/get @u assetKey)) null)), id: (object/get @u id), width: 0.8, height: 0.8, anchor: "ground" })) }
290
290
  { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))) false))) (fn u { type: draw-shape, shape: @config.unitPlaceholderShape, position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, id: (object/get @u id), radiusX: 0.3, radiusY: 0.3, width: 0.6, height: 0.6, fill: @config.unitPlaceholderFill, anchor: "ground" })) }
291
291
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.6, width: 0.8, height: 0.12, fill: "rgba(0,0,0,0.6)" })) }
292
292
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.6, width: (* 0.8 (default (/ (object/get @u health) (object/get @u maxHealth)) 0)), height: 0.12, fill: "#22c55e" })) }
293
- { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.85, color: "#ffffff" })) }
293
+ { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, color: "#ffffff" })) }
294
294
  { type: draw-fx-layer, items: @entity.fx, tickMs: 500, presets: @config.fxPresets, sprites: (object/get @config.assetManifest effects {}) }
295
295
  ] } ]
296
296
  })
@@ -409,7 +409,7 @@ orbital ArcadeBoard3DFrameOrbital {
409
409
  @label "Features"
410
410
  @description "Arcade machines + decorations rendered on the board (static; matched against machines for playability)."
411
411
  @tier "presentation"
412
- fxPresets : [FxPreset] = [ { type: "score", color: "#ffd23f", color2: "#ff6b35", size: 0.55, shape: "spark", count: 7, glow: 0.16, vy: -0.3 }, { type: "info", color: "#38bdf8", color2: "#0c4a6e", size: 0.4, shape: "puff", count: 4 } ]
412
+ fxPresets : [FxPreset] = [ { type: "score", color: "#ffd23f", color2: "#ff6b35", size: 0.55, shape: "spark", count: 7, glow: 0.16, vy: -0.3, gravity: 0, vx: 0, vz: 0 }, { type: "info", color: "#38bdf8", color2: "#0c4a6e", size: 0.4, shape: "puff", count: 4, gravity: 0, vx: 0, vy: 0, vz: 0 } ]
413
413
  @label "Fx Presets"
414
414
  @description "This board's effect vocabulary — one look/recipe row per fx type its mechanics emit; unknown types fall back to a neutral spark."
415
415
  @tier "presentation"
@@ -75,10 +75,10 @@ orbital CrewBoard2DOrbital {
75
75
  shape : string
76
76
  count : number
77
77
  glow : number
78
- gravity : number
79
- vx : number
80
- vy : number
81
- vz : number
78
+ gravity : number!
79
+ vx : number!
80
+ vy : number!
81
+ vz : number!
82
82
  space : string
83
83
  effect : string
84
84
  particleCount : number
@@ -88,10 +88,10 @@ orbital DungeonBoard2DOrbital {
88
88
  shape : string
89
89
  count : number
90
90
  glow : number
91
- gravity : number
92
- vx : number
93
- vy : number
94
- vz : number
91
+ gravity : number!
92
+ vx : number!
93
+ vy : number!
94
+ vz : number!
95
95
  space : string
96
96
  effect : string
97
97
  particleCount : number
@@ -442,7 +442,7 @@ orbital DungeonBoard2DOrbital {
442
442
  @label "Font Family"
443
443
  @description "game-shell font family (e.g. pixel)."
444
444
  @tier "presentation"
445
- fxPresets : [FxPreset] = [ { type: "explosion", color: "#fb923c", color2: "#7c2d12", shape: "ring", size: 0.85, count: 8, glow: 0.2, gravity: 0.4 }, { type: "pickup", color: "#ffe066", color2: "#fff4cc", shape: "spark", size: 0.4, count: 5, glow: 0.1, vy: -0.5 } ]
445
+ fxPresets : [FxPreset] = [ { type: "explosion", color: "#fb923c", color2: "#7c2d12", shape: "ring", size: 0.85, count: 8, glow: 0.2, gravity: 0.4, vx: 0, vy: 0, vz: 0 }, { type: "pickup", color: "#ffe066", color2: "#fff4cc", shape: "spark", size: 0.4, count: 5, glow: 0.1, vy: -0.5, gravity: 0, vx: 0, vz: 0 } ]
446
446
  @label "Fx Presets"
447
447
  @description "This board's effect vocabulary — one look/recipe row per fx type its mechanics emit; unknown types fall back to a neutral spark."
448
448
  @tier "presentation"
@@ -87,10 +87,10 @@ orbital MarketBoard3DOrbital {
87
87
  shape : string
88
88
  count : number
89
89
  glow : number
90
- gravity : number
91
- vx : number
92
- vy : number
93
- vz : number
90
+ gravity : number!
91
+ vx : number!
92
+ vy : number!
93
+ vz : number!
94
94
  space : string
95
95
  effect : string
96
96
  particleCount : number
@@ -262,12 +262,12 @@ orbital MarketBoard3DOrbital {
262
262
  { type: draw-sprite-layer, items: (array/filter (array/map @entity.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y), z: (object/get @t z) }, asset: (if (and (validate/required (object/get @t modelUrl)) (validate/required (object/get (object/get @t modelUrl) url))) (object/get @t modelUrl) (if (and (validate/required (object/get @t assetKey)) (object/has @entity.assetByKey (object/get @t assetKey))) (object/get @entity.assetByKey (object/get @t assetKey)) (if (validate/required (object/get @t terrain)) (object/get (object/merge (object/get @config.assetManifest terrains {}) (object/get @entity.assetManifest terrains {})) (object/get @t terrain)) null))) })) (fn s (and (validate/required (object/get @s asset)) (validate/required (object/get (object/get @s asset) url))))) }
263
263
  { type: draw-sprite-layer, items: (array/map @config.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y) }, asset: (if (and (validate/required (object/get @f assetUrl)) (validate/required (object/get (object/get @f assetUrl) url))) (object/get @f assetUrl) (if (validate/required (object/get @f assetKey)) (object/get (object/merge (object/get @config.assetManifest features {}) (object/get @entity.assetManifest features {})) (object/get @f assetKey)) null)) })) }
264
264
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m z) }, fill: "rgba(74,222,128,0.4)" })) }
265
- { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, radiusX: 0.5, radiusY: 0.2, stroke: "rgba(0,200,255,0.8)", strokeWidth: 3 })) }
265
+ { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, radiusX: 0.5, radiusY: 0.5, stroke: "rgba(0,200,255,0.8)" })) }
266
266
  { type: draw-sprite-layer, items: (array/concat (array/map (array/filter @entity.units (fn u (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))))) (fn u { type: draw-sprite, position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, asset: (if (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (object/get @u modelUrl) (if (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey))) (object/get @entity.assetByKey (object/get @u assetKey)) null)), id: (object/get @u id), width: 0.8, height: 0.8, anchor: "ground" })) (array/map (array/filter @entity.customers (fn c (or (and (validate/required (object/get @c modelUrl)) (validate/required (object/get (object/get @c modelUrl) url))) (and (validate/required (object/get @c assetKey)) (object/has @entity.assetByKey (object/get @c assetKey)))))) (fn c { type: draw-sprite, position: (object/get @c position), asset: (if (and (validate/required (object/get @c modelUrl)) (validate/required (object/get (object/get @c modelUrl) url))) (object/get @c modelUrl) (if (and (validate/required (object/get @c assetKey)) (object/has @entity.assetByKey (object/get @c assetKey))) (object/get @entity.assetByKey (object/get @c assetKey)) null)), width: 0.8, height: 0.8 }))) }
267
267
  { type: draw-shape-layer, items: (array/concat (array/map (array/filter @entity.units (fn u (== (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))) false))) (fn u { type: draw-shape, shape: @config.unitPlaceholderShape, position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, id: (object/get @u id), radiusX: 0.3, radiusY: 0.3, width: 0.6, height: 0.6, fill: @config.unitPlaceholderFill, anchor: "ground" })) (array/map (array/filter @entity.customers (fn c (== (or (and (validate/required (object/get @c modelUrl)) (validate/required (object/get (object/get @c modelUrl) url))) (and (validate/required (object/get @c assetKey)) (object/has @entity.assetByKey (object/get @c assetKey)))) false))) (fn c { type: draw-shape, shape: @config.unitPlaceholderShape, position: (object/get @c position), id: (object/get @c id), radiusX: 0.3, radiusY: 0.3, width: 0.6, height: 0.6, fill: @config.unitPlaceholderFill, anchor: "ground" }))) }
268
268
  { type: draw-shape-layer, items: (array/concat (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.6, width: 0.8, height: 0.12, fill: "rgba(0,0,0,0.6)" })) (array/map @entity.customers (fn c { type: draw-shape, shape: "rect", position: (object/get @c position), offsetY: -0.6, width: 0.8, height: 0.12, fill: "rgba(0,0,0,0.6)" }))) }
269
269
  { type: draw-shape-layer, items: (array/concat (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.6, width: (* 0.8 (default (/ (object/get @u health) (object/get @u maxHealth)) 0)), height: 0.12, fill: "#22c55e" })) (array/map @entity.customers (fn c { type: draw-shape, shape: "rect", position: (object/get @c position), offsetY: -0.6, width: 0.8, height: 0.12, fill: "#22c55e" }))) }
270
- { type: draw-text-layer, items: (array/concat (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.85, color: "#ffffff" })) (array/map @entity.customers (fn c { type: draw-text, text: (object/get @c name), position: (object/get @c position), offsetY: -0.85, color: "#ffffff" }))) }
270
+ { type: draw-text-layer, items: (array/concat (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, color: "#ffffff" })) (array/map @entity.customers (fn c { type: draw-text, text: (object/get @c name), position: (object/get @c position), color: "#ffffff" }))) }
271
271
  { type: draw-fx-layer, items: @entity.fx, tickMs: 500, presets: @config.fxPresets }
272
272
  ] } ]
273
273
  })
@@ -306,12 +306,12 @@ orbital MarketBoard3DOrbital {
306
306
  { type: draw-sprite-layer, items: (array/filter (array/map @entity.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y), z: (object/get @t z) }, asset: (if (and (validate/required (object/get @t modelUrl)) (validate/required (object/get (object/get @t modelUrl) url))) (object/get @t modelUrl) (if (and (validate/required (object/get @t assetKey)) (object/has @entity.assetByKey (object/get @t assetKey))) (object/get @entity.assetByKey (object/get @t assetKey)) (if (validate/required (object/get @t terrain)) (object/get (object/merge (object/get @config.assetManifest terrains {}) (object/get @entity.assetManifest terrains {})) (object/get @t terrain)) null))) })) (fn s (and (validate/required (object/get @s asset)) (validate/required (object/get (object/get @s asset) url))))) }
307
307
  { type: draw-sprite-layer, items: (array/map @config.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y) }, asset: (if (and (validate/required (object/get @f assetUrl)) (validate/required (object/get (object/get @f assetUrl) url))) (object/get @f assetUrl) (if (validate/required (object/get @f assetKey)) (object/get (object/merge (object/get @config.assetManifest features {}) (object/get @entity.assetManifest features {})) (object/get @f assetKey)) null)) })) }
308
308
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m z) }, fill: "rgba(74,222,128,0.4)" })) }
309
- { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, radiusX: 0.5, radiusY: 0.2, stroke: "rgba(0,200,255,0.8)", strokeWidth: 3 })) }
309
+ { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, radiusX: 0.5, radiusY: 0.5, stroke: "rgba(0,200,255,0.8)" })) }
310
310
  { type: draw-sprite-layer, items: (array/concat (array/map (array/filter @entity.units (fn u (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))))) (fn u { type: draw-sprite, position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, asset: (if (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (object/get @u modelUrl) (if (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey))) (object/get @entity.assetByKey (object/get @u assetKey)) null)), id: (object/get @u id), width: 0.8, height: 0.8, anchor: "ground" })) (array/map (array/filter @entity.customers (fn c (or (and (validate/required (object/get @c modelUrl)) (validate/required (object/get (object/get @c modelUrl) url))) (and (validate/required (object/get @c assetKey)) (object/has @entity.assetByKey (object/get @c assetKey)))))) (fn c { type: draw-sprite, position: (object/get @c position), asset: (if (and (validate/required (object/get @c modelUrl)) (validate/required (object/get (object/get @c modelUrl) url))) (object/get @c modelUrl) (if (and (validate/required (object/get @c assetKey)) (object/has @entity.assetByKey (object/get @c assetKey))) (object/get @entity.assetByKey (object/get @c assetKey)) null)), width: 0.8, height: 0.8 }))) }
311
311
  { type: draw-shape-layer, items: (array/concat (array/map (array/filter @entity.units (fn u (== (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))) false))) (fn u { type: draw-shape, shape: @config.unitPlaceholderShape, position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, id: (object/get @u id), radiusX: 0.3, radiusY: 0.3, width: 0.6, height: 0.6, fill: @config.unitPlaceholderFill, anchor: "ground" })) (array/map (array/filter @entity.customers (fn c (== (or (and (validate/required (object/get @c modelUrl)) (validate/required (object/get (object/get @c modelUrl) url))) (and (validate/required (object/get @c assetKey)) (object/has @entity.assetByKey (object/get @c assetKey)))) false))) (fn c { type: draw-shape, shape: @config.unitPlaceholderShape, position: (object/get @c position), id: (object/get @c id), radiusX: 0.3, radiusY: 0.3, width: 0.6, height: 0.6, fill: @config.unitPlaceholderFill, anchor: "ground" }))) }
312
312
  { type: draw-shape-layer, items: (array/concat (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.6, width: 0.8, height: 0.12, fill: "rgba(0,0,0,0.6)" })) (array/map @entity.customers (fn c { type: draw-shape, shape: "rect", position: (object/get @c position), offsetY: -0.6, width: 0.8, height: 0.12, fill: "rgba(0,0,0,0.6)" }))) }
313
313
  { type: draw-shape-layer, items: (array/concat (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.6, width: (* 0.8 (default (/ (object/get @u health) (object/get @u maxHealth)) 0)), height: 0.12, fill: "#22c55e" })) (array/map @entity.customers (fn c { type: draw-shape, shape: "rect", position: (object/get @c position), offsetY: -0.6, width: 0.8, height: 0.12, fill: "#22c55e" }))) }
314
- { type: draw-text-layer, items: (array/concat (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.85, color: "#ffffff" })) (array/map @entity.customers (fn c { type: draw-text, text: (object/get @c name), position: (object/get @c position), offsetY: -0.85, color: "#ffffff" }))) }
314
+ { type: draw-text-layer, items: (array/concat (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, color: "#ffffff" })) (array/map @entity.customers (fn c { type: draw-text, text: (object/get @c name), position: (object/get @c position), color: "#ffffff" }))) }
315
315
  { type: draw-fx-layer, items: @entity.fx, tickMs: 500, presets: @config.fxPresets }
316
316
  ] } ]
317
317
  })
@@ -412,7 +412,7 @@ orbital MarketBoard3DOrbital {
412
412
  @label "Features"
413
413
  @description "Static decorative props (shelves/freezers/checkout/etc); never mutated by any mechanic."
414
414
  @tier "presentation"
415
- fxPresets : [FxPreset] = [ { type: "score", color: "#fbbf24", color2: "#fde68a", size: 0.45, shape: "spark", count: 6, glow: 0.1, vy: -0.3 }, { type: "damage", color: "#ef4444", color2: "#450a0a", size: 0.5, shape: "puff", count: 4, gravity: 0.3 } ]
415
+ fxPresets : [FxPreset] = [ { type: "score", color: "#fbbf24", color2: "#fde68a", size: 0.45, shape: "spark", count: 6, glow: 0.1, vy: -0.3, gravity: 0, vx: 0, vz: 0 }, { type: "damage", color: "#ef4444", color2: "#450a0a", size: 0.5, shape: "puff", count: 4, gravity: 0.3, vx: 0, vy: 0, vz: 0 } ]
416
416
  @label "Fx Presets"
417
417
  @description "This board's effect vocabulary — one look/recipe row per fx type its mechanics emit; unknown types fall back to a neutral spark."
418
418
  @tier "presentation"
@@ -77,10 +77,10 @@ orbital ObjectiveBoard3DOrbital {
77
77
  shape : string
78
78
  count : number
79
79
  glow : number
80
- gravity : number
81
- vx : number
82
- vy : number
83
- vz : number
80
+ gravity : number!
81
+ vx : number!
82
+ vy : number!
83
+ vz : number!
84
84
  space : string
85
85
  effect : string
86
86
  particleCount : number
@@ -255,12 +255,12 @@ orbital ObjectiveBoard3DOrbital {
255
255
  { type: draw-sprite-layer, items: (array/filter (array/map @entity.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y) }, asset: (if (and (validate/required (object/get @t modelUrl)) (validate/required (object/get (object/get @t modelUrl) url))) (object/get @t modelUrl) (if (and (validate/required (object/get @t assetKey)) (object/has @entity.assetByKey (object/get @t assetKey))) (object/get @entity.assetByKey (object/get @t assetKey)) (if (validate/required (object/get @t terrain)) (object/get (object/merge (object/get @config.assetManifest terrains {}) (default (object/get @entity.assetManifest terrains {}) {})) (object/get @t terrain)) null))) })) (fn s (and (validate/required (object/get @s asset)) (validate/required (object/get (object/get @s asset) url))))) }
256
256
  { type: draw-sprite-layer, items: (array/map @entity.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y) }, asset: (object/get @f assetUrl) })) }
257
257
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m z) }, fill: "rgba(74,222,128,0.4)" })) }
258
- { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: (object/get @u position), radiusX: 0.5, radiusY: 0.2, stroke: "rgba(0,200,255,0.8)", strokeWidth: 3 })) }
258
+ { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: (object/get @u position), radiusX: 0.5, radiusY: 0.5, stroke: "rgba(0,200,255,0.8)" })) }
259
259
  { type: draw-sprite-layer, items: (array/map (array/filter @entity.units (fn u (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))))) (fn u { type: draw-sprite, position: (object/get @u position), asset: (if (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (object/get @u modelUrl) (if (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey))) (object/get @entity.assetByKey (object/get @u assetKey)) null)), id: (object/get @u id), width: 0.8, height: 0.8, anchor: "ground" })) }
260
260
  { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))) false))) (fn u { type: draw-shape, shape: @config.unitPlaceholderShape, position: (object/get @u position), id: (object/get @u id), radiusX: 0.3, radiusY: 0.3, width: 0.6, height: 0.6, fill: @config.unitPlaceholderFill, anchor: "ground" })) }
261
261
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: (object/get @u position), offsetY: -0.6, width: 0.8, height: 0.12, fill: "rgba(0,0,0,0.6)" })) }
262
262
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: (object/get @u position), offsetY: -0.6, width: (* 0.8 (default (/ (object/get @u health) (object/get @u maxHealth)) 0)), height: 0.12, fill: "#22c55e" })) }
263
- { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: (object/get @u position), offsetY: -0.85, color: "#ffffff" })) }
263
+ { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: (object/get @u position), color: "#ffffff" })) }
264
264
  { type: draw-fx-layer, items: @entity.fx, tickMs: 500, presets: @config.fxPresets }
265
265
  ] } ]
266
266
  })
@@ -299,12 +299,12 @@ orbital ObjectiveBoard3DOrbital {
299
299
  { type: draw-sprite-layer, items: (array/filter (array/map @entity.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y) }, asset: (if (and (validate/required (object/get @t modelUrl)) (validate/required (object/get (object/get @t modelUrl) url))) (object/get @t modelUrl) (if (and (validate/required (object/get @t assetKey)) (object/has @entity.assetByKey (object/get @t assetKey))) (object/get @entity.assetByKey (object/get @t assetKey)) (if (validate/required (object/get @t terrain)) (object/get (object/merge (object/get @config.assetManifest terrains {}) (default (object/get @entity.assetManifest terrains {}) {})) (object/get @t terrain)) null))) })) (fn s (and (validate/required (object/get @s asset)) (validate/required (object/get (object/get @s asset) url))))) }
300
300
  { type: draw-sprite-layer, items: (array/map @entity.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y) }, asset: (object/get @f assetUrl) })) }
301
301
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m z) }, fill: "rgba(74,222,128,0.4)" })) }
302
- { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: (object/get @u position), radiusX: 0.5, radiusY: 0.2, stroke: "rgba(0,200,255,0.8)", strokeWidth: 3 })) }
302
+ { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: (object/get @u position), radiusX: 0.5, radiusY: 0.5, stroke: "rgba(0,200,255,0.8)" })) }
303
303
  { type: draw-sprite-layer, items: (array/map (array/filter @entity.units (fn u (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))))) (fn u { type: draw-sprite, position: (object/get @u position), asset: (if (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (object/get @u modelUrl) (if (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey))) (object/get @entity.assetByKey (object/get @u assetKey)) null)), id: (object/get @u id), width: 0.8, height: 0.8, anchor: "ground" })) }
304
304
  { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))) false))) (fn u { type: draw-shape, shape: @config.unitPlaceholderShape, position: (object/get @u position), id: (object/get @u id), radiusX: 0.3, radiusY: 0.3, width: 0.6, height: 0.6, fill: @config.unitPlaceholderFill, anchor: "ground" })) }
305
305
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: (object/get @u position), offsetY: -0.6, width: 0.8, height: 0.12, fill: "rgba(0,0,0,0.6)" })) }
306
306
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: (object/get @u position), offsetY: -0.6, width: (* 0.8 (default (/ (object/get @u health) (object/get @u maxHealth)) 0)), height: 0.12, fill: "#22c55e" })) }
307
- { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: (object/get @u position), offsetY: -0.85, color: "#ffffff" })) }
307
+ { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: (object/get @u position), color: "#ffffff" })) }
308
308
  { type: draw-fx-layer, items: @entity.fx, tickMs: 500, presets: @config.fxPresets }
309
309
  ] } ]
310
310
  })
@@ -401,7 +401,7 @@ orbital ObjectiveBoard3DOrbital {
401
401
  @label "Bg Color"
402
402
  @description "Canvas background color."
403
403
  @tier "presentation"
404
- fxPresets : [FxPreset] = [ { type: "pickup", color: "#ffe066", color2: "#ffffff", size: 0.5, shape: "spark", count: 6, glow: 0.14, vy: -0.3 } ]
404
+ fxPresets : [FxPreset] = [ { type: "pickup", color: "#ffe066", color2: "#ffffff", size: 0.5, shape: "spark", count: 6, glow: 0.14, vy: -0.3, gravity: 0, vx: 0, vz: 0 } ]
405
405
  @label "Fx Presets"
406
406
  @description "This board's effect vocabulary — one look/recipe row per fx type its mechanics emit; unknown types fall back to a neutral spark."
407
407
  @tier "presentation"
@@ -81,10 +81,10 @@ orbital PlatformerBoard2DOrbital {
81
81
  shape : string
82
82
  count : number
83
83
  glow : number
84
- gravity : number
85
- vx : number
86
- vy : number
87
- vz : number
84
+ gravity : number!
85
+ vx : number!
86
+ vy : number!
87
+ vz : number!
88
88
  space : string
89
89
  effect : string
90
90
  particleCount : number
@@ -399,7 +399,7 @@ orbital PlatformerBoard2DOrbital {
399
399
  @label "World Width"
400
400
  @description "World pixel width (camera + canvas bounds)"
401
401
  @tier "presentation"
402
- fxPresets : [FxPreset] = [ { type: "score", color: "#ffe066", color2: "#fff4cc", shape: "spark", size: 22, count: 6, glow: 0.15, vy: -35 }, { type: "damage", color: "#ef4444", color2: "#7f1d1d", shape: "spark", size: 20, count: 5, glow: 0.12, gravity: 40 } ]
402
+ fxPresets : [FxPreset] = [ { type: "score", color: "#ffe066", color2: "#fff4cc", shape: "spark", size: 22, count: 6, glow: 0.15, vy: -35, gravity: 0, vx: 0, vz: 0 }, { type: "damage", color: "#ef4444", color2: "#7f1d1d", shape: "spark", size: 20, count: 5, glow: 0.12, gravity: 40, vx: 0, vy: 0, vz: 0 } ]
403
403
  @label "Fx Presets"
404
404
  @description "This board's effect vocabulary — one look/recipe row per fx type its intent trait emits (goal score, hazard/fell damage)."
405
405
  @tier "presentation"
@@ -115,10 +115,10 @@ orbital PlatformerPuzzleOrbital {
115
115
  shape : string
116
116
  count : number
117
117
  glow : number
118
- gravity : number
119
- vx : number
120
- vy : number
121
- vz : number
118
+ gravity : number!
119
+ vx : number!
120
+ vy : number!
121
+ vz : number!
122
122
  space : string
123
123
  effect : string
124
124
  particleCount : number
@@ -77,10 +77,10 @@ orbital SurvivalBoard3DOrbital {
77
77
  shape : string
78
78
  count : number
79
79
  glow : number
80
- gravity : number
81
- vx : number
82
- vy : number
83
- vz : number
80
+ gravity : number!
81
+ vx : number!
82
+ vy : number!
83
+ vz : number!
84
84
  space : string
85
85
  effect : string
86
86
  particleCount : number
@@ -231,12 +231,12 @@ orbital SurvivalBoard3DOrbital {
231
231
  { type: draw-sprite-layer, items: (array/filter (array/map @entity.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y) }, asset: (if (and (validate/required (object/get @t modelUrl)) (validate/required (object/get (object/get @t modelUrl) url))) (object/get @t modelUrl) (if (and (validate/required (object/get @t assetKey)) (object/has @entity.assetByKey (object/get @t assetKey))) (object/get @entity.assetByKey (object/get @t assetKey)) (if (validate/required (object/get @t terrain)) (object/get (object/get @config.assetManifest terrains {}) (object/get @t terrain)) null))) })) (fn s (and (validate/required (object/get @s asset)) (validate/required (object/get (object/get @s asset) url))))) }
232
232
  { type: draw-sprite-layer, items: (array/map @entity.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y) }, asset: (object/get @f assetUrl) })) }
233
233
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m z) }, fill: "rgba(74,222,128,0.4)" })) }
234
- { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: (object/get @u position), radiusX: 0.5, radiusY: 0.2, stroke: "rgba(0,200,255,0.8)", strokeWidth: 3 })) }
234
+ { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: (object/get @u position), radiusX: 0.5, radiusY: 0.5, stroke: "rgba(0,200,255,0.8)" })) }
235
235
  { type: draw-sprite-layer, items: (array/map (array/filter @entity.units (fn u (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))))) (fn u { type: draw-sprite, position: (object/get @u position), asset: (if (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (object/get @u modelUrl) (if (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey))) (object/get @entity.assetByKey (object/get @u assetKey)) null)), id: (object/get @u id), width: 0.8, height: 0.8, anchor: "ground" })) }
236
236
  { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))) false))) (fn u { type: draw-shape, shape: @config.unitPlaceholderShape, position: (object/get @u position), id: (object/get @u id), radiusX: 0.3, radiusY: 0.3, width: 0.6, height: 0.6, fill: @config.unitPlaceholderFill, anchor: "ground" })) }
237
237
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: (object/get @u position), offsetY: -0.6, width: 0.8, height: 0.12, fill: "rgba(0,0,0,0.6)" })) }
238
238
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: (object/get @u position), offsetY: -0.6, width: (* 0.8 (default (/ (object/get @u health) (object/get @u maxHealth)) 0)), height: 0.12, fill: "#22c55e" })) }
239
- { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: (object/get @u position), offsetY: -0.85, color: "#ffffff" })) }
239
+ { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: (object/get @u position), color: "#ffffff" })) }
240
240
  { type: draw-fx-layer, items: @entity.fx, tickMs: 500, presets: @config.fxPresets }
241
241
  ] } ]
242
242
  })
@@ -278,12 +278,12 @@ orbital SurvivalBoard3DOrbital {
278
278
  { type: draw-sprite-layer, items: (array/filter (array/map @entity.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y) }, asset: (if (and (validate/required (object/get @t modelUrl)) (validate/required (object/get (object/get @t modelUrl) url))) (object/get @t modelUrl) (if (and (validate/required (object/get @t assetKey)) (object/has @entity.assetByKey (object/get @t assetKey))) (object/get @entity.assetByKey (object/get @t assetKey)) (if (validate/required (object/get @t terrain)) (object/get (object/get @config.assetManifest terrains {}) (object/get @t terrain)) null))) })) (fn s (and (validate/required (object/get @s asset)) (validate/required (object/get (object/get @s asset) url))))) }
279
279
  { type: draw-sprite-layer, items: (array/map @entity.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y) }, asset: (object/get @f assetUrl) })) }
280
280
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m z) }, fill: "rgba(74,222,128,0.4)" })) }
281
- { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: (object/get @u position), radiusX: 0.5, radiusY: 0.2, stroke: "rgba(0,200,255,0.8)", strokeWidth: 3 })) }
281
+ { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: (object/get @u position), radiusX: 0.5, radiusY: 0.5, stroke: "rgba(0,200,255,0.8)" })) }
282
282
  { type: draw-sprite-layer, items: (array/map (array/filter @entity.units (fn u (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))))) (fn u { type: draw-sprite, position: (object/get @u position), asset: (if (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (object/get @u modelUrl) (if (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey))) (object/get @entity.assetByKey (object/get @u assetKey)) null)), id: (object/get @u id), width: 0.8, height: 0.8, anchor: "ground" })) }
283
283
  { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (or (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (and (validate/required (object/get @u assetKey)) (object/has @entity.assetByKey (object/get @u assetKey)))) false))) (fn u { type: draw-shape, shape: @config.unitPlaceholderShape, position: (object/get @u position), id: (object/get @u id), radiusX: 0.3, radiusY: 0.3, width: 0.6, height: 0.6, fill: @config.unitPlaceholderFill, anchor: "ground" })) }
284
284
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: (object/get @u position), offsetY: -0.6, width: 0.8, height: 0.12, fill: "rgba(0,0,0,0.6)" })) }
285
285
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: (object/get @u position), offsetY: -0.6, width: (* 0.8 (default (/ (object/get @u health) (object/get @u maxHealth)) 0)), height: 0.12, fill: "#22c55e" })) }
286
- { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: (object/get @u position), offsetY: -0.85, color: "#ffffff" })) }
286
+ { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: (object/get @u position), color: "#ffffff" })) }
287
287
  { type: draw-fx-layer, items: @entity.fx, tickMs: 500, presets: @config.fxPresets }
288
288
  ] } ]
289
289
  })
@@ -390,7 +390,7 @@ orbital SurvivalBoard3DOrbital {
390
390
  @label "Bg Color"
391
391
  @description "Canvas background color."
392
392
  @tier "presentation"
393
- fxPresets : [FxPreset] = [ { type: "pickup", color: "#84a98c", color2: "#6b4226", size: 0.45, shape: "spark", count: 5, vy: -0.2 } ]
393
+ fxPresets : [FxPreset] = [ { type: "pickup", color: "#84a98c", color2: "#6b4226", size: 0.45, shape: "spark", count: 5, vy: -0.2, gravity: 0, vx: 0, vz: 0 } ]
394
394
  @label "Fx Presets"
395
395
  @description "This board's effect vocabulary — one look/recipe row per fx type its mechanics emit; unknown types fall back to a neutral spark."
396
396
  @tier "presentation"
@@ -78,10 +78,10 @@ orbital TacticsBoard2DOrbital {
78
78
  shape : string
79
79
  count : number
80
80
  glow : number
81
- gravity : number
82
- vx : number
83
- vy : number
84
- vz : number
81
+ gravity : number!
82
+ vx : number!
83
+ vy : number!
84
+ vz : number!
85
85
  space : string
86
86
  effect : string
87
87
  particleCount : number
@@ -462,7 +462,7 @@ orbital TacticsBoard2DOrbital {
462
462
  @label "Asset Manifest"
463
463
  @description "Terrain/unit/feature/effect sprite manifest."
464
464
  @tier "presentation"
465
- fxPresets : [FxPreset] = [ { type: "hit", color: "#ff6b6b", color2: "#ffb347", shape: "spark", size: 0.45, count: 6, glow: 0.12, vy: -0.3 } ]
465
+ fxPresets : [FxPreset] = [ { type: "hit", color: "#ff6b6b", color2: "#ffb347", shape: "spark", size: 0.45, count: 6, glow: 0.12, vy: -0.3, gravity: 0, vx: 0, vz: 0 } ]
466
466
  @label "Fx Presets"
467
467
  @description "This board's effect vocabulary — one look/recipe row per fx type its mechanics emit; unknown types fall back to a neutral spark."
468
468
  @tier "presentation"
@@ -107,10 +107,10 @@ orbital TacticsBoard3DOrbital {
107
107
  shape : string
108
108
  count : number
109
109
  glow : number
110
- gravity : number
111
- vx : number
112
- vy : number
113
- vz : number
110
+ gravity : number!
111
+ vx : number!
112
+ vy : number!
113
+ vz : number!
114
114
  space : string
115
115
  effect : string
116
116
  particleCount : number
@@ -251,14 +251,14 @@ orbital TacticsBoard3DOrbital {
251
251
  (array/concat (let ((layers3 : [node] [
252
252
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m z) }, fill: "rgba(74,222,128,0.4)" })) }
253
253
  { type: draw-shape-layer, items: (array/map @entity.attackTargets (fn a { type: draw-shape, shape: "cell", position: { x: (object/get @a x), y: (object/get @a z) }, fill: "rgba(239,68,68,0.4)" })) }
254
- { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, radiusX: 0.5, radiusY: 0.2, stroke: "rgba(0,200,255,0.8)", strokeWidth: 3 })) }
254
+ { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, radiusX: 0.5, radiusY: 0.5, stroke: "rgba(0,200,255,0.8)" })) }
255
255
  ])) @layers3) (array/concat
256
256
  (array/map (array/filter @entity.units (fn u (and (validate/required (object/get @u unitType)) (object/has @entity.meshAssetArt (object/get @u unitType))))) (fn u (let ((unitStates (default (object/get @entity.meshAssetArt (default (object/get @u unitType) "")) {})) (unitAnim (if (<= (object/get @u health) 0) "death" "idle"))) { type: draw-group, id: (object/get @u id), position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, scale: @config.meshUnitScale, rotate: (- 0 (object/get @u yaw 0)), items: (if (object/has @unitStates @unitAnim) (object/get @unitStates @unitAnim) (object/get @unitStates "idle")) })))
257
257
  (array/concat (let ((layers4 : [node] [
258
258
  { type: draw-sprite-layer, items: (array/map (array/filter @entity.units (fn u (not (and (validate/required (object/get @u unitType)) (object/has @entity.meshAssetArt (object/get @u unitType)))))) (fn u { type: draw-sprite, position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, asset: (if (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (object/get @u modelUrl) (if (validate/required (object/get @u assetKey)) (object/get @entity.assetByKey (object/get @u assetKey)) null)), id: (object/get @u id), width: 0.8, height: 0.8, anchor: "ground" })) }
259
259
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, offsetY: -0.6, width: 0.8, height: 0.12, fill: "rgba(0,0,0,0.6)" })) }
260
260
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, offsetY: -0.6, width: (* 0.8 (default (/ (object/get @u health) (object/get @u maxHealth)) 0)), height: 0.12, fill: "#22c55e" })) }
261
- { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, offsetY: -0.85, color: "#ffffff" })) }
261
+ { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, color: "#ffffff" })) }
262
262
  ])) @layers4) (array/concat
263
263
  []
264
264
  [
@@ -325,14 +325,14 @@ orbital TacticsBoard3DOrbital {
325
325
  (array/concat (let ((layers7 : [node] [
326
326
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m z) }, fill: "rgba(74,222,128,0.4)" })) }
327
327
  { type: draw-shape-layer, items: (array/map @entity.attackTargets (fn a { type: draw-shape, shape: "cell", position: { x: (object/get @a x), y: (object/get @a z) }, fill: "rgba(239,68,68,0.4)" })) }
328
- { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, radiusX: 0.5, radiusY: 0.2, stroke: "rgba(0,200,255,0.8)", strokeWidth: 3 })) }
328
+ { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, radiusX: 0.5, radiusY: 0.5, stroke: "rgba(0,200,255,0.8)" })) }
329
329
  ])) @layers7) (array/concat
330
330
  (array/map (array/filter @entity.units (fn u (and (validate/required (object/get @u unitType)) (object/has @entity.meshAssetArt (object/get @u unitType))))) (fn u (let ((unitStates (default (object/get @entity.meshAssetArt (default (object/get @u unitType) "")) {})) (unitAnim (if (<= (object/get @u health) 0) "death" "idle"))) { type: draw-group, id: (object/get @u id), position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, scale: @config.meshUnitScale, rotate: (- 0 (object/get @u yaw 0)), items: (if (object/has @unitStates @unitAnim) (object/get @unitStates @unitAnim) (object/get @unitStates "idle")) })))
331
331
  (array/concat (let ((layers8 : [node] [
332
332
  { type: draw-sprite-layer, items: (array/map (array/filter @entity.units (fn u (not (and (validate/required (object/get @u unitType)) (object/has @entity.meshAssetArt (object/get @u unitType)))))) (fn u { type: draw-sprite, position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, asset: (if (and (validate/required (object/get @u modelUrl)) (validate/required (object/get (object/get @u modelUrl) url))) (object/get @u modelUrl) (if (validate/required (object/get @u assetKey)) (object/get @entity.assetByKey (object/get @u assetKey)) null)), id: (object/get @u id), width: 0.8, height: 0.8, anchor: "ground" })) }
333
333
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, offsetY: -0.6, width: 0.8, height: 0.12, fill: "rgba(0,0,0,0.6)" })) }
334
334
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, offsetY: -0.6, width: (* 0.8 (default (/ (object/get @u health) (object/get @u maxHealth)) 0)), height: 0.12, fill: "#22c55e" })) }
335
- { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, offsetY: -0.85, color: "#ffffff" })) }
335
+ { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: { x: (object/get @u x), y: (object/get @u y), z: (object/get @u z) }, color: "#ffffff" })) }
336
336
  ])) @layers8) (array/concat
337
337
  []
338
338
  [
@@ -407,7 +407,7 @@ orbital TacticsBoard3DOrbital {
407
407
  @label "Features"
408
408
  @description "Decorative environment features drawn on the board."
409
409
  @tier "presentation"
410
- fxPresets : [FxPreset] = [ { type: "hit", color: "#ff5252", color2: "#7a1010", size: 0.5, shape: "spark", count: 6, glow: 0.12, gravity: 0.6, vy: -0.2 } ]
410
+ fxPresets : [FxPreset] = [ { type: "hit", color: "#ff5252", color2: "#7a1010", size: 0.5, shape: "spark", count: 6, glow: 0.12, gravity: 0.6, vy: -0.2, vx: 0, vz: 0 } ]
411
411
  @label "Fx Presets"
412
412
  @description "This board's effect vocabulary — one look/recipe row per fx type its mechanics emit; unknown types fall back to a neutral spark."
413
413
  @tier "presentation"