@almadar/std 17.0.2 → 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 (317) 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-packages.lolo +26 -16
  7. package/behaviors/lolo/cli/atoms/std-orb-serve.lolo +24 -4
  8. package/behaviors/lolo/codec/atoms/std-lolo-kotlin.lolo +26 -3
  9. package/behaviors/lolo/codec/atoms/std-lolo-python.lolo +15 -2
  10. package/behaviors/lolo/codec/atoms/std-lolo-rust.lolo +27 -2
  11. package/behaviors/lolo/codec/atoms/std-lolo-source.lolo +251 -60
  12. package/behaviors/lolo/codec/atoms/std-lolo-swift.lolo +24 -1
  13. package/behaviors/lolo/codec/atoms/std-lolo-typescript.lolo +24 -3
  14. package/behaviors/lolo/connect/atoms/std-meta-ads.lolo +4 -4
  15. package/behaviors/lolo/connect/atoms/std-stdio-lines.lolo +7 -4
  16. package/behaviors/lolo/connect/atoms/std-youtube.lolo +9 -9
  17. package/behaviors/lolo/dev/atoms/std-guest-session.lolo +122 -10
  18. package/behaviors/lolo/dev/atoms/std-mock-seed-marks.lolo +66 -0
  19. package/behaviors/lolo/dev/organisms/std-behavior-playground.lolo +5 -2
  20. package/behaviors/lolo/dev/organisms/std-launchpad.lolo +4 -3
  21. package/behaviors/lolo/gpu/atoms/std-gpu-compute.lolo +329 -0
  22. package/behaviors/lolo/net/atoms/std-http-client.lolo +4 -4
  23. package/behaviors/lolo/net/atoms/std-http-fetch.lolo +6 -6
  24. package/behaviors/lolo/net/atoms/std-npm-lookup.lolo +1 -1
  25. package/behaviors/lolo/net/atoms/std-npm-registry.lolo +2 -2
  26. package/behaviors/lolo/spec/auth/dev-personas.replay.goldens.json +263 -2
  27. package/behaviors/lolo/spec/cli/lint-all.lolo +1 -0
  28. package/behaviors/lolo/spec/cli/lint-item-action-event.replay.goldens.json +9 -9
  29. package/behaviors/lolo/spec/cli/lint-mem-handles.replay.goldens.json +3021 -1
  30. package/behaviors/lolo/spec/cli/lint-os-grants.replay.goldens.json +284 -12
  31. package/behaviors/lolo/spec/cli/mcp-server.replay.goldens.json +51 -55
  32. package/behaviors/lolo/spec/cli/orb-compile.replay.goldens.json +10 -4
  33. package/behaviors/lolo/spec/cli/orb-packages.lolo +1 -1
  34. package/behaviors/lolo/spec/codec/lolo-kotlin.replay.goldens.json +7496 -7497
  35. package/behaviors/lolo/spec/codec/lolo-python.replay.goldens.json +341 -3
  36. package/behaviors/lolo/spec/codec/lolo-rust.replay.goldens.json +18931 -6142
  37. package/behaviors/lolo/spec/codec/lolo-source.fixtures/compose-pair.lolo +44 -0
  38. package/behaviors/lolo/spec/codec/lolo-source.fixtures/config-read.lolo +2 -1
  39. package/behaviors/lolo/spec/codec/lolo-source.fixtures/divide-default.lolo +2 -1
  40. package/behaviors/lolo/spec/codec/lolo-source.fixtures/divide-plain.lolo +2 -1
  41. package/behaviors/lolo/spec/codec/lolo-source.fixtures/get-past-end.lolo +2 -1
  42. package/behaviors/lolo/spec/codec/lolo-source.fixtures/list-call.lolo +2 -1
  43. package/behaviors/lolo/spec/codec/lolo-source.fixtures/list-plain.lolo +2 -1
  44. package/behaviors/lolo/spec/codec/lolo-source.fixtures/minus-binary.lolo +2 -1
  45. package/behaviors/lolo/spec/codec/lolo-source.fixtures/minus-unary.lolo +2 -1
  46. package/behaviors/lolo/spec/codec/lolo-source.fixtures/nested-let.lolo +2 -1
  47. package/behaviors/lolo/spec/codec/lolo-source.fixtures/no-machine.lolo +2 -1
  48. package/behaviors/lolo/spec/codec/lolo-source.fixtures/no-template.lolo +2 -1
  49. package/behaviors/lolo/spec/codec/lolo-source.fixtures/nth-past-end.lolo +2 -1
  50. package/behaviors/lolo/spec/codec/lolo-source.fixtures/nth-raw.lolo +2 -1
  51. package/behaviors/lolo/spec/codec/lolo-source.fixtures/ports-call.lolo +2 -1
  52. package/behaviors/lolo/spec/codec/lolo-source.fixtures/range-one.lolo +2 -1
  53. package/behaviors/lolo/spec/codec/lolo-source.fixtures/range-two.lolo +2 -1
  54. package/behaviors/lolo/spec/codec/lolo-source.fixtures/router-trio.lolo +88 -0
  55. package/behaviors/lolo/spec/codec/lolo-source.fixtures/store-pair.lolo +62 -0
  56. package/behaviors/lolo/spec/codec/lolo-source.fixtures/string-literal.lolo +2 -1
  57. package/behaviors/lolo/spec/codec/lolo-source.gen/knobs.py +27 -1
  58. package/behaviors/lolo/spec/codec/lolo-source.gen/src_assemble.in +54 -2
  59. package/behaviors/lolo/spec/codec/lolo-source.gen/src_finish.in +1 -1
  60. package/behaviors/lolo/spec/codec/lolo-source.gen/src_fold.in +24 -4
  61. package/behaviors/lolo/spec/codec/lolo-source.gen/src_head.in +8 -3
  62. package/behaviors/lolo/spec/codec/lolo-source.gen/src_prepare.in +6 -2
  63. package/behaviors/lolo/spec/codec/lolo-source.gen/src_trait.in +12 -2
  64. package/behaviors/lolo/spec/codec/lolo-source.parity/agent-step.lolo +2 -1
  65. package/behaviors/lolo/spec/codec/lolo-source.parity/agent-step.server.lolo +1 -0
  66. package/behaviors/lolo/spec/codec/lolo-source.parity/chunk.lolo +2 -1
  67. package/behaviors/lolo/spec/codec/lolo-source.parity/chunk.server.lolo +1 -0
  68. package/behaviors/lolo/spec/codec/lolo-source.parity/compose-pair.events.json +36 -0
  69. package/behaviors/lolo/spec/codec/lolo-source.parity/compose-pair.replay.goldens.json +91 -0
  70. package/behaviors/lolo/spec/codec/lolo-source.parity/cosine.lolo +2 -1
  71. package/behaviors/lolo/spec/codec/lolo-source.parity/cosine.server.lolo +1 -0
  72. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/kotlin/compose-pair.kt +31 -0
  73. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/kotlin/router-trio.kt +31 -0
  74. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/kotlin/store-pair.kt +31 -0
  75. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/python/compose-pair.py +18 -0
  76. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/python/router-trio.py +18 -0
  77. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/python/store-pair.py +17 -0
  78. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/rust/compose-pair.rs +37 -0
  79. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/rust/router-trio.rs +37 -0
  80. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/rust/store-pair.rs +36 -0
  81. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/swift/compose-pair.swift +24 -0
  82. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/swift/router-trio.swift +24 -0
  83. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/swift/store-pair.swift +23 -0
  84. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/typescript/compose-pair.mts +24 -0
  85. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/typescript/router-trio.mts +24 -0
  86. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/typescript/store-pair.mts +22 -0
  87. package/behaviors/lolo/spec/codec/lolo-source.parity/recall-at-k.lolo +2 -1
  88. package/behaviors/lolo/spec/codec/lolo-source.parity/recall-at-k.server.lolo +1 -0
  89. package/behaviors/lolo/spec/codec/lolo-source.parity/router-trio.events.json +18 -0
  90. package/behaviors/lolo/spec/codec/lolo-source.parity/router-trio.replay.goldens.json +87 -0
  91. package/behaviors/lolo/spec/codec/lolo-source.parity/store-pair.events.json +58 -0
  92. package/behaviors/lolo/spec/codec/lolo-source.parity/store-pair.replay.goldens.json +238 -0
  93. package/behaviors/lolo/spec/codec/lolo-swift.replay.goldens.json +15599 -2204
  94. package/behaviors/lolo/spec/codec/lolo-typescript.replay.goldens.json +28930 -28929
  95. package/behaviors/lolo/spec/connect/bearer-api.replay.goldens.json +1 -1
  96. package/behaviors/lolo/spec/connect/esign.replay.goldens.json +3 -3
  97. package/behaviors/lolo/spec/connect/github.replay.goldens.json +13 -13
  98. package/behaviors/lolo/spec/connect/google-calendar.replay.goldens.json +2 -2
  99. package/behaviors/lolo/spec/connect/image.replay.goldens.json +1 -1
  100. package/behaviors/lolo/spec/connect/meta-ads.replay.goldens.json +2 -2
  101. package/behaviors/lolo/spec/connect/stdio-lines.replay.goldens.json +90 -0
  102. package/behaviors/lolo/spec/connect/twilio.replay.goldens.json +2 -2
  103. package/behaviors/lolo/spec/connect/youtube.replay.goldens.json +1 -1
  104. package/behaviors/lolo/spec/dev/guest-session.replay.goldens.json +824 -0
  105. package/behaviors/lolo/spec/dev/mock-seed-marks.replay.goldens.json +365 -0
  106. package/behaviors/lolo/spec/dev/verify-walk.replay.goldens.json +2 -1
  107. package/behaviors/lolo/spec/gpu/gpu-compute.replay.goldens.json +784 -0
  108. package/behaviors/lolo/spec/mem/mem-buffer.replay.goldens.json +97 -1
  109. package/behaviors/lolo/spec/ml/vector-write.goldens.json +1 -1
  110. package/behaviors/lolo/spec/ml/vector-write.replay.goldens.json +2 -2
  111. package/behaviors/lolo/spec/net/http-client-call-host.replay.goldens.json +3 -3
  112. package/behaviors/lolo/spec/net/http-client-env-host.replay.goldens.json +3 -3
  113. package/behaviors/lolo/spec/net/http-client.replay.goldens.json +56 -56
  114. package/behaviors/lolo/spec/net/http-fetch.replay.goldens.json +2 -2
  115. package/behaviors/lolo/spec/net/npm-lookup.replay.goldens.json +1 -1
  116. package/behaviors/lolo/spec/net/npm-registry.replay.goldens.json +2 -2
  117. package/behaviors/lolo/spec/net/server-declared-traits.replay.goldens.json +6 -3
  118. package/behaviors/lolo/spec/net/server-external-inputs.replay.goldens.json +16 -8
  119. package/behaviors/lolo/spec/net/server-retargeted-leg.replay.goldens.json +4 -2
  120. package/behaviors/lolo/spec/net/server-untargeted-discovery.replay.goldens.json +50 -45
  121. package/behaviors/lolo/spec/ops/llm-spend-board.replay.goldens.json +112 -16
  122. package/behaviors/lolo/spec/store/firestore-twin.replay.goldens.json +1 -1
  123. package/behaviors/lolo/spec/store/row-store-postgres.gen/record_real_sql.py +1 -1
  124. package/behaviors/lolo/spec/ui/game/fx-particles.replay.goldens.json +37 -0
  125. package/behaviors/lolo/ui/avl/atoms/std-avl-cosmic-zoom.lolo +2 -2
  126. package/behaviors/lolo/ui/game/atoms/std-fx-particles.lolo +10 -1
  127. package/behaviors/lolo/ui/game/atoms/ui-draw-fx-layer.lolo +4 -4
  128. package/behaviors/lolo/ui/game/organisms/std-arcade-board-3d.lolo +9 -9
  129. package/behaviors/lolo/ui/game/organisms/std-crew-board-2d.lolo +4 -4
  130. package/behaviors/lolo/ui/game/organisms/std-dungeon-board-2d.lolo +5 -5
  131. package/behaviors/lolo/ui/game/organisms/std-market-board-3d.lolo +9 -9
  132. package/behaviors/lolo/ui/game/organisms/std-objective-board-3d.lolo +9 -9
  133. package/behaviors/lolo/ui/game/organisms/std-platformer-board-2d.lolo +5 -5
  134. package/behaviors/lolo/ui/game/organisms/std-platformer-puzzle.lolo +4 -4
  135. package/behaviors/lolo/ui/game/organisms/std-survival-board-3d.lolo +9 -9
  136. package/behaviors/lolo/ui/game/organisms/std-tactics-board-2d.lolo +5 -5
  137. package/behaviors/lolo/ui/game/organisms/std-tactics-board-3d.lolo +9 -9
  138. package/behaviors/registry/auth/atoms/std-dev-personas.orb +1 -1
  139. package/behaviors/registry/cli/atoms/std-orb-goldens.orb +1 -1
  140. package/behaviors/registry/cli/atoms/std-orb-lint-mem-handles.orb +1 -1
  141. package/behaviors/registry/cli/atoms/std-orb-lint-os-grants.orb +1 -1
  142. package/behaviors/registry/cli/atoms/std-orb-mcp.orb +1 -1
  143. package/behaviors/registry/cli/atoms/std-orb-packages.orb +1 -1
  144. package/behaviors/registry/cli/atoms/std-orb-serve.orb +1 -1
  145. package/behaviors/registry/codec/atoms/std-lolo-kotlin.orb +1 -1
  146. package/behaviors/registry/codec/atoms/std-lolo-python.orb +1 -1
  147. package/behaviors/registry/codec/atoms/std-lolo-rust.orb +1 -1
  148. package/behaviors/registry/codec/atoms/std-lolo-source.orb +1 -1
  149. package/behaviors/registry/codec/atoms/std-lolo-swift.orb +1 -1
  150. package/behaviors/registry/codec/atoms/std-lolo-typescript.orb +1 -1
  151. package/behaviors/registry/connect/atoms/std-meta-ads.orb +1 -1
  152. package/behaviors/registry/connect/atoms/std-stdio-lines.orb +1 -1
  153. package/behaviors/registry/connect/atoms/std-youtube.orb +1 -1
  154. package/behaviors/registry/dev/atoms/std-guest-session.orb +1 -1
  155. package/behaviors/registry/dev/atoms/std-mock-seed-marks.orb +1 -0
  156. package/behaviors/registry/dev/organisms/std-behavior-playground.orb +37 -0
  157. package/behaviors/registry/dev/organisms/std-launchpad.orb +25 -0
  158. package/behaviors/registry/gpu/atoms/std-gpu-compute.orb +1 -0
  159. package/behaviors/registry/net/atoms/std-http-client.orb +1 -1
  160. package/behaviors/registry/net/atoms/std-http-fetch.orb +1 -1
  161. package/behaviors/registry/net/atoms/std-npm-lookup.orb +1 -1
  162. package/behaviors/registry/net/atoms/std-npm-registry.orb +1 -1
  163. package/behaviors/registry/spec/cli/lint-all.orb +1 -1
  164. package/behaviors/registry/spec/cli/orb-packages.orb +1 -1
  165. package/behaviors/registry/spec/codec/lolo-source.fixtures/compose-pair.orb +1 -0
  166. package/behaviors/registry/spec/codec/lolo-source.fixtures/config-read.orb +1 -1
  167. package/behaviors/registry/spec/codec/lolo-source.fixtures/divide-default.orb +1 -1
  168. package/behaviors/registry/spec/codec/lolo-source.fixtures/divide-plain.orb +1 -1
  169. package/behaviors/registry/spec/codec/lolo-source.fixtures/get-past-end.orb +1 -1
  170. package/behaviors/registry/spec/codec/lolo-source.fixtures/list-call.orb +1 -1
  171. package/behaviors/registry/spec/codec/lolo-source.fixtures/list-plain.orb +1 -1
  172. package/behaviors/registry/spec/codec/lolo-source.fixtures/minus-binary.orb +1 -1
  173. package/behaviors/registry/spec/codec/lolo-source.fixtures/minus-unary.orb +1 -1
  174. package/behaviors/registry/spec/codec/lolo-source.fixtures/nested-let.orb +1 -1
  175. package/behaviors/registry/spec/codec/lolo-source.fixtures/no-machine.orb +1 -1
  176. package/behaviors/registry/spec/codec/lolo-source.fixtures/no-template.orb +1 -1
  177. package/behaviors/registry/spec/codec/lolo-source.fixtures/nth-past-end.orb +1 -1
  178. package/behaviors/registry/spec/codec/lolo-source.fixtures/nth-raw.orb +1 -1
  179. package/behaviors/registry/spec/codec/lolo-source.fixtures/ports-call.orb +1 -1
  180. package/behaviors/registry/spec/codec/lolo-source.fixtures/range-one.orb +1 -1
  181. package/behaviors/registry/spec/codec/lolo-source.fixtures/range-two.orb +1 -1
  182. package/behaviors/registry/spec/codec/lolo-source.fixtures/router-trio.orb +1 -0
  183. package/behaviors/registry/spec/codec/lolo-source.fixtures/store-pair.orb +1 -0
  184. package/behaviors/registry/spec/codec/lolo-source.fixtures/string-literal.orb +1 -1
  185. package/behaviors/registry/spec/codec/lolo-source.parity/agent-step.orb +1 -1
  186. package/behaviors/registry/spec/codec/lolo-source.parity/agent-step.server.orb +1 -1
  187. package/behaviors/registry/spec/codec/lolo-source.parity/chunk.orb +1 -1
  188. package/behaviors/registry/spec/codec/lolo-source.parity/chunk.server.orb +1 -1
  189. package/behaviors/registry/spec/codec/lolo-source.parity/cosine.orb +1 -1
  190. package/behaviors/registry/spec/codec/lolo-source.parity/cosine.server.orb +1 -1
  191. package/behaviors/registry/spec/codec/lolo-source.parity/recall-at-k.orb +1 -1
  192. package/behaviors/registry/spec/codec/lolo-source.parity/recall-at-k.server.orb +1 -1
  193. package/behaviors/registry/ui/avl/atoms/std-avl-cosmic-zoom.orb +1 -1
  194. package/behaviors/registry/ui/game/atoms/std-fx-particles.orb +1 -1
  195. package/behaviors/registry/ui/game/atoms/ui-draw-fx-layer.orb +1 -1
  196. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +20 -13
  197. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +9 -5
  198. package/behaviors/registry/ui/game/organisms/std-dungeon-board-2d.orb +17 -7
  199. package/behaviors/registry/ui/game/organisms/std-market-board-3d.orb +19 -15
  200. package/behaviors/registry/ui/game/organisms/std-objective-board-3d.orb +15 -12
  201. package/behaviors/registry/ui/game/organisms/std-platformer-board-2d.orb +17 -7
  202. package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +4 -0
  203. package/behaviors/registry/ui/game/organisms/std-survival-board-3d.orb +15 -12
  204. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +13 -6
  205. package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +14 -12
  206. package/canonical-operators.json +1426 -103
  207. package/dist/{chunk-EK22WRB6.js → chunk-2UGHBVU2.js} +2 -2
  208. package/dist/{chunk-GDMH5T4J.js → chunk-3DK7GI2C.js} +2 -2
  209. package/dist/chunk-3MDASC5C.js +26 -0
  210. package/dist/{chunk-K5ZI27PB.js → chunk-3PHO4RRF.js} +1 -1
  211. package/dist/{chunk-7IEMMYM6.js → chunk-4MJCLAZW.js} +1 -1
  212. package/dist/{chunk-W4IEV4BY.js → chunk-55JPIL7A.js} +2 -2
  213. package/dist/{chunk-RUGBZTV3.js → chunk-66BLZLFI.js} +1 -1
  214. package/dist/{chunk-YWFISV7L.js → chunk-66RAJFOD.js} +1 -1
  215. package/dist/{chunk-JWOWWGNZ.js → chunk-6ED4SUC6.js} +1 -1
  216. package/dist/{chunk-LL7P6EII.js → chunk-6KFCHNE2.js} +2 -2
  217. package/dist/{chunk-GFBL2TW6.js → chunk-A4QB3Y6L.js} +1 -1
  218. package/dist/chunk-BVWMLS32.js +123 -0
  219. package/dist/{chunk-5KQCGSNC.js → chunk-CRKVDCY7.js} +1 -1
  220. package/dist/{chunk-WHQDLLC3.js → chunk-EKWEY4OJ.js} +1 -1
  221. package/dist/{chunk-Y3BRVNYK.js → chunk-EU22GCGV.js} +2 -2
  222. package/dist/{chunk-XQPYTDZ4.js → chunk-FB6PKNRS.js} +1 -1
  223. package/dist/{chunk-UX3MDFX6.js → chunk-FSVOJQLP.js} +1 -1
  224. package/dist/{chunk-LDBD2FBQ.js → chunk-GAKLBWBR.js} +1 -1
  225. package/dist/{chunk-C3IEMPRZ.js → chunk-GO3FKBV2.js} +2 -2
  226. package/dist/{chunk-LZSPEHSM.js → chunk-GPDTJHYY.js} +1 -1
  227. package/dist/{chunk-W5ABMOXU.js → chunk-JQBWLH5V.js} +1 -1
  228. package/dist/{chunk-63X6RNY6.js → chunk-KKW3JHTC.js} +1 -1
  229. package/dist/{chunk-5PLJE42Q.js → chunk-LF2EZVAM.js} +1 -1
  230. package/dist/{chunk-RXWBYWQB.js → chunk-LGCKOZP3.js} +2 -2
  231. package/dist/{chunk-JJEADYP7.js → chunk-LMZ6XJFB.js} +2 -2
  232. package/dist/{chunk-CWYSQZJU.js → chunk-M2YQNSAZ.js} +2 -2
  233. package/dist/{chunk-GNCKJV3P.js → chunk-MKWHYBIS.js} +1 -1
  234. package/dist/{chunk-ZB2CLGEG.js → chunk-MXBGYTYF.js} +1 -1
  235. package/dist/{chunk-UN76TRSK.js → chunk-NH6MXHZR.js} +41 -41
  236. package/dist/{chunk-II2VW7T6.js → chunk-ODBIX4DB.js} +1 -1
  237. package/dist/{chunk-3F3CNWOG.js → chunk-OYDQR6DT.js} +2 -2
  238. package/dist/{chunk-FVL6BT6L.js → chunk-PD6POR44.js} +1 -1
  239. package/dist/{chunk-U6USXZ5M.js → chunk-PHFT3QNS.js} +2 -2
  240. package/dist/{chunk-RJYKIZMS.js → chunk-PQZ6PVKG.js} +2 -2
  241. package/dist/{chunk-TQPQXCSZ.js → chunk-Q6NHXIOZ.js} +2 -2
  242. package/dist/{chunk-KYGWVCTM.js → chunk-QMDVYTB7.js} +1 -1
  243. package/dist/{chunk-XKTATY45.js → chunk-RW2KMSG5.js} +4 -4
  244. package/dist/{chunk-UHNSPTFT.js → chunk-SA2ZS24W.js} +1 -1
  245. package/dist/{chunk-6YPUQK36.js → chunk-SFWP4UMK.js} +2 -2
  246. package/dist/{chunk-ZZYLFHBU.js → chunk-TLNEQA4D.js} +1 -1
  247. package/dist/{chunk-RGTBRWWA.js → chunk-TOODE5AD.js} +2 -2
  248. package/dist/{chunk-QGWAHOFR.js → chunk-U57GY7SM.js} +2 -2
  249. package/dist/{chunk-FDJZKB7J.js → chunk-UIDQQJSX.js} +1 -1
  250. package/dist/{chunk-LLH3WXM3.js → chunk-UVFP2B7I.js} +1 -1
  251. package/dist/{chunk-4OF7727E.js → chunk-VEGZPCTZ.js} +2 -2
  252. package/dist/{chunk-73YUPNIT.js → chunk-VXN4V7LC.js} +1 -1
  253. package/dist/{chunk-4D3W6AAE.js → chunk-YHQVZWPG.js} +1 -1
  254. package/dist/{chunk-XXYBHYLM.js → chunk-YQO3TO66.js} +2 -2
  255. package/dist/{chunk-YZAYFR5A.js → chunk-ZSJ3GEOJ.js} +1 -1
  256. package/dist/index.d.ts +3 -3
  257. package/dist/index.js +50 -50
  258. package/dist/modules/anim.js +2 -2
  259. package/dist/modules/array.js +2 -2
  260. package/dist/modules/auth.js +3 -3
  261. package/dist/modules/behavior.js +2 -2
  262. package/dist/modules/bit.js +2 -2
  263. package/dist/modules/browser.js +2 -2
  264. package/dist/modules/bytes.js +2 -2
  265. package/dist/modules/codec.js +3 -3
  266. package/dist/modules/composition.js +2 -2
  267. package/dist/modules/core.js +2 -2
  268. package/dist/modules/csv.js +2 -2
  269. package/dist/modules/ffi.js +3 -3
  270. package/dist/modules/format.js +2 -2
  271. package/dist/modules/geo.js +2 -2
  272. package/dist/modules/gpu.d.ts +12 -0
  273. package/dist/modules/gpu.js +3 -0
  274. package/dist/modules/grid.js +2 -2
  275. package/dist/modules/i18n.js +2 -2
  276. package/dist/modules/index.d.ts +1 -2
  277. package/dist/modules/index.js +45 -46
  278. package/dist/modules/json.js +2 -2
  279. package/dist/modules/kernel.js +3 -3
  280. package/dist/modules/kv.js +3 -3
  281. package/dist/modules/llm.js +2 -2
  282. package/dist/modules/math.js +2 -2
  283. package/dist/modules/mem.js +3 -3
  284. package/dist/modules/object.js +2 -2
  285. package/dist/modules/os-common.d.ts +1 -1
  286. package/dist/modules/os-common.js +2 -2
  287. package/dist/modules/os-desktop.js +3 -3
  288. package/dist/modules/os-dev.js +3 -3
  289. package/dist/modules/os-dir.js +3 -3
  290. package/dist/modules/os-env-stdio.js +3 -3
  291. package/dist/modules/os-fs.js +3 -3
  292. package/dist/modules/os-net.js +3 -3
  293. package/dist/modules/os-path.js +3 -3
  294. package/dist/modules/os-process.js +3 -3
  295. package/dist/modules/os-sys.js +3 -3
  296. package/dist/modules/os-time-users.js +3 -3
  297. package/dist/modules/os.js +13 -13
  298. package/dist/modules/path.js +2 -2
  299. package/dist/modules/prob.js +2 -2
  300. package/dist/modules/program.js +2 -2
  301. package/dist/modules/session.js +2 -2
  302. package/dist/modules/str.js +2 -2
  303. package/dist/modules/time.js +2 -2
  304. package/dist/modules/validate.js +2 -2
  305. package/dist/modules/vector.js +2 -2
  306. package/dist/modules/workspace.js +2 -2
  307. package/dist/modules/xml.js +2 -2
  308. package/dist/modules/yaml.js +2 -2
  309. package/dist/registry.d.ts +2 -2
  310. package/dist/registry.js +49 -49
  311. package/dist/{types-BA4LkhNJ.d.ts → types-CgiGhK6t.d.ts} +17 -3
  312. package/package.json +5 -5
  313. package/dist/chunk-F5TP25JA.js +0 -26
  314. package/dist/chunk-NE4WSTN7.js +0 -26
  315. package/dist/modules/trace.d.ts +0 -15
  316. package/dist/modules/trace.js +0 -2
  317. /package/dist/{chunk-SHSBTDDX.js → chunk-QUQ33UXH.js} +0 -0
@@ -1 +1 @@
1
- {"typeContractVersion":1,"name":"std-lolo-typescript","version":"1.0.0","description":"std-lolo-typescript — renders .lolo source as TypeScript text, so a learner who reads an exercise written in .lolo can see the same program as strict TypeScript that type-checks and gives the kernel's answers. It is std-lolo-source with the TypeScript vocabulary in config and nothing else: LOLO_TO_TYPESCRIPT { source, path } answers TYPESCRIPT_RENDERED { text, warnings }, or TYPESCRIPT_RENDER_FAILED { error } when the source cannot be read or the request carries no absolute path (the types come from the kernel checker). Each trait becomes an exported class holding state, entity, ports and config, with one on<Event> method per event: an if / else if branch per transition (the from-state and the guard), the effects, then the new state; an emit records { event, payload } in emitted with the payload checked against the shell's generated payload type. The entity and payload types are imported from ../types/entities and ../types/events, the modules of the TypeScript shell's generated @app/shared package, so the file belongs in packages/shared/src/traits/. Kernel answers that are null (a division by zero, nth past the end, a missing key) come from small helper functions written once, and only the ones the output uses. Strings are measured and sliced by Unicode code points. object/get and json/parse are cast to the checker's type of the call (typeNames). An operator with no TypeScript template is a named warning and a stub that throws when run. persist, fetch, notify, navigate and call-service go through callPort on the injected ports object and each is listed in warnings; render-ui is a comment. See std-lolo-source for the config knobs and the type placeholders.","orbitals":[{"name":"LoloTypescriptOrbital","id":"orb_JSR3SPGRYDCF6TE57B4QBXFB1F","uses":[{"from":"almadar-std/lolo-typescript","as":"Spec"},{"from":"std/behaviors/std-lolo-source","as":"Src"}],"entity":{"name":"LoloTypescriptRun","id":"ent_X674T0QNSRTWWFP6JZB8HSS145","persistence":"runtime","fields":[{"nullable":false,"name":"id","type":"string","required":true}]},"traits":[{"ref":"Src.traits.LoloSource","id":"trt_Z6VDY40HE48Q2FYG1WG3MG3DVM","name":"LoloTypescript","config":{"language":{"type":"unknown","default":"TypeScript","wired":true},"requiresTypes":{"type":"unknown","default":true,"wired":true},"operators":{"type":"unknown","default":{"/":"_div({{0}}, {{1}})","%":"_mod({{0}}, {{1}})","math/mod":"_mod({{0}}, {{1}})","=":"_eq({{0}}, {{1}})","==":"_eq({{0}}, {{1}})","!=":"(!_eq({{0}}, {{1}}))","str/len":"[...{{0}}].length","str/upper":"{{0}}.toUpperCase()","str/lower":"{{0}}.toLowerCase()","str/trim":"{{0}}.trim()","str/trimStart":"{{0}}.trimStart()","str/trimEnd":"{{0}}.trimEnd()","str/capitalize":"_capitalize({{0}})","str/split":"_split({{0}}, {{1}})","str/join":"_join({{0}}, {{1}})","str/concat":"[{{*}}].map(_text).join('')","str/includes":"{{0}}.includes({{1}})","str/startsWith":"{{0}}.startsWith({{1}})","str/endsWith":"{{0}}.endsWith({{1}})","str/replace":"_replace({{0}}, {{1}}, {{2}})","str/replaceAll":"_replaceAll({{0}}, {{1}}, {{2}})","str/repeat":"_repeat({{0}}, {{1}})","str/reverse":"[...{{0}}].reverse().join('')","str/slice#2":"_strSlice({{0}}, {{1}})","str/slice#3":"_strSlice({{0}}, {{1}}, {{2}})","str/padStart#2":"_padStart({{0}}, {{1}})","str/padStart#3":"_padStart({{0}}, {{1}}, {{2}})","str/padEnd#2":"_padEnd({{0}}, {{1}})","str/padEnd#3":"_padEnd({{0}}, {{1}}, {{2}})","str/truncate#2":"_truncate({{0}}, {{1}})","str/truncate#3":"_truncate({{0}}, {{1}}, {{2}})","str/to-int":"_toInt({{0}})","array/len":"{{0}}.length","array/sum#2":"_sum({{0}}, {{1}})","array/avg#1":"_avg({{0}})","array/avg#2":"_avg({{0}}, {{1}})","array/max#1":"_amax({{0}})","array/max#2":"_amax({{0}}, {{1}})","array/min#1":"_amin({{0}})","array/min#2":"_amin({{0}}, {{1}})","array/first":"_first({{0}})","array/last":"_last({{0}})","array/nth":"_nth({{0}}, {{1}})","array/range#2":"_range({{0}}, {{1}})","array/range#3":"_range({{0}}, {{1}}, {{2}})","array/slice#2":"_slice({{0}}, {{1}})","array/slice#3":"_slice({{0}}, {{1}}, {{2}})","array/take":"_take({{0}}, {{1}})","array/drop":"_drop({{0}}, {{1}})","array/takeLast":"_takeLast({{0}}, {{1}})","array/dropLast":"_dropLast({{0}}, {{1}})","array/append":"[...{{0}}, {{1}}]","array/prepend":"[{{1}}, ...{{0}}]","array/includes":"_includes({{0}}, {{1}})","array/indexOf":"_indexOf({{0}}, {{1}})","array/reverse":"[...{{0}}].reverse()","array/unique":"_unique({{0}})","array/flatten":"{{0}}.flat()","array/zip":"_zip({{0}}, {{1}})","array/concat":"_concat({{*}})","array/sort#1":"_sort({{0}})","array/sort#2":"_sort({{0}}, {{1}})","array/sort#3":"_sort({{0}}, {{1}}, {{2}})","array/reduce":"{{0}}.reduce({{2}}, {{1}})","list":"[{{*}}]","object/get#2":"(_get({{0}}, {{1}}) as {{type}})","object/get#3":"(_get({{0}}, {{1}}, {{2}}) as {{type}})","object/has":"_has({{0}}, {{1}})","object/set":"(_set({{0}}, {{1}}, {{2}}) as {{type}})","object/keys":"Object.keys({{0}})","object/values":"Object.values({{0}})","object/entries":"Object.entries({{0}})","object/fromEntries":"(_fromEntries({{0}}) as {{type}})","object/merge":"(_merge({{*}}) as {{type}})","object/pick":"(_pick({{0}}, {{1}}) as {{type}})","object/omit":"(_omit({{0}}, {{1}}) as {{type}})","json/parse":"(_jsonParse({{0}}) as {{type}})","json/stringify#1":"JSON.stringify({{0}})","math/abs":"Math.abs({{0}})","math/max":"Math.max({{*}})","math/min":"Math.min({{*}})","math/round#1":"_round({{0}})","math/round#2":"_round({{0}}, {{1}})","math/sqrt":"_sqrt({{0}})","math/ln":"_ln({{0}})","math/log10":"_log10({{0}})","math/pow":"_pow({{0}}, {{1}})","math/sign":"Math.sign({{0}})","math/clamp":"_clamp({{0}}, {{1}}, {{2}})","default":"({{0}} ?? {{1}})","as":"{{0}}","validate/required":"_required({{0}})","validate/string":"(typeof {{0}} === 'string')","validate/number":"(typeof {{0}} === 'number')","validate/array":"Array.isArray({{0}})","validate/object":"_isObject({{0}})","validate/boolean":"(typeof {{0}} === 'boolean')","validate/length":"(_length({{0}}) === {{1}})","validate/minLength":"(_length({{0}}) >= {{1}})","validate/maxLength":"(_length({{0}}) <= {{1}})","validate/min":"({{0}} >= {{1}})","validate/max":"({{0}} <= {{1}})","validate/range":"({{1}} <= {{0}} && {{0}} <= {{2}})","validate/oneOf":"_includes({{1}}, {{0}})","validate/equals":"_eq({{0}}, {{1}})"},"wired":true},"unary":{"type":"unknown","default":{"-":"(-{{0}})","not":"(!{{0}})","array/range":"_range({{0}})","array/sum":"_sum({{0}})","array/count":"{{0}}.length","array/sort":"_sort({{0}})","json/stringify":"JSON.stringify({{0}})","math/round":"_round({{0}})","array/concat":"{{0}}","object/merge":"{{0}}"},"wired":true},"infix":{"type":"unknown","default":{"+":"+","-":"-","*":"*","<":"<","<=":"<=",">":">",">=":">=","and":"&&","or":"||"},"wired":true},"infixForm":{"type":"unknown","default":"({{*}})","wired":true},"lambdaOperators":{"type":"unknown","default":{"array/map":"{{src}}.map(({{vars}}) => ({{body}}))","array/filter":"{{src}}.filter(({{vars}}) => ({{body}}))","array/reject":"{{src}}.filter(({{vars}}) => !({{body}}))","array/some":"{{src}}.some(({{vars}}) => ({{body}}))","array/every":"{{src}}.every(({{vars}}) => ({{body}}))","array/count":"{{src}}.filter(({{vars}}) => ({{body}})).length","array/find":"_find({{src}}, ({{vars}}) => ({{body}}))","array/findIndex":"{{src}}.findIndex(({{vars}}) => ({{body}}))"},"wired":true},"lambdaForm":{"type":"unknown","default":"({{params}}) => ({{body}})","wired":true},"indexedSource":{"type":"unknown","default":"{{src}}","wired":true},"indexedVars":{"type":"unknown","default":"{{item}}, {{index}}","wired":true},"callees":{"type":"unknown","default":{"math/ceil":"Math.ceil","math/floor":"Math.floor","math/sin":"Math.sin","math/cos":"Math.cos","math/tan":"Math.tan","math/atan":"Math.atan","math/atan2":"Math.atan2","math/hypot":"Math.hypot"},"wired":true},"calleeForm":{"type":"unknown","default":"{{callee}}({{*}})","wired":true},"unsupportedForm":{"type":"unknown","default":"_unsupported({{op}})","wired":true},"unsupportedWarn":{"type":"unknown","default":"no {{language}} template for operator {{op}}","wired":true},"helpers":{"type":"unknown","default":{"/":["function _div(a: number, b: number): number | null {\n return b === 0 ? null : a / b;\n}"],"%":["function _mod(a: number, b: number): number | null {\n return b === 0 ? null : a % b;\n}"],"math/mod":["function _mod(a: number, b: number): number | null {\n return b === 0 ? null : a % b;\n}"],"=":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}"],"==":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}"],"!=":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}"],"str/split":["function _split(s: string, d: string): string[] {\n return d === '' ? [...s] : s.split(d);\n}"],"str/join":["function _text(v: string | number | boolean): string {\n return String(v);\n}","function _join(a: ReadonlyArray<string | number | boolean>, d: string): string {\n return a.map(_text).join(d);\n}"],"str/concat":["function _text(v: string | number | boolean): string {\n return String(v);\n}"],"str/replace":["function _replace(s: string, a: string, b: string): string {\n const i = s.indexOf(a);\n return i < 0 ? s : s.slice(0, i) + b + s.slice(i + a.length);\n}"],"str/replaceAll":["function _replaceAll(s: string, a: string, b: string): string {\n return a === '' ? b + [...s].map((c) => c + b).join('') : s.split(a).join(b);\n}"],"str/repeat":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _repeat(s: string, n: number): string {\n return s.repeat(_nat(n));\n}"],"str/capitalize":["function _capitalize(s: string): string {\n const cs = [...s];\n return (cs[0] ?? '').toUpperCase() + cs.slice(1).join('').toLowerCase();\n}"],"str/slice":["function _whole(n: number): number {\n if (!Number.isInteger(n)) throw new RangeError('expected a whole number, got ' + n);\n return n;\n}","function _strSlice(s: string, a: number, b?: number): string {\n _whole(a);\n if (b !== undefined) _whole(b);\n return [...s].slice(a, b).join('');\n}"],"str/padStart":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _padStart(s: string, n: number, p: string = ' '): string {\n if ([...p].length !== 1) throw new RangeError('expected a single padding character');\n const k = [...s].length;\n return k >= _nat(n) ? s : p.repeat(n - k) + s;\n}"],"str/padEnd":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _padEnd(s: string, n: number, p: string = ' '): string {\n if ([...p].length !== 1) throw new RangeError('expected a single padding character');\n const k = [...s].length;\n return k >= _nat(n) ? s : s + p.repeat(n - k);\n}"],"str/truncate":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _truncate(s: string, n: number, suffix: string = '...'): string {\n const cs = [...s];\n return cs.length <= _nat(n) ? s : cs.slice(0, n).join('') + suffix;\n}"],"str/to-int":["function _toInt(s: string): number | null {\n if (!/^[+-]?[0-9]+$/.test(s)) return null;\n const v = BigInt(s);\n return v >= -(2n ** 63n) && v < 2n ** 63n ? Number(v) : null;\n}"],"array/sum":["type Row = Readonly<Record<string, number>>;\n\nfunction _nums(a: ReadonlyArray<number | Row>, k?: string): number[] {\n const out: number[] = [];\n for (const x of a) {\n if (k === undefined) {\n if (typeof x !== 'number') throw new TypeError('expected number');\n out.push(x);\n } else if (typeof x !== 'number') {\n const v = x[k];\n if (v !== undefined) out.push(v);\n }\n }\n return out;\n}","function _sum(a: ReadonlyArray<number | Row>, k?: string): number {\n return _nums(a, k).reduce((x, y) => x + y, 0);\n}"],"array/avg":["type Row = Readonly<Record<string, number>>;\n\nfunction _nums(a: ReadonlyArray<number | Row>, k?: string): number[] {\n const out: number[] = [];\n for (const x of a) {\n if (k === undefined) {\n if (typeof x !== 'number') throw new TypeError('expected number');\n out.push(x);\n } else if (typeof x !== 'number') {\n const v = x[k];\n if (v !== undefined) out.push(v);\n }\n }\n return out;\n}","function _avg(a: ReadonlyArray<number | Row>, k?: string): number | null {\n const v = _nums(a, k);\n return v.length === 0 ? null : v.reduce((x, y) => x + y, 0) / v.length;\n}"],"array/max":["type Row = Readonly<Record<string, number>>;\n\nfunction _nums(a: ReadonlyArray<number | Row>, k?: string): number[] {\n const out: number[] = [];\n for (const x of a) {\n if (k === undefined) {\n if (typeof x !== 'number') throw new TypeError('expected number');\n out.push(x);\n } else if (typeof x !== 'number') {\n const v = x[k];\n if (v !== undefined) out.push(v);\n }\n }\n return out;\n}","function _amax(a: ReadonlyArray<number | Row>, k?: string): number | null {\n const v = _nums(a, k);\n return v.length === 0 ? null : Math.max(...v);\n}"],"array/min":["type Row = Readonly<Record<string, number>>;\n\nfunction _nums(a: ReadonlyArray<number | Row>, k?: string): number[] {\n const out: number[] = [];\n for (const x of a) {\n if (k === undefined) {\n if (typeof x !== 'number') throw new TypeError('expected number');\n out.push(x);\n } else if (typeof x !== 'number') {\n const v = x[k];\n if (v !== undefined) out.push(v);\n }\n }\n return out;\n}","function _amin(a: ReadonlyArray<number | Row>, k?: string): number | null {\n const v = _nums(a, k);\n return v.length === 0 ? null : Math.min(...v);\n}"],"array/first":["function _first<T>(a: readonly T[]): T | null {\n return a.length > 0 ? (a[0] as T) : null;\n}"],"array/last":["function _last<T>(a: readonly T[]): T | null {\n return a.length > 0 ? (a[a.length - 1] as T) : null;\n}"],"array/nth":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _nth<T>(a: readonly T[], i: number): T | null {\n return _nat(i) < a.length ? (a[i] as T) : null;\n}"],"array/range":["function _range(a: number, b?: number, step: number = 1): number[] {\n if (step === 0 || !Number.isFinite(step)) throw new RangeError('range: step 0 must be a non-zero finite number');\n const start = b === undefined ? 0 : a;\n const end = b === undefined ? a : b;\n const out: number[] = [];\n for (let x = start; step > 0 ? x < end : x > end; x += step) out.push(x);\n return out;\n}"],"array/slice":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _slice<T>(a: readonly T[], s: number, e?: number): T[] {\n _nat(s);\n if (e !== undefined) _nat(e);\n return a.slice(s, e);\n}"],"array/take":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _take<T>(a: readonly T[], n: number): T[] {\n return a.slice(0, _nat(n));\n}"],"array/drop":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _drop<T>(a: readonly T[], n: number): T[] {\n return a.slice(_nat(n));\n}"],"array/takeLast":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _takeLast<T>(a: readonly T[], n: number): T[] {\n return _nat(n) < a.length ? a.slice(a.length - n) : a.slice();\n}"],"array/dropLast":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _dropLast<T>(a: readonly T[], n: number): T[] {\n return _nat(n) < a.length ? a.slice(0, a.length - n) : [];\n}"],"array/includes":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}","function _includes(a: readonly Json[], x: Json): boolean {\n return a.some((y) => _eq(y, x));\n}"],"array/indexOf":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}","function _indexOf(a: readonly Json[], x: Json): number {\n return a.findIndex((y) => _eq(y, x));\n}"],"array/unique":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}","function _unique<T extends Json>(a: readonly T[]): T[] {\n const out: T[] = [];\n for (const x of a) if (!out.some((y) => _eq(y, x))) out.push(x);\n return out;\n}"],"array/zip":["function _zip<A, B>(a: readonly A[], b: readonly B[]): Array<[A, B]> {\n const n = Math.min(a.length, b.length);\n const out: Array<[A, B]> = [];\n for (let i = 0; i < n; i++) out.push([a[i] as A, b[i] as B]);\n return out;\n}"],"array/concat":["function _concat<T>(...parts: ReadonlyArray<readonly T[]>): T[] {\n return parts.flat();\n}"],"array/sort":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _cmp(a: Json | undefined, b: Json | undefined): number {\n const x = a ?? null;\n const y = b ?? null;\n if (x === null || y === null) return x === y ? 0 : x === null ? -1 : 1;\n if (typeof x === 'number' && typeof y === 'number') return x < y ? -1 : x > y ? 1 : 0;\n if (typeof x === 'string' && typeof y === 'string') {\n const p = [...x];\n const q = [...y];\n for (let i = 0; i < Math.min(p.length, q.length); i++) {\n const d = ((p[i] ?? '').codePointAt(0) ?? 0) - ((q[i] ?? '').codePointAt(0) ?? 0);\n if (d !== 0) return d < 0 ? -1 : 1;\n }\n return p.length < q.length ? -1 : p.length > q.length ? 1 : 0;\n }\n if (typeof x === 'boolean' && typeof y === 'boolean') return x === y ? 0 : x ? 1 : -1;\n if (typeof x === 'object' && typeof y === 'object') return 0;\n throw new TypeError('cannot compare these values');\n}","function _sort<T extends Json>(a: readonly T[], k?: string | null, o: string = 'asc'): T[] {\n const key = (x: T): Json | undefined => (k === undefined || k === null ? x : typeof x === 'object' && x !== null && !Array.isArray(x) ? x[k] : null);\n return [...a].sort((x, y) => (o === 'desc' ? _cmp(key(y), key(x)) : _cmp(key(x), key(y))));\n}"],"object/get":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _isObject(v: Json | undefined): v is { [k: string]: Json } {\n return v !== null && v !== undefined && typeof v === 'object' && !Array.isArray(v);\n}","function _path(p: string): string[] {\n const out: string[] = [];\n let cur = '';\n const cs = [...p];\n for (let i = 0; i < cs.length; i++) {\n const c = cs[i] ?? '';\n if (c === String.fromCharCode(92) && cs[i + 1] === '.') {\n cur += '.';\n i++;\n } else if (c === '.') {\n out.push(cur);\n cur = '';\n } else {\n cur += c;\n }\n }\n out.push(cur);\n return out;\n}","function _get(o: Json | undefined, p: string, d: Json = null): Json {\n let cur: Json | undefined = o;\n for (const s of _path(p)) {\n if (_isObject(cur)) {\n if (!Object.hasOwn(cur, s)) return d;\n cur = cur[s];\n } else if (Array.isArray(cur) && /^[0-9]+$/.test(s) && Number(s) < cur.length) {\n cur = cur[Number(s)];\n } else {\n return d;\n }\n }\n return cur ?? null;\n}"],"object/has":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _isObject(v: Json | undefined): v is { [k: string]: Json } {\n return v !== null && v !== undefined && typeof v === 'object' && !Array.isArray(v);\n}","function _path(p: string): string[] {\n const out: string[] = [];\n let cur = '';\n const cs = [...p];\n for (let i = 0; i < cs.length; i++) {\n const c = cs[i] ?? '';\n if (c === String.fromCharCode(92) && cs[i + 1] === '.') {\n cur += '.';\n i++;\n } else if (c === '.') {\n out.push(cur);\n cur = '';\n } else {\n cur += c;\n }\n }\n out.push(cur);\n return out;\n}","function _has(o: Json | undefined, p: string): boolean {\n let cur: Json | undefined = o;\n for (const s of _path(p)) {\n if (_isObject(cur)) {\n if (!Object.hasOwn(cur, s)) return false;\n cur = cur[s];\n } else if (Array.isArray(cur) && /^[0-9]+$/.test(s) && Number(s) < cur.length) {\n cur = cur[Number(s)];\n } else {\n return false;\n }\n }\n return true;\n}"],"object/set":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _isObject(v: Json | undefined): v is { [k: string]: Json } {\n return v !== null && v !== undefined && typeof v === 'object' && !Array.isArray(v);\n}","function _setPath(cur: Json | undefined, segs: readonly string[], v: Json): Json | undefined {\n const [head, ...rest] = segs;\n if (head === undefined) return v;\n if (cur === undefined) return { [head]: _setPath(undefined, rest, v) ?? null };\n if (_isObject(cur)) {\n const n = _setPath(Object.hasOwn(cur, head) ? cur[head] : undefined, rest, v);\n return n === undefined ? undefined : { ...cur, [head]: n };\n }\n if (Array.isArray(cur) && /^[0-9]+$/.test(head) && Number(head) < cur.length) {\n const n = _setPath(cur[Number(head)], rest, v);\n return n === undefined ? undefined : cur.map((x, i) => (i === Number(head) ? n : x));\n }\n return undefined;\n}","function _path(p: string): string[] {\n const out: string[] = [];\n let cur = '';\n const cs = [...p];\n for (let i = 0; i < cs.length; i++) {\n const c = cs[i] ?? '';\n if (c === String.fromCharCode(92) && cs[i + 1] === '.') {\n cur += '.';\n i++;\n } else if (c === '.') {\n out.push(cur);\n cur = '';\n } else {\n cur += c;\n }\n }\n out.push(cur);\n return out;\n}","function _set(o: { [k: string]: Json }, p: string, v: Json): Json | null {\n return _setPath(o, _path(p), v) ?? null;\n}"],"object/pick":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _pick(o: { [k: string]: Json }, ks: readonly string[]): { [k: string]: Json } {\n const out: { [k: string]: Json } = {};\n for (const k of ks) if (Object.hasOwn(o, k)) out[k] = o[k] ?? null;\n return out;\n}"],"object/omit":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _omit(o: { [k: string]: Json }, ks: readonly string[]): { [k: string]: Json } {\n const out: { [k: string]: Json } = {};\n for (const k of Object.keys(o)) if (!ks.includes(k)) out[k] = o[k] ?? null;\n return out;\n}"],"object/fromEntries":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _fromEntries(es: ReadonlyArray<readonly [string, Json]>): { [k: string]: Json } {\n return Object.fromEntries(es);\n}"],"json/parse":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _jsonParse(t: string): Json {\n try {\n return JSON.parse(t) as Json;\n } catch {\n return null;\n }\n}"],"math/round":["function _round(x: number, d: number = 0): number {\n const m = 10 ** d;\n const r = Math.floor(Math.abs(x) * m + 0.5) / m;\n return x < 0 ? -r : r;\n}"],"math/sqrt":["function _sqrt(x: number): number | null {\n return x < 0 ? null : Math.sqrt(x);\n}"],"math/ln":["function _ln(x: number): number | null {\n return x <= 0 ? null : Math.log(x);\n}"],"math/log10":["function _log10(x: number): number | null {\n return x <= 0 ? null : Math.log10(x);\n}"],"math/pow":["function _pow(a: number, b: number): number | null {\n const r = Math.pow(a, b);\n return Number.isFinite(r) ? r : null;\n}"],"math/clamp":["function _clamp(v: number, lo: number, hi: number): number {\n return Math.min(Math.max(v, lo), hi);\n}"],"validate/required":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _required(v: Json | undefined): boolean {\n return v !== null && v !== undefined && v !== '';\n}"],"validate/object":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _isObject(v: Json | undefined): v is { [k: string]: Json } {\n return v !== null && v !== undefined && typeof v === 'object' && !Array.isArray(v);\n}"],"validate/length":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _length(v: string | readonly Json[]): number {\n return typeof v === 'string' ? [...v].length : v.length;\n}"],"validate/minLength":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _length(v: string | readonly Json[]): number {\n return typeof v === 'string' ? [...v].length : v.length;\n}"],"validate/maxLength":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _length(v: string | readonly Json[]): number {\n return typeof v === 'string' ? [...v].length : v.length;\n}"],"validate/oneOf":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}","function _includes(a: readonly Json[], x: Json): boolean {\n return a.some((y) => _eq(y, x));\n}"],"validate/equals":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}"],"unsupported":["function _unsupported(name: string): never {\n throw new Error('no native template for operator ' + name);\n}"],"array/find":["function _find<T>(a: readonly T[], f: (x: T, i: number) => boolean): T | null {\n const i = a.findIndex(f);\n return i < 0 ? null : (a[i] as T);\n}"],"object/merge":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _merge(...os: Array<{ [k: string]: Json }>): { [k: string]: Json } {\n return Object.assign({}, ...os) as { [k: string]: Json };\n}"]},"wired":true},"helperGap":{"type":"unknown","default":"\n\n","wired":true},"imports":{"type":"unknown","default":{},"wired":true},"portEffects":{"type":"unknown","default":["list","persist","fetch","fetch-stream","notify","navigate","navigate-back","call-service","cancel-call","send-server","spawn","despawn","log"],"wired":true},"portCall":{"type":"unknown","default":"this.callPort(\"{{name}}\", {{*}})","wired":true},"portCase":{"type":"unknown","default":"lower","wired":true},"portWarn":{"type":"unknown","default":"{{op}} is called on the ports object","wired":true},"attributeRoots":{"type":"unknown","default":{"entity":"this.entity","state":"this.state","payload":"payload"},"wired":true},"itemRoots":{"type":"unknown","default":{"config":"this.config"},"wired":true},"attrAccess":{"type":"unknown","default":".{{name}}","wired":true},"itemAccess":{"type":"unknown","default":"[{{key}}]","wired":true},"indexAccess":{"type":"unknown","default":"[{{0}}]","wired":true},"localAccess":{"type":"unknown","default":"item","wired":true},"entityReadDefault":{"type":"unknown","default":"({{read}} ?? {{default}})","wired":true},"typeNames":{"type":"unknown","default":{"string":"string","string?":"string | null","[string]":"string[]","[string]?":"string[] | null","[string?]":"(string | null)[]","[[string]]":"string[][]","Map string string":"Record<string, string>","Map string string?":"Record<string, string> | null","Map string [string]":"Record<string, string[]>","number":"number","number?":"number | null","[number]":"number[]","[number]?":"number[] | null","[number?]":"(number | null)[]","[[number]]":"number[][]","Map string number":"Record<string, number>","Map string number?":"Record<string, number> | null","Map string [number]":"Record<string, number[]>","int":"number","int?":"number | null","[int]":"number[]","[int]?":"number[] | null","[int?]":"(number | null)[]","[[int]]":"number[][]","Map string int":"Record<string, number>","Map string int?":"Record<string, number> | null","Map string [int]":"Record<string, number[]>","float":"number","float?":"number | null","[float]":"number[]","[float]?":"number[] | null","[float?]":"(number | null)[]","[[float]]":"number[][]","Map string float":"Record<string, number>","Map string float?":"Record<string, number> | null","Map string [float]":"Record<string, number[]>","boolean":"boolean","boolean?":"boolean | null","[boolean]":"boolean[]","[boolean]?":"boolean[] | null","[boolean?]":"(boolean | null)[]","[[boolean]]":"boolean[][]","Map string boolean":"Record<string, boolean>","Map string boolean?":"Record<string, boolean> | null","Map string [boolean]":"Record<string, boolean[]>"},"wired":true},"typeUnknown":{"type":"unknown","default":"Json","wired":true},"nullLit":{"type":"unknown","default":"null","wired":true},"trueLit":{"type":"unknown","default":"true","wired":true},"falseLit":{"type":"unknown","default":"false","wired":true},"stringForm":{"type":"unknown","default":"{{json}}","wired":true},"listForm":{"type":"unknown","default":"[{{*}}]","wired":true},"mapOpen":{"type":"unknown","default":"{","wired":true},"mapClose":{"type":"unknown","default":"}","wired":true},"mapPair":{"type":"unknown","default":"{{key}}: {{value}}","wired":true},"mapSep":{"type":"unknown","default":", ","wired":true},"letStmt":{"type":"unknown","default":"const {{name}} = {{value}}","wired":true},"letExpr":{"type":"unknown","default":"(({{name}}) => ({{body}}))({{value}})","wired":true},"condExpr":{"type":"unknown","default":"({{cond}} ? {{then}} : {{else}})","wired":true},"ifOpen":{"type":"unknown","default":"if ({{cond}}) {","wired":true},"elseOpen":{"type":"unknown","default":"} else {","wired":true},"blockClose":{"type":"unknown","default":"}","wired":true},"emptyBody":{"type":"unknown","default":"","wired":true},"setStyle":{"type":"unknown","default":"assign","wired":true},"setAssign":{"type":"unknown","default":"{{target}} = {{value}}","wired":true},"emitForm":{"type":"unknown","default":"this.emit({{event}}, {{payload}})","wired":true},"voidPayload":{"type":"unknown","default":"{}","wired":true},"payloadType":{"type":"unknown","default":"{{trait}}{{event}}Payload","wired":true},"payloadCtor":{"type":"unknown","default":"({ {{fields}} } satisfies {{type}})","wired":true},"payloadField":{"type":"unknown","default":"{{name}}: {{value}}","wired":true},"payloadSep":{"type":"unknown","default":", ","wired":true},"commentForm":{"type":"unknown","default":"// {{text}}","wired":true},"indent":{"type":"unknown","default":" ","wired":true},"terminator":{"type":"unknown","default":";","wired":true},"classCase":{"type":"unknown","default":"keep","wired":true},"fieldCase":{"type":"unknown","default":"keep","wired":true},"localCase":{"type":"unknown","default":"keep","wired":true},"methodCase":{"type":"unknown","default":"pascal","wired":true},"methodName":{"type":"unknown","default":"on{{event}}","wired":true},"modelImports":{"type":"unknown","default":{"entity":"import type { EventPayload } from '@almadar/core';\nimport type { {{names}} } from '../types/entities';","payload":"import type { {{names}} } from '../types/events';"},"wired":true},"modelImportEach":{"type":"unknown","default":false,"wired":true},"modelImportSep":{"type":"unknown","default":", ","wired":true},"sectionGap":{"type":"unknown","default":"\n\n","wired":true},"classOpen":{"type":"unknown","default":"export class {{class}} {","wired":true},"classClose":{"type":"unknown","default":"}","wired":true},"classEmpty":{"type":"unknown","default":"","wired":true},"constructor":{"type":"unknown","default":["{{i}}state: string = {{initial}};","{{i}}entity: {{entity}};","{{i}}readonly ports: Record<string, (...args: EventPayload[string][]) => void>;","{{i}}readonly config = {{config}};","{{i}}readonly emitted: Array<{ event: string; payload: EventPayload }> = [];","","{{i}}constructor(entity: {{entity}}, ports: Record<string, (...args: EventPayload[string][]) => void> = {}, config: Partial<{{class}}['config']> = {}) {","{{i}}{{i}}this.entity = entity;","{{i}}{{i}}this.ports = ports;","{{i}}{{i}}this.config = { ...this.config, ...config };","{{i}}}"],"wired":true},"emitMethod":{"type":"unknown","default":["{{i}}emit(event: string, payload: EventPayload): void {","{{i}}{{i}}this.emitted.push({ event, payload });","{{i}}}","","{{i}}callPort(name: string, ...args: EventPayload[string][]): void {","{{i}}{{i}}const port = this.ports[name];","{{i}}{{i}}if (port === undefined) throw new Error('no port named ' + name);","{{i}}{{i}}port(...args);","{{i}}}"],"wired":true},"methodOpen":{"type":"unknown","default":"{{i}}{{method}}(payload: {{payloadType}}): void {","wired":true},"methodOpenPlain":{"type":"unknown","default":"{{i}}{{method}}(): void {","wired":true},"methodClose":{"type":"unknown","default":"{{i}}}","wired":true},"branchFirst":{"type":"unknown","default":"{{i}}{{i}}if ({{test}}) {","wired":true},"branchNext":{"type":"unknown","default":"{{i}}{{i}}} else if ({{test}}) {","wired":true},"branchClose":{"type":"unknown","default":"{{i}}{{i}}}","wired":true},"branchTest":{"type":"unknown","default":"{{stateTest}} && {{guard}}","wired":true},"branchTestPlain":{"type":"unknown","default":"{{stateTest}}","wired":true},"stateTest":{"type":"unknown","default":"this.state === {{state}}","wired":true},"stateAssign":{"type":"unknown","default":"this.state = {{state}}","wired":true},"bodyPrefix":{"type":"unknown","default":"{{i}}{{i}}{{i}}","wired":true},"renderModels":{"type":"unknown","default":false,"wired":true},"modelClassOpen":{"type":"unknown","default":"export interface {{name}} {","wired":true},"modelClassClose":{"type":"unknown","default":"}","wired":true},"modelField":{"type":"unknown","default":"{{i}}{{name}}: {{type}}{{default}};","wired":true},"modelAlias":{"type":"unknown","default":"export type {{name}} = {{type}};","wired":true},"typeMap":{"type":"unknown","default":{"string":"string","number":"number","float":"number","int":"number","integer":"number","boolean":"boolean","bool":"boolean","date":"string","datetime":"string","timestamp":"string","instant":"string","duration":"number","email":"string","url":"string","uuid":"string"},"wired":true},"typeList":{"type":"unknown","default":"{{0}}[]","wired":true},"typeListBare":{"type":"unknown","default":"Json[]","wired":true},"typeDict":{"type":"unknown","default":"Record<string, {{0}}>","wired":true},"typeDictBare":{"type":"unknown","default":"Record<string, Json>","wired":true},"typeLiteral":{"type":"unknown","default":"{{*}}","wired":true},"typeNullable":{"type":"unknown","default":"{{0}} | null","wired":true},"typeAny":{"type":"unknown","default":"Json","wired":true}},"events":{"LOLO_TO_SOURCE":"LOLO_TO_TYPESCRIPT","SOURCE_RENDERED":"TYPESCRIPT_RENDERED","SOURCE_RENDER_FAILED":"TYPESCRIPT_RENDER_FAILED"}}],"pages":[{"name":"LoloTypescriptStart","id":"pag_MKB4ZVVCEPP7BDBAZV5AYZTBKW","path":"","protocol":"boot","traits":[{"ref":"LoloTypescript","refId":"trt_Z6VDY40HE48Q2FYG1WG3MG3DVM"}]}]}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_X674T0QNSRTWWFP6JZB8HSS145":{"id":"ent_X674T0QNSRTWWFP6JZB8HSS145","kind":"entity","bakedName":"LoloTypescriptRun","curName":"LoloTypescriptRun","renames":[],"owner":"workspace"},"orb_JSR3SPGRYDCF6TE57B4QBXFB1F":{"id":"orb_JSR3SPGRYDCF6TE57B4QBXFB1F","kind":"orbital","bakedName":"LoloTypescriptOrbital","curName":"LoloTypescriptOrbital","renames":[],"owner":"workspace"},"pag_MKB4ZVVCEPP7BDBAZV5AYZTBKW":{"id":"pag_MKB4ZVVCEPP7BDBAZV5AYZTBKW","kind":"page","bakedName":"LoloTypescriptStart","curName":"LoloTypescriptStart","renames":[],"owner":"workspace"},"trt_Z6VDY40HE48Q2FYG1WG3MG3DVM":{"id":"trt_Z6VDY40HE48Q2FYG1WG3MG3DVM","kind":"trait","bakedName":"LoloTypescript","curName":"LoloTypescript","renames":[],"owner":"workspace"}}}}
1
+ {"typeContractVersion":1,"name":"std-lolo-typescript","version":"1.0.0","description":"std-lolo-typescript — renders .lolo source as TypeScript text, so a learner who reads an exercise written in .lolo can see the same program as strict TypeScript that type-checks and gives the kernel's answers. It is std-lolo-source with the TypeScript vocabulary in config and nothing else: LOLO_TO_TYPESCRIPT { source, path } answers TYPESCRIPT_RENDERED { text, warnings }, or TYPESCRIPT_RENDER_FAILED { error } when the source cannot be read or the request carries no absolute path (the types come from the kernel checker). Each trait becomes an exported class holding state, entity, ports and config, with one on<Event> method per event: an if / else if branch per transition (the from-state and the guard), the effects, then the new state; an emit records { event, payload } in emitted with the payload checked against the shell's generated payload type. The entity and payload types are imported from ../types/entities and ../types/events, the modules of the TypeScript shell's generated @app/shared package, so the file belongs in packages/shared/src/traits/. Kernel answers that are null (a division by zero, nth past the end, a missing key) come from small helper functions written once, and only the ones the output uses. Strings are measured and sliced by Unicode code points. object/get and json/parse are cast to the checker's type of the call (typeNames). An operator with no TypeScript template is a named warning and a stub that throws when run. persist, fetch, notify, navigate and call-service go through callPort on the injected ports object and each is listed in warnings; render-ui is a comment. See std-lolo-source for the config knobs and the type placeholders.","orbitals":[{"name":"LoloTypescriptOrbital","id":"orb_JSR3SPGRYDCF6TE57B4QBXFB1F","uses":[{"from":"almadar-std/lolo-typescript","as":"Spec"},{"from":"std/behaviors/std-lolo-source","as":"Src"}],"entity":{"name":"LoloTypescriptRun","id":"ent_X674T0QNSRTWWFP6JZB8HSS145","persistence":"runtime","fields":[{"nullable":false,"name":"id","type":"string","required":true}]},"traits":[{"ref":"Src.traits.LoloSource","id":"trt_Z6VDY40HE48Q2FYG1WG3MG3DVM","name":"LoloTypescript","config":{"language":{"type":"unknown","default":"TypeScript","wired":true},"requiresTypes":{"type":"unknown","default":true,"wired":true},"operators":{"type":"unknown","default":{"/":"_div({{0}}, {{1}})","%":"_mod({{0}}, {{1}})","math/mod":"_mod({{0}}, {{1}})","=":"_eq({{0}}, {{1}})","==":"_eq({{0}}, {{1}})","!=":"(!_eq({{0}}, {{1}}))","str/len":"[...{{0}}].length","str/upper":"{{0}}.toUpperCase()","str/lower":"{{0}}.toLowerCase()","str/trim":"{{0}}.trim()","str/trimStart":"{{0}}.trimStart()","str/trimEnd":"{{0}}.trimEnd()","str/capitalize":"_capitalize({{0}})","str/split":"_split({{0}}, {{1}})","str/join":"_join({{0}}, {{1}})","str/concat":"[{{*}}].map(_text).join('')","str/includes":"{{0}}.includes({{1}})","str/startsWith":"{{0}}.startsWith({{1}})","str/endsWith":"{{0}}.endsWith({{1}})","str/replace":"_replace({{0}}, {{1}}, {{2}})","str/replaceAll":"_replaceAll({{0}}, {{1}}, {{2}})","str/repeat":"_repeat({{0}}, {{1}})","str/reverse":"[...{{0}}].reverse().join('')","str/slice#2":"_strSlice({{0}}, {{1}})","str/slice#3":"_strSlice({{0}}, {{1}}, {{2}})","str/padStart#2":"_padStart({{0}}, {{1}})","str/padStart#3":"_padStart({{0}}, {{1}}, {{2}})","str/padEnd#2":"_padEnd({{0}}, {{1}})","str/padEnd#3":"_padEnd({{0}}, {{1}}, {{2}})","str/truncate#2":"_truncate({{0}}, {{1}})","str/truncate#3":"_truncate({{0}}, {{1}}, {{2}})","str/to-int":"_toInt({{0}})","array/len":"{{0}}.length","array/sum#2":"_sum({{0}}, {{1}})","array/avg#1":"_avg({{0}})","array/avg#2":"_avg({{0}}, {{1}})","array/max#1":"_amax({{0}})","array/max#2":"_amax({{0}}, {{1}})","array/min#1":"_amin({{0}})","array/min#2":"_amin({{0}}, {{1}})","array/first":"_first({{0}})","array/last":"_last({{0}})","array/nth":"_nth({{0}}, {{1}})","array/range#2":"_range({{0}}, {{1}})","array/range#3":"_range({{0}}, {{1}}, {{2}})","array/slice#2":"_slice({{0}}, {{1}})","array/slice#3":"_slice({{0}}, {{1}}, {{2}})","array/take":"_take({{0}}, {{1}})","array/drop":"_drop({{0}}, {{1}})","array/takeLast":"_takeLast({{0}}, {{1}})","array/dropLast":"_dropLast({{0}}, {{1}})","array/append":"[...{{0}}, {{1}}]","array/prepend":"[{{1}}, ...{{0}}]","array/includes":"_includes({{0}}, {{1}})","array/indexOf":"_indexOf({{0}}, {{1}})","array/reverse":"[...{{0}}].reverse()","array/unique":"_unique({{0}})","array/flatten":"{{0}}.flat()","array/zip":"_zip({{0}}, {{1}})","array/concat":"_concat({{*}})","array/sort#1":"_sort({{0}})","array/sort#2":"_sort({{0}}, {{1}})","array/sort#3":"_sort({{0}}, {{1}}, {{2}})","array/reduce":"{{0}}.reduce({{2}}, {{1}})","list":"[{{*}}]","object/get#2":"(_get({{0}}, {{1}}) as {{type}})","object/get#3":"(_get({{0}}, {{1}}, {{2}}) as {{type}})","object/has":"_has({{0}}, {{1}})","object/set":"(_set({{0}}, {{1}}, {{2}}) as {{type}})","object/keys":"Object.keys({{0}})","object/values":"Object.values({{0}})","object/entries":"Object.entries({{0}})","object/fromEntries":"(_fromEntries({{0}}) as {{type}})","object/merge":"(_merge({{*}}) as {{type}})","object/pick":"(_pick({{0}}, {{1}}) as {{type}})","object/omit":"(_omit({{0}}, {{1}}) as {{type}})","json/parse":"(_jsonParse({{0}}) as {{type}})","json/stringify#1":"JSON.stringify({{0}})","math/abs":"Math.abs({{0}})","math/max":"Math.max({{*}})","math/min":"Math.min({{*}})","math/round#1":"_round({{0}})","math/round#2":"_round({{0}}, {{1}})","math/sqrt":"_sqrt({{0}})","math/ln":"_ln({{0}})","math/log10":"_log10({{0}})","math/pow":"_pow({{0}}, {{1}})","math/sign":"Math.sign({{0}})","math/clamp":"_clamp({{0}}, {{1}}, {{2}})","default":"({{0}} ?? {{1}})","as":"{{0}}","validate/required":"_required({{0}})","validate/string":"(typeof {{0}} === 'string')","validate/number":"(typeof {{0}} === 'number')","validate/array":"Array.isArray({{0}})","validate/object":"_isObject({{0}})","validate/boolean":"(typeof {{0}} === 'boolean')","validate/length":"(_length({{0}}) === {{1}})","validate/minLength":"(_length({{0}}) >= {{1}})","validate/maxLength":"(_length({{0}}) <= {{1}})","validate/min":"({{0}} >= {{1}})","validate/max":"({{0}} <= {{1}})","validate/range":"({{1}} <= {{0}} && {{0}} <= {{2}})","validate/oneOf":"_includes({{1}}, {{0}})","validate/equals":"_eq({{0}}, {{1}})"},"wired":true},"unary":{"type":"unknown","default":{"-":"(-{{0}})","not":"(!{{0}})","array/range":"_range({{0}})","array/sum":"_sum({{0}})","array/count":"{{0}}.length","array/sort":"_sort({{0}})","json/stringify":"JSON.stringify({{0}})","math/round":"_round({{0}})","array/concat":"{{0}}","object/merge":"{{0}}"},"wired":true},"infix":{"type":"unknown","default":{"+":"+","-":"-","*":"*","<":"<","<=":"<=",">":">",">=":">=","and":"&&","or":"||"},"wired":true},"infixForm":{"type":"unknown","default":"({{*}})","wired":true},"lambdaOperators":{"type":"unknown","default":{"array/map":"{{src}}.map(({{vars}}) => ({{body}}))","array/filter":"{{src}}.filter(({{vars}}) => ({{body}}))","array/reject":"{{src}}.filter(({{vars}}) => !({{body}}))","array/some":"{{src}}.some(({{vars}}) => ({{body}}))","array/every":"{{src}}.every(({{vars}}) => ({{body}}))","array/count":"{{src}}.filter(({{vars}}) => ({{body}})).length","array/find":"_find({{src}}, ({{vars}}) => ({{body}}))","array/findIndex":"{{src}}.findIndex(({{vars}}) => ({{body}}))"},"wired":true},"lambdaForm":{"type":"unknown","default":"({{params}}) => ({{body}})","wired":true},"indexedSource":{"type":"unknown","default":"{{src}}","wired":true},"indexedVars":{"type":"unknown","default":"{{item}}, {{index}}","wired":true},"callees":{"type":"unknown","default":{"math/ceil":"Math.ceil","math/floor":"Math.floor","math/sin":"Math.sin","math/cos":"Math.cos","math/tan":"Math.tan","math/atan":"Math.atan","math/atan2":"Math.atan2","math/hypot":"Math.hypot"},"wired":true},"calleeForm":{"type":"unknown","default":"{{callee}}({{*}})","wired":true},"unsupportedForm":{"type":"unknown","default":"_unsupported({{op}})","wired":true},"unsupportedWarn":{"type":"unknown","default":"no {{language}} template for operator {{op}}","wired":true},"helpers":{"type":"unknown","default":{"payload":["function _opt<T extends {} | null>(v: T): T;\nfunction _opt<T extends {} | null>(v: T | undefined): T | null;\nfunction _opt<T>(v: T | undefined): T | null {\n return v === undefined ? null : v;\n}"],"store":["export interface Answer {\n ok: boolean;\n payload: EventPayload;\n}\nexport interface Store {\n persist(op: string, entity: string, data: EventPayload | string): Answer;\n fetch(entity: string, keep: ((row: EventPayload) => boolean) | null): Answer;\n}\nfunction _order(a: EventPayload, b: EventPayload): number {\n const sa = a['createdAt'];\n const sb = b['createdAt'];\n const ha = sa !== undefined && sa !== null;\n const hb = sb !== undefined && sb !== null;\n if (ha !== hb) return ha ? -1 : 1;\n if (typeof sa === 'number' && typeof sb === 'number' && sa !== sb) return sa < sb ? -1 : 1;\n if (typeof sa === 'string' && typeof sb === 'string' && sa !== sb) return sa < sb ? -1 : 1;\n const ia = String(a['id']);\n const ib = String(b['id']);\n return ia < ib ? -1 : ia > ib ? 1 : 0;\n}\nexport class MemoryStore implements Store {\n readonly tables: Record<string, Map<string, EventPayload>> = {};\n minted = 0;\n\n private table(entity: string): Map<string, EventPayload> {\n const t = this.tables[entity] ?? new Map<string, EventPayload>();\n this.tables[entity] = t;\n return t;\n }\n\n persist(op: string, entity: string, data: EventPayload | string): Answer {\n const rows = this.table(entity);\n if (op === 'create' && typeof data !== 'string') {\n const row: EventPayload = { ...data };\n const given = row['id'];\n const id = typeof given === 'string' && given !== '' ? given : entity + '-' + String((this.minted += 1));\n row['id'] = id;\n rows.set(id, row);\n return { ok: true, payload: { ...row } };\n }\n const key = typeof data === 'string' ? data : String(data['id'] ?? '');\n const found = rows.get(key);\n if (found === undefined) return { ok: false, payload: { error: entity + ' ' + key + ' not found', code: 'not-found' } };\n if (op === 'delete') {\n rows.delete(key);\n return { ok: true, payload: { id: key, deleted: true } };\n }\n const next: EventPayload = typeof data === 'string' ? { ...found } : { ...found, ...data };\n rows.set(key, next);\n return { ok: true, payload: { ...next } };\n }\n\n fetch(entity: string, keep: ((row: EventPayload) => boolean) | null): Answer {\n const rows = [...this.table(entity).values()].filter((r) => keep === null || keep({ ...r })).map((r) => ({ ...r }));\n rows.sort(_order);\n return { ok: true, payload: { data: rows, totalCount: rows.length } };\n }\n}"],"router":["type _Guard = (payload: EventPayload) => boolean;\ntype _Map = (payload: EventPayload) => EventPayload;\ninterface _Routed {\n readonly state: string;\n readonly entity: object;\n readonly emitted: ReadonlyArray<{ event: string; payload: EventPayload; completion?: boolean }>;\n}\ninterface _Item {\n trait: string;\n event: string;\n payload: EventPayload;\n source: EventPayload;\n guard: _Guard | null;\n fans: boolean;\n completion: boolean;\n}\nfunction _decode<T extends EventPayload>(payload: EventPayload): T {\n return payload as T;\n}\nfunction _canon(value: object): string {\n return JSON.stringify(value, (_key: string, v: object | null) =>\n v !== null && typeof v === 'object' && !Array.isArray(v)\n ? Object.fromEntries(Object.entries(v).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)))\n : v,\n );\n}\nabstract class _Router {\n readonly traits: Record<string, _Routed> = {};\n readonly handles: Record<string, Record<string, string[]>> = {};\n readonly rows: Array<{ source: string; event: string; target: string; trigger: string; guard: _Guard | null; mapping: _Map | null }> = [];\n readonly log: Array<{ trait: string; event: string; payload: EventPayload }> = [];\n\n add(key: string, trait: _Routed): void {\n this.traits[key] = trait;\n }\n\n row(source: string, event: string, target: string, trigger: string, guard: _Guard | null, mapping: _Map | null): void {\n this.rows.push({ source, event, target, trigger, guard, mapping });\n }\n\n abstract deliver(target: string, event: string, payload: EventPayload): void;\n\n targets(source: string, event: string, payload: EventPayload, completion: boolean): _Item[] {\n return this.rows\n .filter((r) => r.source === source && r.event === event)\n .map((r) => ({ trait: r.target, event: r.trigger, payload: r.mapping ? r.mapping(payload) : payload, source: payload, guard: r.guard, fans: false, completion }));\n }\n\n dispatch(trait: string, event: string, payload: EventPayload): void {\n const queue: _Item[] = [{ trait, event, payload, source: payload, guard: null, fans: true, completion: false }];\n const seen = new Set<string>();\n let steps = 0;\n for (let item = queue.shift(); item !== undefined; item = queue.shift()) {\n const t = this.traits[item.trait];\n if (t === undefined) continue;\n const key = _canon([item.trait, item.event, t.state, item.payload, t.entity]);\n if (!item.completion && seen.has(key)) continue;\n if (item.guard !== null && !item.guard(item.source)) continue;\n if (steps >= 2000) break;\n steps += 1;\n seen.add(key);\n const n = t.emitted.length;\n this.deliver(item.trait, item.event, item.payload);\n const own: _Item[] = [];\n const fanned: _Item[] = item.fans ? this.targets(item.trait, item.event, item.payload, false) : [];\n for (const e of t.emitted.slice(n)) {\n this.log.push({ trait: item.trait, event: e.event, payload: e.payload });\n if ((this.handles[item.trait]?.[t.state] ?? []).includes(e.event)) {\n own.push({ trait: item.trait, event: e.event, payload: e.payload, source: e.payload, guard: null, fans: false, completion: e.completion === true });\n }\n fanned.push(...this.targets(item.trait, e.event, e.payload, e.completion === true));\n }\n queue.unshift(...own);\n queue.push(...fanned);\n }\n }\n}"],"/":["function _div(a: number, b: number): number | null {\n return b === 0 ? null : a / b;\n}"],"%":["function _mod(a: number, b: number): number | null {\n return b === 0 ? null : a % b;\n}"],"math/mod":["function _mod(a: number, b: number): number | null {\n return b === 0 ? null : a % b;\n}"],"=":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}"],"==":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}"],"!=":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}"],"str/split":["function _split(s: string, d: string): string[] {\n return d === '' ? [...s] : s.split(d);\n}"],"str/join":["function _text(v: string | number | boolean): string {\n return String(v);\n}","function _join(a: ReadonlyArray<string | number | boolean>, d: string): string {\n return a.map(_text).join(d);\n}"],"str/concat":["function _text(v: string | number | boolean): string {\n return String(v);\n}"],"str/replace":["function _replace(s: string, a: string, b: string): string {\n const i = s.indexOf(a);\n return i < 0 ? s : s.slice(0, i) + b + s.slice(i + a.length);\n}"],"str/replaceAll":["function _replaceAll(s: string, a: string, b: string): string {\n return a === '' ? b + [...s].map((c) => c + b).join('') : s.split(a).join(b);\n}"],"str/repeat":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _repeat(s: string, n: number): string {\n return s.repeat(_nat(n));\n}"],"str/capitalize":["function _capitalize(s: string): string {\n const cs = [...s];\n return (cs[0] ?? '').toUpperCase() + cs.slice(1).join('').toLowerCase();\n}"],"str/slice":["function _whole(n: number): number {\n if (!Number.isInteger(n)) throw new RangeError('expected a whole number, got ' + n);\n return n;\n}","function _strSlice(s: string, a: number, b?: number): string {\n _whole(a);\n if (b !== undefined) _whole(b);\n return [...s].slice(a, b).join('');\n}"],"str/padStart":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _padStart(s: string, n: number, p: string = ' '): string {\n if ([...p].length !== 1) throw new RangeError('expected a single padding character');\n const k = [...s].length;\n return k >= _nat(n) ? s : p.repeat(n - k) + s;\n}"],"str/padEnd":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _padEnd(s: string, n: number, p: string = ' '): string {\n if ([...p].length !== 1) throw new RangeError('expected a single padding character');\n const k = [...s].length;\n return k >= _nat(n) ? s : s + p.repeat(n - k);\n}"],"str/truncate":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _truncate(s: string, n: number, suffix: string = '...'): string {\n const cs = [...s];\n return cs.length <= _nat(n) ? s : cs.slice(0, n).join('') + suffix;\n}"],"str/to-int":["function _toInt(s: string): number | null {\n if (!/^[+-]?[0-9]+$/.test(s)) return null;\n const v = BigInt(s);\n return v >= -(2n ** 63n) && v < 2n ** 63n ? Number(v) : null;\n}"],"array/sum":["type Row = Readonly<Record<string, number>>;\n\nfunction _nums(a: ReadonlyArray<number | Row>, k?: string): number[] {\n const out: number[] = [];\n for (const x of a) {\n if (k === undefined) {\n if (typeof x !== 'number') throw new TypeError('expected number');\n out.push(x);\n } else if (typeof x !== 'number') {\n const v = x[k];\n if (v !== undefined) out.push(v);\n }\n }\n return out;\n}","function _sum(a: ReadonlyArray<number | Row>, k?: string): number {\n return _nums(a, k).reduce((x, y) => x + y, 0);\n}"],"array/avg":["type Row = Readonly<Record<string, number>>;\n\nfunction _nums(a: ReadonlyArray<number | Row>, k?: string): number[] {\n const out: number[] = [];\n for (const x of a) {\n if (k === undefined) {\n if (typeof x !== 'number') throw new TypeError('expected number');\n out.push(x);\n } else if (typeof x !== 'number') {\n const v = x[k];\n if (v !== undefined) out.push(v);\n }\n }\n return out;\n}","function _avg(a: ReadonlyArray<number | Row>, k?: string): number | null {\n const v = _nums(a, k);\n return v.length === 0 ? null : v.reduce((x, y) => x + y, 0) / v.length;\n}"],"array/max":["type Row = Readonly<Record<string, number>>;\n\nfunction _nums(a: ReadonlyArray<number | Row>, k?: string): number[] {\n const out: number[] = [];\n for (const x of a) {\n if (k === undefined) {\n if (typeof x !== 'number') throw new TypeError('expected number');\n out.push(x);\n } else if (typeof x !== 'number') {\n const v = x[k];\n if (v !== undefined) out.push(v);\n }\n }\n return out;\n}","function _amax(a: ReadonlyArray<number | Row>, k?: string): number | null {\n const v = _nums(a, k);\n return v.length === 0 ? null : Math.max(...v);\n}"],"array/min":["type Row = Readonly<Record<string, number>>;\n\nfunction _nums(a: ReadonlyArray<number | Row>, k?: string): number[] {\n const out: number[] = [];\n for (const x of a) {\n if (k === undefined) {\n if (typeof x !== 'number') throw new TypeError('expected number');\n out.push(x);\n } else if (typeof x !== 'number') {\n const v = x[k];\n if (v !== undefined) out.push(v);\n }\n }\n return out;\n}","function _amin(a: ReadonlyArray<number | Row>, k?: string): number | null {\n const v = _nums(a, k);\n return v.length === 0 ? null : Math.min(...v);\n}"],"array/first":["function _first<T>(a: readonly T[]): T | null {\n return a.length > 0 ? (a[0] as T) : null;\n}"],"array/last":["function _last<T>(a: readonly T[]): T | null {\n return a.length > 0 ? (a[a.length - 1] as T) : null;\n}"],"array/nth":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _nth<T>(a: readonly T[], i: number): T | null {\n return _nat(i) < a.length ? (a[i] as T) : null;\n}"],"array/range":["function _range(a: number, b?: number, step: number = 1): number[] {\n if (step === 0 || !Number.isFinite(step)) throw new RangeError('range: step 0 must be a non-zero finite number');\n const start = b === undefined ? 0 : a;\n const end = b === undefined ? a : b;\n const out: number[] = [];\n for (let x = start; step > 0 ? x < end : x > end; x += step) out.push(x);\n return out;\n}"],"array/slice":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _slice<T>(a: readonly T[], s: number, e?: number): T[] {\n _nat(s);\n if (e !== undefined) _nat(e);\n return a.slice(s, e);\n}"],"array/take":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _take<T>(a: readonly T[], n: number): T[] {\n return a.slice(0, _nat(n));\n}"],"array/drop":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _drop<T>(a: readonly T[], n: number): T[] {\n return a.slice(_nat(n));\n}"],"array/takeLast":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _takeLast<T>(a: readonly T[], n: number): T[] {\n return _nat(n) < a.length ? a.slice(a.length - n) : a.slice();\n}"],"array/dropLast":["function _nat(n: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('expected a whole number from 0, got ' + n);\n return n;\n}","function _dropLast<T>(a: readonly T[], n: number): T[] {\n return _nat(n) < a.length ? a.slice(0, a.length - n) : [];\n}"],"array/includes":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}","function _includes(a: readonly Json[], x: Json): boolean {\n return a.some((y) => _eq(y, x));\n}"],"array/indexOf":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}","function _indexOf(a: readonly Json[], x: Json): number {\n return a.findIndex((y) => _eq(y, x));\n}"],"array/unique":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}","function _unique<T extends Json>(a: readonly T[]): T[] {\n const out: T[] = [];\n for (const x of a) if (!out.some((y) => _eq(y, x))) out.push(x);\n return out;\n}"],"array/zip":["function _zip<A, B>(a: readonly A[], b: readonly B[]): Array<[A, B]> {\n const n = Math.min(a.length, b.length);\n const out: Array<[A, B]> = [];\n for (let i = 0; i < n; i++) out.push([a[i] as A, b[i] as B]);\n return out;\n}"],"array/concat":["function _concat<T>(...parts: ReadonlyArray<readonly T[]>): T[] {\n return parts.flat();\n}"],"array/sort":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _cmp(a: Json | undefined, b: Json | undefined): number {\n const x = a ?? null;\n const y = b ?? null;\n if (x === null || y === null) return x === y ? 0 : x === null ? -1 : 1;\n if (typeof x === 'number' && typeof y === 'number') return x < y ? -1 : x > y ? 1 : 0;\n if (typeof x === 'string' && typeof y === 'string') {\n const p = [...x];\n const q = [...y];\n for (let i = 0; i < Math.min(p.length, q.length); i++) {\n const d = ((p[i] ?? '').codePointAt(0) ?? 0) - ((q[i] ?? '').codePointAt(0) ?? 0);\n if (d !== 0) return d < 0 ? -1 : 1;\n }\n return p.length < q.length ? -1 : p.length > q.length ? 1 : 0;\n }\n if (typeof x === 'boolean' && typeof y === 'boolean') return x === y ? 0 : x ? 1 : -1;\n if (typeof x === 'object' && typeof y === 'object') return 0;\n throw new TypeError('cannot compare these values');\n}","function _sort<T extends Json>(a: readonly T[], k?: string | null, o: string = 'asc'): T[] {\n const key = (x: T): Json | undefined => (k === undefined || k === null ? x : typeof x === 'object' && x !== null && !Array.isArray(x) ? x[k] : null);\n return [...a].sort((x, y) => (o === 'desc' ? _cmp(key(y), key(x)) : _cmp(key(x), key(y))));\n}"],"object/get":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _isObject(v: Json | undefined): v is { [k: string]: Json } {\n return v !== null && v !== undefined && typeof v === 'object' && !Array.isArray(v);\n}","function _path(p: string): string[] {\n const out: string[] = [];\n let cur = '';\n const cs = [...p];\n for (let i = 0; i < cs.length; i++) {\n const c = cs[i] ?? '';\n if (c === String.fromCharCode(92) && cs[i + 1] === '.') {\n cur += '.';\n i++;\n } else if (c === '.') {\n out.push(cur);\n cur = '';\n } else {\n cur += c;\n }\n }\n out.push(cur);\n return out;\n}","function _get(o: Json | undefined, p: string, d: Json = null): Json {\n let cur: Json | undefined = o;\n for (const s of _path(p)) {\n if (_isObject(cur)) {\n if (!Object.hasOwn(cur, s)) return d;\n cur = cur[s];\n } else if (Array.isArray(cur) && /^[0-9]+$/.test(s) && Number(s) < cur.length) {\n cur = cur[Number(s)];\n } else {\n return d;\n }\n }\n return cur ?? null;\n}"],"object/has":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _isObject(v: Json | undefined): v is { [k: string]: Json } {\n return v !== null && v !== undefined && typeof v === 'object' && !Array.isArray(v);\n}","function _path(p: string): string[] {\n const out: string[] = [];\n let cur = '';\n const cs = [...p];\n for (let i = 0; i < cs.length; i++) {\n const c = cs[i] ?? '';\n if (c === String.fromCharCode(92) && cs[i + 1] === '.') {\n cur += '.';\n i++;\n } else if (c === '.') {\n out.push(cur);\n cur = '';\n } else {\n cur += c;\n }\n }\n out.push(cur);\n return out;\n}","function _has(o: Json | undefined, p: string): boolean {\n let cur: Json | undefined = o;\n for (const s of _path(p)) {\n if (_isObject(cur)) {\n if (!Object.hasOwn(cur, s)) return false;\n cur = cur[s];\n } else if (Array.isArray(cur) && /^[0-9]+$/.test(s) && Number(s) < cur.length) {\n cur = cur[Number(s)];\n } else {\n return false;\n }\n }\n return true;\n}"],"object/set":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _isObject(v: Json | undefined): v is { [k: string]: Json } {\n return v !== null && v !== undefined && typeof v === 'object' && !Array.isArray(v);\n}","function _setPath(cur: Json | undefined, segs: readonly string[], v: Json): Json | undefined {\n const [head, ...rest] = segs;\n if (head === undefined) return v;\n if (cur === undefined) return { [head]: _setPath(undefined, rest, v) ?? null };\n if (_isObject(cur)) {\n const n = _setPath(Object.hasOwn(cur, head) ? cur[head] : undefined, rest, v);\n return n === undefined ? undefined : { ...cur, [head]: n };\n }\n if (Array.isArray(cur) && /^[0-9]+$/.test(head) && Number(head) < cur.length) {\n const n = _setPath(cur[Number(head)], rest, v);\n return n === undefined ? undefined : cur.map((x, i) => (i === Number(head) ? n : x));\n }\n return undefined;\n}","function _path(p: string): string[] {\n const out: string[] = [];\n let cur = '';\n const cs = [...p];\n for (let i = 0; i < cs.length; i++) {\n const c = cs[i] ?? '';\n if (c === String.fromCharCode(92) && cs[i + 1] === '.') {\n cur += '.';\n i++;\n } else if (c === '.') {\n out.push(cur);\n cur = '';\n } else {\n cur += c;\n }\n }\n out.push(cur);\n return out;\n}","function _set(o: { [k: string]: Json }, p: string, v: Json): Json | null {\n return _setPath(o, _path(p), v) ?? null;\n}"],"object/pick":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _pick(o: { [k: string]: Json }, ks: readonly string[]): { [k: string]: Json } {\n const out: { [k: string]: Json } = {};\n for (const k of ks) if (Object.hasOwn(o, k)) out[k] = o[k] ?? null;\n return out;\n}"],"object/omit":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _omit(o: { [k: string]: Json }, ks: readonly string[]): { [k: string]: Json } {\n const out: { [k: string]: Json } = {};\n for (const k of Object.keys(o)) if (!ks.includes(k)) out[k] = o[k] ?? null;\n return out;\n}"],"object/fromEntries":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _fromEntries(es: ReadonlyArray<readonly [string, Json]>): { [k: string]: Json } {\n return Object.fromEntries(es);\n}"],"json/parse":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _jsonParse(t: string): Json {\n try {\n return JSON.parse(t) as Json;\n } catch {\n return null;\n }\n}"],"math/round":["function _round(x: number, d: number = 0): number {\n const m = 10 ** d;\n const r = Math.floor(Math.abs(x) * m + 0.5) / m;\n return x < 0 ? -r : r;\n}"],"math/sqrt":["function _sqrt(x: number): number | null {\n return x < 0 ? null : Math.sqrt(x);\n}"],"math/ln":["function _ln(x: number): number | null {\n return x <= 0 ? null : Math.log(x);\n}"],"math/log10":["function _log10(x: number): number | null {\n return x <= 0 ? null : Math.log10(x);\n}"],"math/pow":["function _pow(a: number, b: number): number | null {\n const r = Math.pow(a, b);\n return Number.isFinite(r) ? r : null;\n}"],"math/clamp":["function _clamp(v: number, lo: number, hi: number): number {\n return Math.min(Math.max(v, lo), hi);\n}"],"validate/required":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _required(v: Json | undefined): boolean {\n return v !== null && v !== undefined && v !== '';\n}"],"validate/object":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _isObject(v: Json | undefined): v is { [k: string]: Json } {\n return v !== null && v !== undefined && typeof v === 'object' && !Array.isArray(v);\n}"],"validate/length":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _length(v: string | readonly Json[]): number {\n return typeof v === 'string' ? [...v].length : v.length;\n}"],"validate/minLength":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _length(v: string | readonly Json[]): number {\n return typeof v === 'string' ? [...v].length : v.length;\n}"],"validate/maxLength":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _length(v: string | readonly Json[]): number {\n return typeof v === 'string' ? [...v].length : v.length;\n}"],"validate/oneOf":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}","function _includes(a: readonly Json[], x: Json): boolean {\n return a.some((y) => _eq(y, x));\n}"],"validate/equals":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _eq(a: Json | undefined, b: Json | undefined): boolean {\n const x = a ?? null;\n const y = b ?? null;\n if (x === y) return true;\n if (Array.isArray(x) && Array.isArray(y)) return x.length === y.length && x.every((v, i) => _eq(v, y[i]));\n if (x !== null && y !== null && typeof x === 'object' && typeof y === 'object' && !Array.isArray(x) && !Array.isArray(y)) {\n const kx = Object.keys(x);\n return kx.length === Object.keys(y).length && kx.every((k) => Object.hasOwn(y, k) && _eq(x[k], y[k]));\n }\n return false;\n}"],"unsupported":["function _unsupported(name: string): never {\n throw new Error('no native template for operator ' + name);\n}"],"array/find":["function _find<T>(a: readonly T[], f: (x: T, i: number) => boolean): T | null {\n const i = a.findIndex(f);\n return i < 0 ? null : (a[i] as T);\n}"],"object/merge":["type Json = null | boolean | number | string | Json[] | { [k: string]: Json };","function _merge(...os: Array<{ [k: string]: Json }>): { [k: string]: Json } {\n return Object.assign({}, ...os) as { [k: string]: Json };\n}"]},"wired":true},"helperGap":{"type":"unknown","default":"\n\n","wired":true},"imports":{"type":"unknown","default":{},"wired":true},"portEffects":{"type":"unknown","default":["list","persist","fetch","fetch-stream","notify","navigate","navigate-back","call-service","cancel-call","send-server","spawn","despawn","log"],"wired":true},"portCall":{"type":"unknown","default":"this.callPort(\"{{name}}\", {{*}})","wired":true},"portCase":{"type":"unknown","default":"lower","wired":true},"portWarn":{"type":"unknown","default":"{{op}} is called on the ports object","wired":true},"attributeRoots":{"type":"unknown","default":{"entity":"this.entity","state":"this.state","payload":"payload"},"wired":true},"itemRoots":{"type":"unknown","default":{"config":"this.config"},"wired":true},"attrAccess":{"type":"unknown","default":".{{name}}","wired":true},"itemAccess":{"type":"unknown","default":"[{{key}}]","wired":true},"indexAccess":{"type":"unknown","default":"[{{0}}]","wired":true},"localAccess":{"type":"unknown","default":"item","wired":true},"entityReadDefault":{"type":"unknown","default":"({{read}} ?? {{default}})","wired":true},"typeNames":{"type":"unknown","default":{"string":"string","string?":"string | null","[string]":"string[]","[string]?":"string[] | null","[string?]":"(string | null)[]","[[string]]":"string[][]","Map string string":"Record<string, string>","Map string string?":"Record<string, string> | null","Map string [string]":"Record<string, string[]>","number":"number","number?":"number | null","[number]":"number[]","[number]?":"number[] | null","[number?]":"(number | null)[]","[[number]]":"number[][]","Map string number":"Record<string, number>","Map string number?":"Record<string, number> | null","Map string [number]":"Record<string, number[]>","int":"number","int?":"number | null","[int]":"number[]","[int]?":"number[] | null","[int?]":"(number | null)[]","[[int]]":"number[][]","Map string int":"Record<string, number>","Map string int?":"Record<string, number> | null","Map string [int]":"Record<string, number[]>","float":"number","float?":"number | null","[float]":"number[]","[float]?":"number[] | null","[float?]":"(number | null)[]","[[float]]":"number[][]","Map string float":"Record<string, number>","Map string float?":"Record<string, number> | null","Map string [float]":"Record<string, number[]>","boolean":"boolean","boolean?":"boolean | null","[boolean]":"boolean[]","[boolean]?":"boolean[] | null","[boolean?]":"(boolean | null)[]","[[boolean]]":"boolean[][]","Map string boolean":"Record<string, boolean>","Map string boolean?":"Record<string, boolean> | null","Map string [boolean]":"Record<string, boolean[]>"},"wired":true},"typeUnknown":{"type":"unknown","default":"Json","wired":true},"nullLit":{"type":"unknown","default":"null","wired":true},"trueLit":{"type":"unknown","default":"true","wired":true},"falseLit":{"type":"unknown","default":"false","wired":true},"stringForm":{"type":"unknown","default":"{{json}}","wired":true},"listForm":{"type":"unknown","default":"[{{*}}]","wired":true},"mapOpen":{"type":"unknown","default":"{","wired":true},"mapClose":{"type":"unknown","default":"}","wired":true},"mapPair":{"type":"unknown","default":"{{key}}: {{value}}","wired":true},"mapSep":{"type":"unknown","default":", ","wired":true},"letStmt":{"type":"unknown","default":"const {{name}} = {{value}}","wired":true},"letExpr":{"type":"unknown","default":"(({{name}}) => ({{body}}))({{value}})","wired":true},"condExpr":{"type":"unknown","default":"({{cond}} ? {{then}} : {{else}})","wired":true},"ifOpen":{"type":"unknown","default":"if ({{cond}}) {","wired":true},"elseOpen":{"type":"unknown","default":"} else {","wired":true},"blockClose":{"type":"unknown","default":"}","wired":true},"emptyBody":{"type":"unknown","default":"","wired":true},"setStyle":{"type":"unknown","default":"assign","wired":true},"setAssign":{"type":"unknown","default":"{{target}} = {{value}}","wired":true},"emitForm":{"type":"unknown","default":"this.emit({{event}}, {{payload}})","wired":true},"voidPayload":{"type":"unknown","default":"{}","wired":true},"programOpen":{"type":"unknown","default":["export class Program extends _Router {","{{i}}constructor(entities: { {{entities}} }{{store}}) {","{{i}}{{i}}super();"],"wired":true},"programEntity":{"type":"unknown","default":"{{key}}: {{entity}}","wired":true},"programEntitySep":{"type":"unknown","default":"; ","wired":true},"programTrait":{"type":"unknown","default":"{{i}}{{i}}this.add({{key}}, new {{class}}(entities[{{key}}]));","wired":true},"programHandles":{"type":"unknown","default":"{{i}}{{i}}this.handles[{{key}}] = {{table}};","wired":true},"programRow":{"type":"unknown","default":"{{i}}{{i}}this.row({{source}}, {{event}}, {{target}}, {{trigger}}, {{guard}}, {{map}});","wired":true},"deliverOpen":{"type":"unknown","default":["{{i}}}","","{{i}}deliver(target: string, event: string, payload: EventPayload): void {","{{i}}{{i}}const t = this.traits[target];"],"wired":true},"deliverCase":{"type":"unknown","default":"{{i}}{{i}}if (target === {{target}} && event === {{event}} && t instanceof {{class}}) return t.{{method}}({{arg}});","wired":true},"deliverCasePlain":{"type":"unknown","default":"{{i}}{{i}}if (target === {{target}} && event === {{event}} && t instanceof {{class}}) return t.{{method}}();","wired":true},"deliverClose":{"type":"unknown","default":["{{i}}}"],"wired":true},"programClose":{"type":"unknown","default":["}"],"wired":true},"payloadDecode":{"type":"unknown","default":"_decode<{{type}}>({{value}})","wired":true},"guardForm":{"type":"unknown","default":["","function {{name}}(payload_json: EventPayload): boolean {","{{i}}const payload = {{decode}};","{{i}}return {{expr}};","}"],"wired":true},"mapForm":{"type":"unknown","default":["","function {{name}}(payload_json: EventPayload): EventPayload {","{{i}}const payload = {{decode}};","{{i}}return {{expr}};","}"],"wired":true},"guardName":{"type":"unknown","default":"_guard{{n}}","wired":true},"mapName":{"type":"unknown","default":"_map{{n}}","wired":true},"payloadType":{"type":"unknown","default":"{{trait}}{{event}}Payload","wired":true},"payloadCtor":{"type":"unknown","default":"({ {{fields}} } satisfies {{type}})","wired":true},"payloadField":{"type":"unknown","default":"{{name}}: _opt({{value}})","wired":true},"payloadSep":{"type":"unknown","default":", ","wired":true},"commentForm":{"type":"unknown","default":"// {{text}}","wired":true},"indent":{"type":"unknown","default":" ","wired":true},"terminator":{"type":"unknown","default":";","wired":true},"classCase":{"type":"unknown","default":"keep","wired":true},"fieldCase":{"type":"unknown","default":"keep","wired":true},"localCase":{"type":"unknown","default":"keep","wired":true},"methodCase":{"type":"unknown","default":"pascal","wired":true},"methodName":{"type":"unknown","default":"on{{event}}","wired":true},"modelImports":{"type":"unknown","default":{"entity":"import type { EventPayload } from '@almadar/core';\nimport type { {{names}} } from '../types/entities';","payload":"import type { {{names}} } from '../types/events';"},"wired":true},"modelImportEach":{"type":"unknown","default":false,"wired":true},"modelImportSep":{"type":"unknown","default":", ","wired":true},"sectionGap":{"type":"unknown","default":"\n\n","wired":true},"classOpen":{"type":"unknown","default":"export class {{class}} {","wired":true},"classClose":{"type":"unknown","default":"}","wired":true},"classEmpty":{"type":"unknown","default":"","wired":true},"constructor":{"type":"unknown","default":["{{i}}state: string = {{initial}};","{{i}}entity: {{entity}};","{{i}}readonly ports: Record<string, (...args: EventPayload[string][]) => void>;","{{i}}readonly config = {{config}};","{{i}}readonly emitted: Array<{ event: string; payload: EventPayload; completion?: boolean }> = [];","","{{i}}constructor(entity: {{entity}}, ports: Record<string, (...args: EventPayload[string][]) => void> = {}, config: Partial<{{class}}['config']> = {}) {","{{i}}{{i}}this.entity = entity;","{{i}}{{i}}this.ports = ports;","{{i}}{{i}}this.config = { ...this.config, ...config };","{{i}}}"],"wired":true},"emitMethod":{"type":"unknown","default":["{{i}}emit(event: string, payload: EventPayload): void {","{{i}}{{i}}this.emitted.push({ event, payload });","{{i}}}","","{{i}}callPort(name: string, ...args: EventPayload[string][]): void {","{{i}}{{i}}const port = this.ports[name];","{{i}}{{i}}if (port === undefined) throw new Error('no port named ' + name);","{{i}}{{i}}port(...args);","{{i}}}"],"wired":true},"completeMethod":{"type":"unknown","default":["","{{i}}store: Store | null = null;","","{{i}}complete(answer: Answer, success: string | null, failure: string | null): void {","{{i}}{{i}}const route = answer.ok ? success : failure;","{{i}}{{i}}if (route !== null) this.emitted.push({ event: route, payload: answer.payload, completion: true });","{{i}}}","","{{i}}useStore(): Store {","{{i}}{{i}}if (this.store === null) throw new Error('no store');","{{i}}{{i}}return this.store;","{{i}}}"],"wired":true},"routedEffects":{"type":"unknown","default":{"persist":"this.complete(this.useStore().persist({{args}}), {{success}}, {{failure}})","fetch":"this.complete(this.useStore().fetch({{entity}}, {{filter}}), {{success}}, {{failure}})"},"wired":true},"fetchAll":{"type":"unknown","default":"null","wired":true},"programStoreParam":{"type":"unknown","default":", store: Store = new MemoryStore()","wired":true},"programTraitStore":{"type":"unknown","default":"{{i}}{{i}}const t{{n}} = new {{class}}(entities[{{key}}]);\n{{i}}{{i}}t{{n}}.store = store;\n{{i}}{{i}}this.add({{key}}, t{{n}});","wired":true},"methodOpen":{"type":"unknown","default":"{{i}}{{method}}(payload: {{payloadType}}): void {","wired":true},"methodOpenPlain":{"type":"unknown","default":"{{i}}{{method}}(): void {","wired":true},"methodClose":{"type":"unknown","default":"{{i}}}","wired":true},"branchFirst":{"type":"unknown","default":"{{i}}{{i}}if ({{test}}) {","wired":true},"branchNext":{"type":"unknown","default":"{{i}}{{i}}} else if ({{test}}) {","wired":true},"branchClose":{"type":"unknown","default":"{{i}}{{i}}}","wired":true},"branchTest":{"type":"unknown","default":"{{stateTest}} && {{guard}}","wired":true},"branchTestPlain":{"type":"unknown","default":"{{stateTest}}","wired":true},"stateTest":{"type":"unknown","default":"this.state === {{state}}","wired":true},"stateAssign":{"type":"unknown","default":"this.state = {{state}}","wired":true},"bodyPrefix":{"type":"unknown","default":"{{i}}{{i}}{{i}}","wired":true},"renderModels":{"type":"unknown","default":false,"wired":true},"modelClassOpen":{"type":"unknown","default":"export interface {{name}} {","wired":true},"modelClassClose":{"type":"unknown","default":"}","wired":true},"modelField":{"type":"unknown","default":"{{i}}{{name}}: {{type}}{{default}};","wired":true},"modelAlias":{"type":"unknown","default":"export type {{name}} = {{type}};","wired":true},"typeMap":{"type":"unknown","default":{"string":"string","number":"number","float":"number","int":"number","integer":"number","boolean":"boolean","bool":"boolean","date":"string","datetime":"string","timestamp":"string","instant":"string","duration":"number","email":"string","url":"string","uuid":"string"},"wired":true},"typeList":{"type":"unknown","default":"{{0}}[]","wired":true},"typeListBare":{"type":"unknown","default":"Json[]","wired":true},"typeDict":{"type":"unknown","default":"Record<string, {{0}}>","wired":true},"typeDictBare":{"type":"unknown","default":"Record<string, Json>","wired":true},"typeLiteral":{"type":"unknown","default":"{{*}}","wired":true},"typeNullable":{"type":"unknown","default":"{{0}} | null","wired":true},"typeAny":{"type":"unknown","default":"Json","wired":true}},"events":{"LOLO_TO_SOURCE":"LOLO_TO_TYPESCRIPT","SOURCE_RENDERED":"TYPESCRIPT_RENDERED","SOURCE_RENDER_FAILED":"TYPESCRIPT_RENDER_FAILED"}}],"pages":[{"name":"LoloTypescriptStart","id":"pag_MKB4ZVVCEPP7BDBAZV5AYZTBKW","path":"","protocol":"boot","traits":[{"ref":"LoloTypescript","refId":"trt_Z6VDY40HE48Q2FYG1WG3MG3DVM"}]}]}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_X674T0QNSRTWWFP6JZB8HSS145":{"id":"ent_X674T0QNSRTWWFP6JZB8HSS145","kind":"entity","bakedName":"LoloTypescriptRun","curName":"LoloTypescriptRun","renames":[],"owner":"workspace"},"orb_JSR3SPGRYDCF6TE57B4QBXFB1F":{"id":"orb_JSR3SPGRYDCF6TE57B4QBXFB1F","kind":"orbital","bakedName":"LoloTypescriptOrbital","curName":"LoloTypescriptOrbital","renames":[],"owner":"workspace"},"pag_MKB4ZVVCEPP7BDBAZV5AYZTBKW":{"id":"pag_MKB4ZVVCEPP7BDBAZV5AYZTBKW","kind":"page","bakedName":"LoloTypescriptStart","curName":"LoloTypescriptStart","renames":[],"owner":"workspace"},"trt_Z6VDY40HE48Q2FYG1WG3MG3DVM":{"id":"trt_Z6VDY40HE48Q2FYG1WG3MG3DVM","kind":"trait","bakedName":"LoloTypescript","curName":"LoloTypescript","renames":[],"owner":"workspace"}}}}
@@ -1 +1 @@
1
- {"typeContractVersion":1,"types":{"HttpHeader":[{"nullable":false,"name":"name","type":"string","required":true},{"nullable":false,"name":"value","type":"string","required":true}],"MetaCampaign":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"dailyBudget","type":"number"}],"MetaCampaignRow":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"daily_budget","type":"string"}],"MetaCampaignsReply":[{"nullable":false,"name":"data","type":"[object]","properties":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"daily_budget","type":"string"}],"items":{"nullable":false,"name":"","type":"MetaCampaignRow","projectedFrom":{"type":"MetaCampaignRow"}}}],"MetaCount":[{"nullable":false,"name":"v","type":"number"}],"MetaErrorDetail":[{"nullable":false,"name":"message","type":"string"}],"MetaErrorReply":[{"nullable":false,"name":"error","type":"object","properties":[{"nullable":false,"name":"message","type":"string"}],"projectedFrom":{"type":"MetaErrorDetail"}}],"MetaInsightRow":[{"nullable":false,"name":"spend","type":"string"},{"nullable":false,"name":"impressions","type":"string"},{"nullable":false,"name":"clicks","type":"string"},{"nullable":false,"name":"account_currency","type":"string"}],"MetaInsightsReply":[{"nullable":false,"name":"data","type":"[object]","properties":[{"nullable":false,"name":"spend","type":"string"},{"nullable":false,"name":"impressions","type":"string"},{"nullable":false,"name":"clicks","type":"string"},{"nullable":false,"name":"account_currency","type":"string"}],"items":{"nullable":false,"name":"","type":"MetaInsightRow","projectedFrom":{"type":"MetaInsightRow"}}}]},"name":"std-meta-ads","version":"1.0.0","description":"std-meta-ads — read-only Meta Graph API Marketing Insights. META_ADS_GET_SPEND answers total spend, impressions and clicks of an ad account over a date range; META_ADS_LIST_CAMPAIGNS lists the account's campaigns with dailyBudget converted from Meta's minor units. The access token is the credential of the composed std-http-client trait MetaAdsHttp, written by the host as the access_token query parameter; a failed call answers META_ADS_FAILED.","orbitals":[{"name":"MetaAdsOrbital","id":"orb_K5C46X2NN7ATKMX7GS0VN0RFGG","uses":[{"from":"std/behaviors/std-http-client","as":"Http"},{"from":"std/behaviors/std-timeout","as":"Timeout"}],"entity":{"name":"MetaAdsLookup","id":"ent_RJ5M5VYR6GC388PN6NKHFZHKXS","persistence":"runtime","fields":[{"nullable":false,"name":"id","type":"string","required":true}]},"traits":[{"ref":"Http.traits.HttpClient","id":"trt_GBBDTR4CAJ659F64TNJVN0NPQY","name":"MetaAdsHttp","config":{"host":{"type":"unknown","default":"graph.facebook.com","wired":true},"port":{"type":"unknown","default":443,"wired":true},"tls":{"type":"unknown","default":true,"wired":true},"serverName":{"type":"unknown","default":"graph.facebook.com","wired":true},"credential":{"type":"unknown","default":"META_ACCESS_TOKEN","wired":true},"credentialIn":{"type":"unknown","default":"query","wired":true},"credentialName":{"type":"unknown","default":"access_token","wired":true}},"listens":[{"event":"META_ADS_HTTP_SEND","triggers":"HTTP_SEND","source":{"kind":"trait","trait":"MetaAdsClient"}},{"event":"TIMED_OUT","triggers":"HTTP_CANCEL","payloadMapping":{"key":"@payload.key"},"source":{"kind":"trait","trait":"MetaAdsTimeout"}}]},{"ref":"Timeout.traits.Timeout","id":"trt_JJW2VT3T3NX1TRZZAP68CVKEEP","name":"MetaAdsTimeout","config":{"timeoutMs":{"type":"unknown","default":15000,"wired":true},"cancelOnDeadline":{"type":"unknown","default":false,"wired":true}},"listens":[{"event":"META_ADS_HTTP_SEND","triggers":"START","payloadMapping":{"key":["as","@payload.key","CallKey"]},"source":{"kind":"trait","trait":"MetaAdsClient"}},{"event":"HTTP_REPLIED","triggers":"SUCCEEDED","payloadMapping":{"key":["as","@payload.key","CallKey"]},"source":{"kind":"trait","trait":"MetaAdsHttp"}},{"event":"HTTP_FAILED","triggers":"FAILED","payloadMapping":{"key":["as","@payload.key","CallKey"],"error":"@payload.error"},"source":{"kind":"trait","trait":"MetaAdsHttp"}}]},{"name":"MetaAdsClient","id":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS","effectRow":[{"kind":"emit","resource":"META_ADS_CAMPAIGNS_RESULT"},{"kind":"emit","resource":"META_ADS_FAILED"},{"kind":"emit","resource":"META_ADS_HTTP_SEND"},{"kind":"emit","resource":"META_ADS_SPEND_RESULT"}],"linkedEntity":"MetaAdsLookup","linkedEntityId":"ent_RJ5M5VYR6GC388PN6NKHFZHKXS","entityRefIds":{"MetaAdsLookup":"ent_RJ5M5VYR6GC388PN6NKHFZHKXS"},"emits":[{"event":"META_ADS_SPEND_RESULT","eventId":"evt_HA4KP0T23N11TW7W9XF0CVPS65","description":"Total spend, impressions and clicks of the ad account over the range; zeros and an empty currency when Meta returns no rows, spend null when Meta's figure is not numeric.","synonyms":"ad spend, meta spend, facebook ads cost, campaign insights","tier":"primary","scope":"external","payloadSchema":[{"nullable":false,"name":"spend","type":"number"},{"nullable":false,"name":"currency","type":"string","required":true},{"nullable":false,"name":"impressions","type":"number"},{"nullable":false,"name":"clicks","type":"number"}]},{"event":"META_ADS_CAMPAIGNS_RESULT","eventId":"evt_TWM3PDTR77C3KMKEJ824HHM6GT","description":"The ad account's campaigns with id, name, status and dailyBudget in major currency units.","synonyms":"meta campaigns, facebook ad campaigns, campaign list","tier":"primary","scope":"external","payloadSchema":[{"nullable":false,"name":"campaigns","type":"[object]","required":true,"properties":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"dailyBudget","type":"number"}],"items":{"nullable":false,"name":"","type":"MetaCampaign","projectedFrom":{"type":"MetaCampaign"}}}]},{"event":"META_ADS_FAILED","eventId":"evt_85DM4ZZ8DAM6NBX59T4N6NSZV9","description":"The Meta Graph call failed: no ad account, missing access token, unreachable API, a 5xx reply, a Graph API error message, or a 2xx campaigns reply that is not valid JSON or not a list (code MALFORMED_REPLY).","synonyms":"meta ads error, graph api failure","tier":"primary","scope":"external","payloadSchema":[{"nullable":false,"name":"code","type":"string"},{"nullable":false,"name":"message","type":"string","required":true}]},{"event":"META_ADS_HTTP_SEND","eventId":"evt_WBDWJS273C3HP96JKJ58PKGXDS","description":"Internal: one Graph API request, for the HTTP client.","tier":"secondary","payloadSchema":[{"nullable":false,"name":"key","type":"string","required":true},{"nullable":false,"name":"method","type":"string","required":true},{"nullable":false,"name":"target","type":"string","required":true},{"nullable":false,"name":"headers","type":"[object]","required":true,"properties":[{"nullable":false,"name":"name","type":"string","required":true},{"nullable":false,"name":"value","type":"string","required":true}],"items":{"nullable":false,"name":"","type":"HttpHeader","projectedFrom":{"type":"HttpHeader"}}},{"nullable":false,"name":"body","type":"bytes","required":true},{"nullable":false,"name":"stream","type":"string","required":true}]}],"listens":[{"event":"HTTP_REPLIED","triggers":"META_ADS_SPEND_REPLIED","triggersId":"evt_WVN4MRG2021011AMZYWT0M1W8P","payloadMapping":{"status":"@payload.status","headers":"@payload.headers","body":["default",["bytes/to-string","@payload.body"],""]},"guard":["=","@payload.key","spend"],"source":{"kind":"trait","trait":"MetaAdsHttp","traitId":"trt_GBBDTR4CAJ659F64TNJVN0NPQY"}},{"event":"HTTP_FAILED","triggers":"META_ADS_SPEND_FAILED","triggersId":"evt_0S4X25SJCAS65DJ2WGAWH35GXQ","payloadMapping":{"error":"@payload.error","kind":"@payload.kind"},"guard":["=","@payload.key","spend"],"source":{"kind":"trait","trait":"MetaAdsHttp","traitId":"trt_GBBDTR4CAJ659F64TNJVN0NPQY"}},{"event":"HTTP_REPLIED","triggers":"META_ADS_CAMPAIGNS_REPLIED","triggersId":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","payloadMapping":{"status":"@payload.status","headers":"@payload.headers","body":["default",["bytes/to-string","@payload.body"],""]},"guard":["=","@payload.key","campaigns"],"source":{"kind":"trait","trait":"MetaAdsHttp","traitId":"trt_GBBDTR4CAJ659F64TNJVN0NPQY"}},{"event":"HTTP_FAILED","triggers":"META_ADS_CAMPAIGNS_FAILED","triggersId":"evt_J8ECYSMP33B1HKADV5BDAKKRPC","payloadMapping":{"error":"@payload.error","kind":"@payload.kind"},"guard":["=","@payload.key","campaigns"],"source":{"kind":"trait","trait":"MetaAdsHttp","traitId":"trt_GBBDTR4CAJ659F64TNJVN0NPQY"}},{"event":"TIMED_OUT","triggers":"META_ADS_SPEND_FAILED","triggersId":"evt_0S4X25SJCAS65DJ2WGAWH35GXQ","payloadMapping":{"error":["str/concat","timeout of ","@payload.timeoutMs","ms exceeded"],"kind":"timeout"},"guard":["=","@payload.key","spend"],"source":{"kind":"trait","trait":"MetaAdsTimeout","traitId":"trt_JJW2VT3T3NX1TRZZAP68CVKEEP"}},{"event":"TIMED_OUT","triggers":"META_ADS_CAMPAIGNS_FAILED","triggersId":"evt_J8ECYSMP33B1HKADV5BDAKKRPC","payloadMapping":{"error":["str/concat","timeout of ","@payload.timeoutMs","ms exceeded"],"kind":"timeout"},"guard":["=","@payload.key","campaigns"],"source":{"kind":"trait","trait":"MetaAdsTimeout","traitId":"trt_JJW2VT3T3NX1TRZZAP68CVKEEP"}}],"stateMachine":{"states":[{"name":"idle","isInitial":true}],"events":[{"key":"INIT","id":"evt_0QMCASQJJPS9BCPMGKAR1R8ACR","name":"Initialize"},{"key":"META_ADS_GET_SPEND","id":"evt_AVCWHKJ5WC2Y64YRRJW8G3V3WB","name":"Meta Ads Get Spend","description":"Fetch total spend, impressions and clicks of an ad account (id with or without the act_ prefix; defaults to the defaultAccountId knob) for a date range (YYYY-MM-DD).","synonyms":"get ad spend, meta spend report, insights for range","payloadSchema":[{"nullable":true,"name":"accountId","type":"string"},{"nullable":false,"name":"since","type":"string","required":true},{"nullable":false,"name":"until","type":"string","required":true}],"input":true,"listened":true},{"key":"META_ADS_SPEND_REPLIED","id":"evt_WVN4MRG2021011AMZYWT0M1W8P","name":"Meta Ads Spend Replied","payloadSchema":[{"nullable":false,"name":"status","type":"number","required":true},{"nullable":false,"name":"headers","type":"Map<string,string>","items":{"nullable":false,"name":"","type":"string"}},{"nullable":false,"name":"body","type":"string","required":true}],"listened":true},{"key":"META_ADS_SPEND_FAILED","id":"evt_0S4X25SJCAS65DJ2WGAWH35GXQ","name":"Meta Ads Spend Failed","payloadSchema":[{"nullable":false,"name":"error","type":"string","required":true},{"nullable":false,"name":"kind","type":"string","required":true}],"listened":true},{"key":"META_ADS_LIST_CAMPAIGNS","id":"evt_SGPSYZ65V42XJ8689F0HWRK7NE","name":"Meta Ads List Campaigns","description":"List campaigns of an ad account, optionally filtered by effective status (ACTIVE, PAUSED).","synonyms":"list meta campaigns, campaigns by status","payloadSchema":[{"nullable":true,"name":"accountId","type":"string"},{"nullable":true,"name":"status","type":"string"}],"input":true,"listened":true},{"key":"META_ADS_CAMPAIGNS_REPLIED","id":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","name":"Meta Ads Campaigns Replied","payloadSchema":[{"nullable":false,"name":"status","type":"number","required":true},{"nullable":false,"name":"headers","type":"Map<string,string>","items":{"nullable":false,"name":"","type":"string"}},{"nullable":false,"name":"body","type":"string","required":true}],"listened":true},{"key":"META_ADS_CAMPAIGNS_FAILED","id":"evt_J8ECYSMP33B1HKADV5BDAKKRPC","name":"Meta Ads Campaigns Failed","payloadSchema":[{"nullable":false,"name":"error","type":"string","required":true},{"nullable":false,"name":"kind","type":"string","required":true}],"listened":true},{"key":"META_ADS_SPEND_RESULT","id":"evt_HA4KP0T23N11TW7W9XF0CVPS65","name":"Meta Ads Spend Result","description":"Total spend, impressions and clicks of the ad account over the range; zeros and an empty currency when Meta returns no rows, spend null when Meta's figure is not numeric.","synonyms":"ad spend, meta spend, facebook ads cost, campaign insights","tier":"primary","payloadSchema":[{"nullable":false,"name":"spend","type":"number"},{"nullable":false,"name":"currency","type":"string","required":true},{"nullable":false,"name":"impressions","type":"number"},{"nullable":false,"name":"clicks","type":"number"}]},{"key":"META_ADS_CAMPAIGNS_RESULT","id":"evt_TWM3PDTR77C3KMKEJ824HHM6GT","name":"Meta Ads Campaigns Result","description":"The ad account's campaigns with id, name, status and dailyBudget in major currency units.","synonyms":"meta campaigns, facebook ad campaigns, campaign list","tier":"primary","payloadSchema":[{"nullable":false,"name":"campaigns","type":"[object]","required":true,"properties":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"dailyBudget","type":"number"}],"items":{"nullable":false,"name":"","type":"MetaCampaign","projectedFrom":{"type":"MetaCampaign"}}}]},{"key":"META_ADS_FAILED","id":"evt_85DM4ZZ8DAM6NBX59T4N6NSZV9","name":"Meta Ads Failed","description":"The Meta Graph call failed: no ad account, missing access token, unreachable API, a 5xx reply, a Graph API error message, or a 2xx campaigns reply that is not valid JSON or not a list (code MALFORMED_REPLY).","synonyms":"meta ads error, graph api failure","tier":"primary","payloadSchema":[{"nullable":false,"name":"code","type":"string"},{"nullable":false,"name":"message","type":"string","required":true}]},{"key":"META_ADS_HTTP_SEND","id":"evt_WBDWJS273C3HP96JKJ58PKGXDS","name":"Meta Ads Http Send","description":"Internal: one Graph API request, for the HTTP client.","tier":"secondary","payloadSchema":[{"nullable":false,"name":"key","type":"string","required":true},{"nullable":false,"name":"method","type":"string","required":true},{"nullable":false,"name":"target","type":"string","required":true},{"nullable":false,"name":"headers","type":"[object]","required":true,"properties":[{"nullable":false,"name":"name","type":"string","required":true},{"nullable":false,"name":"value","type":"string","required":true}],"items":{"nullable":false,"name":"","type":"HttpHeader","projectedFrom":{"type":"HttpHeader"}}},{"nullable":false,"name":"body","type":"bytes","required":true},{"nullable":false,"name":"stream","type":"string","required":true}]}],"transitions":[{"from":"idle","to":"idle","event":"INIT","eventId":"evt_0QMCASQJJPS9BCPMGKAR1R8ACR"},{"from":"idle","to":"idle","event":"META_ADS_GET_SPEND","eventId":"evt_AVCWHKJ5WC2Y64YRRJW8G3V3WB","guard":["=",["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],""],"effects":[["emit","META_ADS_FAILED",{"message":"No ad account: pass `accountId` or set META_AD_ACCOUNT_ID"}]]},{"from":"idle","to":"idle","event":"META_ADS_GET_SPEND","eventId":"evt_AVCWHKJ5WC2Y64YRRJW8G3V3WB","guard":["!=",["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],""],"effects":[["emit","META_ADS_HTTP_SEND",{"key":"spend","method":"GET","target":["str/concat",["str/concat","/","@config.apiVersion","/",["if",["str/startsWith",["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],"act_"],"","act_"],["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],"/insights"],"?fields=",["str/encode-uri-component","spend,impressions,clicks,account_currency"],"&time_range=",["str/encode-uri-component",["str/concat","{\"since\":",["json/stringify","@payload.since"],",\"until\":",["json/stringify","@payload.until"],"}"]],"&level=account"],"headers":[{"name":"accept","value":"*/*"}],"body":["bytes/from-string",""],"stream":"none"}]]},{"from":"idle","to":"idle","event":"META_ADS_SPEND_REPLIED","eventId":"evt_WVN4MRG2021011AMZYWT0M1W8P","guard":[">=","@payload.status",500],"effects":[["emit","META_ADS_FAILED",{"message":["str/concat","Meta Graph API returned ",["default",["format/number","@payload.status"],""]]}]]},{"from":"idle","to":"idle","event":"META_ADS_SPEND_REPLIED","eventId":"evt_WVN4MRG2021011AMZYWT0M1W8P","guard":["and",["<","@payload.status",500],["or",["<","@payload.status",200],[">=","@payload.status",300]]],"effects":[["emit","META_ADS_FAILED",{"message":["str/concat","Meta Graph API error: ",["let",[["e",["json/parse","@payload.body","MetaErrorReply"]]],["default",["if",["=","@e",null],null,["object/get","@e","error.message",null]],["default",["format/number","@payload.status"],""]]]]}]]},{"from":"idle","to":"idle","event":"META_ADS_SPEND_REPLIED","eventId":"evt_WVN4MRG2021011AMZYWT0M1W8P","guard":["and",[">=","@payload.status",200],["<","@payload.status",300]],"effects":[["let",[["reply",["json/parse","@payload.body","MetaInsightsReply"]]],["if",["=","@reply",null],["emit","META_ADS_FAILED",{"code":"MALFORMED_REPLY","message":"Meta Graph API replied with insights that are not a list"}],["let",[["row",["array/first",["default",["object/get","@reply","data",[]],[]]]]],["if",["=","@row",null],["emit","META_ADS_SPEND_RESULT",{"spend":0,"currency":"","impressions":0,"clicks":0}],["let",[["sp",["if",["=",["str/trim",["object/get","@row","spend",""]],""],0,["str/to-number",["str/trim",["object/get","@row","spend",""]]]]],["im",["if",["=",["str/trim",["object/get","@row","impressions",""]],""],0,["str/to-number",["str/trim",["object/get","@row","impressions",""]]]]],["cl",["if",["=",["str/trim",["object/get","@row","clicks",""]],""],0,["str/to-number",["str/trim",["object/get","@row","clicks",""]]]]]],["if",["or",["=","@sp",null],["=","@im",null],["=","@cl",null]],["emit","META_ADS_FAILED",{"code":"MALFORMED_REPLY","message":"Meta Graph API replied with an insights row whose counts are not numbers"}],["emit","META_ADS_SPEND_RESULT",{"spend":"@sp","currency":["object/get","@row","account_currency",""],"impressions":"@im","clicks":"@cl"}]]]]]]]]},{"from":"idle","to":"idle","event":"META_ADS_SPEND_FAILED","eventId":"evt_0S4X25SJCAS65DJ2WGAWH35GXQ","guard":["=","@payload.kind","denied"],"effects":[["emit","META_ADS_FAILED",{"message":"@payload.error"}]]},{"from":"idle","to":"idle","event":"META_ADS_SPEND_FAILED","eventId":"evt_0S4X25SJCAS65DJ2WGAWH35GXQ","guard":["=","@payload.kind","timeout"],"effects":[["emit","META_ADS_FAILED",{"message":"The operation was aborted due to timeout"}]]},{"from":"idle","to":"idle","event":"META_ADS_SPEND_FAILED","eventId":"evt_0S4X25SJCAS65DJ2WGAWH35GXQ","guard":["and",["!=","@payload.kind","denied"],["!=","@payload.kind","timeout"]],"effects":[["emit","META_ADS_FAILED",{"message":"fetch failed"}]]},{"from":"idle","to":"idle","event":"META_ADS_LIST_CAMPAIGNS","eventId":"evt_SGPSYZ65V42XJ8689F0HWRK7NE","guard":["=",["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],""],"effects":[["emit","META_ADS_FAILED",{"message":"No ad account: pass `accountId` or set META_AD_ACCOUNT_ID"}]]},{"from":"idle","to":"idle","event":"META_ADS_LIST_CAMPAIGNS","eventId":"evt_SGPSYZ65V42XJ8689F0HWRK7NE","guard":["!=",["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],""],"effects":[["emit","META_ADS_HTTP_SEND",{"key":"campaigns","method":"GET","target":["str/concat",["str/concat","/","@config.apiVersion","/",["if",["str/startsWith",["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],"act_"],"","act_"],["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],"/campaigns"],"?fields=",["str/encode-uri-component","id,name,status,daily_budget"],["if",["!=",["default","@payload.status",""],""],["str/concat","&effective_status=",["str/encode-uri-component",["json/stringify",["@payload.status"]]]],""]],"headers":[{"name":"accept","value":"*/*"}],"body":["bytes/from-string",""],"stream":"none"}]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_REPLIED","eventId":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","guard":[">=","@payload.status",500],"effects":[["emit","META_ADS_FAILED",{"message":["str/concat","Meta Graph API returned ",["default",["format/number","@payload.status"],""]]}]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_REPLIED","eventId":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","guard":["and",["<","@payload.status",500],["or",["<","@payload.status",200],[">=","@payload.status",300]]],"effects":[["emit","META_ADS_FAILED",{"message":["str/concat","Meta Graph API error: ",["let",[["e",["json/parse","@payload.body","MetaErrorReply"]]],["default",["if",["=","@e",null],null,["object/get","@e","error.message",null]],["default",["format/number","@payload.status"],""]]]]}]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_REPLIED","eventId":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","guard":["and",[">=","@payload.status",200],["<","@payload.status",300],["not",["json/valid","@payload.body"]]],"effects":[["emit","META_ADS_FAILED",{"code":"MALFORMED_REPLY","message":"Meta Graph API replied with a body that is not valid JSON"}]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_REPLIED","eventId":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","guard":["and",[">=","@payload.status",200],["<","@payload.status",300],["json/valid","@payload.body"],["let",[["r",["json/parse","@payload.body","MetaCampaignsReply"]]],["if",["=","@r",null],true,["not",["validate/array",["default",["object/get","@r","data",[]],[]]]]]]],"effects":[["emit","META_ADS_FAILED",{"code":"MALFORMED_REPLY","message":"Meta Graph API replied with campaigns that are not a list"}]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_REPLIED","eventId":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","guard":["and",[">=","@payload.status",200],["<","@payload.status",300],["json/valid","@payload.body"],["let",[["r",["json/parse","@payload.body","MetaCampaignsReply"]]],["if",["=","@r",null],false,["validate/array",["default",["object/get","@r","data",[]],[]]]]]],"effects":[["let",[["rows",["array/map",["default",["object/get",["default",["json/parse","@payload.body","MetaCampaignsReply"],{"data":[]}],"data",[]],[]],["fn","row",{"id":["object/get","@row","id",""],"name":["object/get","@row","name",""],"status":["object/get","@row","status",""],"dailyBudget":["if",["=",["str/trim",["object/get","@row","daily_budget",""]],""],0,["let",[["n",["str/to-number",["str/trim",["object/get","@row","daily_budget",""]]]]],["if",["=","@n",null],null,["/","@n",100]]]]}]]]],["if",["array/some","@rows",["fn","r",["=","@r.dailyBudget",null]]],["emit","META_ADS_FAILED",{"code":"MALFORMED_REPLY","message":"Meta Graph API replied with a campaign whose daily budget is not a number"}],["emit","META_ADS_CAMPAIGNS_RESULT",{"campaigns":"@rows"}]]]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_FAILED","eventId":"evt_J8ECYSMP33B1HKADV5BDAKKRPC","guard":["=","@payload.kind","denied"],"effects":[["emit","META_ADS_FAILED",{"message":"@payload.error"}]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_FAILED","eventId":"evt_J8ECYSMP33B1HKADV5BDAKKRPC","guard":["=","@payload.kind","timeout"],"effects":[["emit","META_ADS_FAILED",{"message":"The operation was aborted due to timeout"}]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_FAILED","eventId":"evt_J8ECYSMP33B1HKADV5BDAKKRPC","guard":["and",["!=","@payload.kind","denied"],["!=","@payload.kind","timeout"]],"effects":[["emit","META_ADS_FAILED",{"message":"fetch failed"}]]}]},"config":{"apiVersion":{"nullable":false,"type":"string","default":"v21.0","label":"Graph API version","description":"The Graph API version path segment.","synonyms":"api version, graph version","tier":"infra"},"defaultAccountId":{"nullable":false,"type":"string","default":"","label":"Default ad account id","description":"Ad account id used when a request passes none (with or without the act_ prefix).","synonyms":"ad account, default account","tier":"infra"}},"dispatch":"optimistic","sourceDeclaration":{"traitId":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS","fingerprint":"056159a65a03fbfd517ff085ae6fae6d4e8975cf440b8468adca1f2ef58e69ed"}}],"pages":[{"name":"MetaAdsPage","id":"pag_0R107Y1J5NS2TRFKGVPSAGC9JW","path":"","protocol":"boot","traits":[{"ref":"MetaAdsClient","refId":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},{"ref":"MetaAdsHttp","refId":"trt_GBBDTR4CAJ659F64TNJVN0NPQY"},{"ref":"MetaAdsTimeout","refId":"trt_JJW2VT3T3NX1TRZZAP68CVKEEP"}]}],"types":{"HttpHeader":[{"nullable":false,"name":"name","type":"string","required":true},{"nullable":false,"name":"value","type":"string","required":true}],"MetaCampaign":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"dailyBudget","type":"number"}],"MetaCampaignRow":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"daily_budget","type":"string"}],"MetaCampaignsReply":[{"nullable":false,"name":"data","type":"[object]","properties":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"daily_budget","type":"string"}],"items":{"nullable":false,"name":"","type":"MetaCampaignRow","projectedFrom":{"type":"MetaCampaignRow"}}}],"MetaCount":[{"nullable":false,"name":"v","type":"number"}],"MetaErrorDetail":[{"nullable":false,"name":"message","type":"string"}],"MetaErrorReply":[{"nullable":false,"name":"error","type":"object","properties":[{"nullable":false,"name":"message","type":"string"}],"projectedFrom":{"type":"MetaErrorDetail"}}],"MetaInsightRow":[{"nullable":false,"name":"spend","type":"string"},{"nullable":false,"name":"impressions","type":"string"},{"nullable":false,"name":"clicks","type":"string"},{"nullable":false,"name":"account_currency","type":"string"}],"MetaInsightsReply":[{"nullable":false,"name":"data","type":"[object]","properties":[{"nullable":false,"name":"spend","type":"string"},{"nullable":false,"name":"impressions","type":"string"},{"nullable":false,"name":"clicks","type":"string"},{"nullable":false,"name":"account_currency","type":"string"}],"items":{"nullable":false,"name":"","type":"MetaInsightRow","projectedFrom":{"type":"MetaInsightRow"}}}]}}],"osGrants":{"fs":[],"exec":[],"net":[{"target":"graph.facebook.com:443","kinds":["tcp"]}],"env":[],"stdio":[],"sys":[],"desktop":[]},"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_RJ5M5VYR6GC388PN6NKHFZHKXS":{"id":"ent_RJ5M5VYR6GC388PN6NKHFZHKXS","kind":"entity","bakedName":"MetaAdsLookup","curName":"MetaAdsLookup","renames":[],"owner":"workspace"},"evt_0QMCASQJJPS9BCPMGKAR1R8ACR":{"id":"evt_0QMCASQJJPS9BCPMGKAR1R8ACR","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_0S4X25SJCAS65DJ2WGAWH35GXQ":{"id":"evt_0S4X25SJCAS65DJ2WGAWH35GXQ","kind":"event","bakedName":"META_ADS_SPEND_FAILED","curName":"META_ADS_SPEND_FAILED","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_4NNBNMT6FB37NVFMB6RM6YPSNY":{"id":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","kind":"event","bakedName":"META_ADS_CAMPAIGNS_REPLIED","curName":"META_ADS_CAMPAIGNS_REPLIED","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_85DM4ZZ8DAM6NBX59T4N6NSZV9":{"id":"evt_85DM4ZZ8DAM6NBX59T4N6NSZV9","kind":"event","bakedName":"META_ADS_FAILED","curName":"META_ADS_FAILED","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_AVCWHKJ5WC2Y64YRRJW8G3V3WB":{"id":"evt_AVCWHKJ5WC2Y64YRRJW8G3V3WB","kind":"event","bakedName":"META_ADS_GET_SPEND","curName":"META_ADS_GET_SPEND","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_HA4KP0T23N11TW7W9XF0CVPS65":{"id":"evt_HA4KP0T23N11TW7W9XF0CVPS65","kind":"event","bakedName":"META_ADS_SPEND_RESULT","curName":"META_ADS_SPEND_RESULT","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_J8ECYSMP33B1HKADV5BDAKKRPC":{"id":"evt_J8ECYSMP33B1HKADV5BDAKKRPC","kind":"event","bakedName":"META_ADS_CAMPAIGNS_FAILED","curName":"META_ADS_CAMPAIGNS_FAILED","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_SGPSYZ65V42XJ8689F0HWRK7NE":{"id":"evt_SGPSYZ65V42XJ8689F0HWRK7NE","kind":"event","bakedName":"META_ADS_LIST_CAMPAIGNS","curName":"META_ADS_LIST_CAMPAIGNS","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_TWM3PDTR77C3KMKEJ824HHM6GT":{"id":"evt_TWM3PDTR77C3KMKEJ824HHM6GT","kind":"event","bakedName":"META_ADS_CAMPAIGNS_RESULT","curName":"META_ADS_CAMPAIGNS_RESULT","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_WBDWJS273C3HP96JKJ58PKGXDS":{"id":"evt_WBDWJS273C3HP96JKJ58PKGXDS","kind":"event","bakedName":"META_ADS_HTTP_SEND","curName":"META_ADS_HTTP_SEND","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_WVN4MRG2021011AMZYWT0M1W8P":{"id":"evt_WVN4MRG2021011AMZYWT0M1W8P","kind":"event","bakedName":"META_ADS_SPEND_REPLIED","curName":"META_ADS_SPEND_REPLIED","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"orb_K5C46X2NN7ATKMX7GS0VN0RFGG":{"id":"orb_K5C46X2NN7ATKMX7GS0VN0RFGG","kind":"orbital","bakedName":"MetaAdsOrbital","curName":"MetaAdsOrbital","renames":[],"owner":"workspace"},"pag_0R107Y1J5NS2TRFKGVPSAGC9JW":{"id":"pag_0R107Y1J5NS2TRFKGVPSAGC9JW","kind":"page","bakedName":"MetaAdsPage","curName":"MetaAdsPage","renames":[],"owner":"workspace"},"trt_8ZZWEXYHWM8YA0SFAE894C2JNS":{"id":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS","kind":"trait","bakedName":"MetaAdsClient","curName":"MetaAdsClient","renames":[],"owner":"workspace"},"trt_GBBDTR4CAJ659F64TNJVN0NPQY":{"id":"trt_GBBDTR4CAJ659F64TNJVN0NPQY","kind":"trait","bakedName":"MetaAdsHttp","curName":"MetaAdsHttp","renames":[],"owner":"workspace"},"trt_JJW2VT3T3NX1TRZZAP68CVKEEP":{"id":"trt_JJW2VT3T3NX1TRZZAP68CVKEEP","kind":"trait","bakedName":"MetaAdsTimeout","curName":"MetaAdsTimeout","renames":[],"owner":"workspace"}}}}
1
+ {"typeContractVersion":1,"types":{"HttpHeader":[{"nullable":false,"name":"name","type":"string","required":true},{"nullable":false,"name":"value","type":"string","required":true}],"MetaCampaign":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"dailyBudget","type":"number"}],"MetaCampaignRow":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"daily_budget","type":"string"}],"MetaCampaignsReply":[{"nullable":false,"name":"data","type":"[object]","properties":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"daily_budget","type":"string"}],"items":{"nullable":false,"name":"","type":"MetaCampaignRow","projectedFrom":{"type":"MetaCampaignRow"}}}],"MetaCount":[{"nullable":false,"name":"v","type":"number"}],"MetaErrorDetail":[{"nullable":false,"name":"message","type":"string"}],"MetaErrorReply":[{"nullable":false,"name":"error","type":"object","properties":[{"nullable":false,"name":"message","type":"string"}],"projectedFrom":{"type":"MetaErrorDetail"}}],"MetaInsightRow":[{"nullable":false,"name":"spend","type":"string"},{"nullable":false,"name":"impressions","type":"string"},{"nullable":false,"name":"clicks","type":"string"},{"nullable":false,"name":"account_currency","type":"string"}],"MetaInsightsReply":[{"nullable":false,"name":"data","type":"[object]","properties":[{"nullable":false,"name":"spend","type":"string"},{"nullable":false,"name":"impressions","type":"string"},{"nullable":false,"name":"clicks","type":"string"},{"nullable":false,"name":"account_currency","type":"string"}],"items":{"nullable":false,"name":"","type":"MetaInsightRow","projectedFrom":{"type":"MetaInsightRow"}}}]},"name":"std-meta-ads","version":"1.0.0","description":"std-meta-ads — read-only Meta Graph API Marketing Insights. META_ADS_GET_SPEND answers total spend, impressions and clicks of an ad account over a date range; META_ADS_LIST_CAMPAIGNS lists the account's campaigns with dailyBudget converted from Meta's minor units. The access token is the credential of the composed std-http-client trait MetaAdsHttp, written by the host as the access_token query parameter; a failed call answers META_ADS_FAILED.","orbitals":[{"name":"MetaAdsOrbital","id":"orb_K5C46X2NN7ATKMX7GS0VN0RFGG","uses":[{"from":"std/behaviors/std-http-client","as":"Http"},{"from":"std/behaviors/std-timeout","as":"Timeout"}],"entity":{"name":"MetaAdsLookup","id":"ent_RJ5M5VYR6GC388PN6NKHFZHKXS","persistence":"runtime","fields":[{"nullable":false,"name":"id","type":"string","required":true}]},"traits":[{"ref":"Http.traits.HttpClient","id":"trt_GBBDTR4CAJ659F64TNJVN0NPQY","name":"MetaAdsHttp","config":{"host":{"type":"unknown","default":"graph.facebook.com","wired":true},"port":{"type":"unknown","default":443,"wired":true},"tls":{"type":"unknown","default":true,"wired":true},"serverName":{"type":"unknown","default":"graph.facebook.com","wired":true},"credential":{"type":"unknown","default":"META_ACCESS_TOKEN","wired":true},"credentialIn":{"type":"unknown","default":"query","wired":true},"credentialName":{"type":"unknown","default":"access_token","wired":true}},"listens":[{"event":"META_ADS_HTTP_SEND","triggers":"HTTP_SEND","source":{"kind":"trait","trait":"MetaAdsClient"}},{"event":"TIMED_OUT","triggers":"HTTP_CANCEL","payloadMapping":{"key":"@payload.key"},"source":{"kind":"trait","trait":"MetaAdsTimeout"}}]},{"ref":"Timeout.traits.Timeout","id":"trt_JJW2VT3T3NX1TRZZAP68CVKEEP","name":"MetaAdsTimeout","config":{"timeoutMs":{"type":"unknown","default":15000,"wired":true},"cancelOnDeadline":{"type":"unknown","default":false,"wired":true}},"listens":[{"event":"META_ADS_HTTP_SEND","triggers":"START","payloadMapping":{"key":["as","@payload.key","CallKey"]},"source":{"kind":"trait","trait":"MetaAdsClient"}},{"event":"HTTP_REPLIED","triggers":"SUCCEEDED","payloadMapping":{"key":["as","@payload.key","CallKey"]},"source":{"kind":"trait","trait":"MetaAdsHttp"}},{"event":"HTTP_FAILED","triggers":"FAILED","payloadMapping":{"key":["as","@payload.key","CallKey"],"error":"@payload.error"},"source":{"kind":"trait","trait":"MetaAdsHttp"}}]},{"name":"MetaAdsClient","id":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS","effectRow":[{"kind":"emit","resource":"META_ADS_CAMPAIGNS_RESULT"},{"kind":"emit","resource":"META_ADS_FAILED"},{"kind":"emit","resource":"META_ADS_HTTP_SEND"},{"kind":"emit","resource":"META_ADS_SPEND_RESULT"}],"linkedEntity":"MetaAdsLookup","linkedEntityId":"ent_RJ5M5VYR6GC388PN6NKHFZHKXS","entityRefIds":{"MetaAdsLookup":"ent_RJ5M5VYR6GC388PN6NKHFZHKXS"},"emits":[{"event":"META_ADS_SPEND_RESULT","eventId":"evt_HA4KP0T23N11TW7W9XF0CVPS65","description":"Total spend, impressions and clicks of the ad account over the range; zeros and an empty currency when Meta returns no rows, spend null when Meta's figure is not numeric.","synonyms":"ad spend, meta spend, facebook ads cost, campaign insights","tier":"primary","scope":"external","payloadSchema":[{"nullable":false,"name":"spend","type":"number"},{"nullable":false,"name":"currency","type":"string","required":true},{"nullable":false,"name":"impressions","type":"number"},{"nullable":false,"name":"clicks","type":"number"}]},{"event":"META_ADS_CAMPAIGNS_RESULT","eventId":"evt_TWM3PDTR77C3KMKEJ824HHM6GT","description":"The ad account's campaigns with id, name, status and dailyBudget in major currency units.","synonyms":"meta campaigns, facebook ad campaigns, campaign list","tier":"primary","scope":"external","payloadSchema":[{"nullable":false,"name":"campaigns","type":"[object]","required":true,"properties":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"dailyBudget","type":"number"}],"items":{"nullable":false,"name":"","type":"MetaCampaign","projectedFrom":{"type":"MetaCampaign"}}}]},{"event":"META_ADS_FAILED","eventId":"evt_85DM4ZZ8DAM6NBX59T4N6NSZV9","description":"The Meta Graph call failed: no ad account, missing access token, unreachable API, a 5xx reply, a Graph API error message, or a 2xx campaigns reply that is not valid JSON or not a list (code MALFORMED_REPLY).","synonyms":"meta ads error, graph api failure","tier":"primary","scope":"external","payloadSchema":[{"nullable":false,"name":"code","type":"string"},{"nullable":false,"name":"message","type":"string","required":true}]},{"event":"META_ADS_HTTP_SEND","eventId":"evt_WBDWJS273C3HP96JKJ58PKGXDS","description":"Internal: one Graph API request, for the HTTP client.","tier":"secondary","payloadSchema":[{"nullable":false,"name":"key","type":"string","required":true},{"nullable":false,"name":"method","type":"string","required":true},{"nullable":false,"name":"target","type":"string","required":true},{"nullable":false,"name":"headers","type":"[object]","required":true,"properties":[{"nullable":false,"name":"name","type":"string","required":true},{"nullable":false,"name":"value","type":"string","required":true}],"items":{"nullable":false,"name":"","type":"HttpHeader","projectedFrom":{"type":"HttpHeader"}}},{"nullable":false,"name":"body","type":"bytes","required":true},{"nullable":false,"name":"stream","type":"string","required":true}]}],"listens":[{"event":"HTTP_REPLIED","triggers":"META_ADS_SPEND_REPLIED","triggersId":"evt_WVN4MRG2021011AMZYWT0M1W8P","payloadMapping":{"status":"@payload.status","headers":"@payload.headers","body":["default",["bytes/to-string","@payload.body"],""]},"guard":["=","@payload.key","spend"],"source":{"kind":"trait","trait":"MetaAdsHttp","traitId":"trt_GBBDTR4CAJ659F64TNJVN0NPQY"}},{"event":"HTTP_FAILED","triggers":"META_ADS_SPEND_FAILED","triggersId":"evt_0S4X25SJCAS65DJ2WGAWH35GXQ","payloadMapping":{"error":"@payload.error","kind":"@payload.kind"},"guard":["=","@payload.key","spend"],"source":{"kind":"trait","trait":"MetaAdsHttp","traitId":"trt_GBBDTR4CAJ659F64TNJVN0NPQY"}},{"event":"HTTP_REPLIED","triggers":"META_ADS_CAMPAIGNS_REPLIED","triggersId":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","payloadMapping":{"status":"@payload.status","headers":"@payload.headers","body":["default",["bytes/to-string","@payload.body"],""]},"guard":["=","@payload.key","campaigns"],"source":{"kind":"trait","trait":"MetaAdsHttp","traitId":"trt_GBBDTR4CAJ659F64TNJVN0NPQY"}},{"event":"HTTP_FAILED","triggers":"META_ADS_CAMPAIGNS_FAILED","triggersId":"evt_J8ECYSMP33B1HKADV5BDAKKRPC","payloadMapping":{"error":"@payload.error","kind":"@payload.kind"},"guard":["=","@payload.key","campaigns"],"source":{"kind":"trait","trait":"MetaAdsHttp","traitId":"trt_GBBDTR4CAJ659F64TNJVN0NPQY"}},{"event":"TIMED_OUT","triggers":"META_ADS_SPEND_FAILED","triggersId":"evt_0S4X25SJCAS65DJ2WGAWH35GXQ","payloadMapping":{"error":["str/concat","timeout of ","@payload.timeoutMs","ms exceeded"],"kind":"timeout"},"guard":["=","@payload.key","spend"],"source":{"kind":"trait","trait":"MetaAdsTimeout","traitId":"trt_JJW2VT3T3NX1TRZZAP68CVKEEP"}},{"event":"TIMED_OUT","triggers":"META_ADS_CAMPAIGNS_FAILED","triggersId":"evt_J8ECYSMP33B1HKADV5BDAKKRPC","payloadMapping":{"error":["str/concat","timeout of ","@payload.timeoutMs","ms exceeded"],"kind":"timeout"},"guard":["=","@payload.key","campaigns"],"source":{"kind":"trait","trait":"MetaAdsTimeout","traitId":"trt_JJW2VT3T3NX1TRZZAP68CVKEEP"}}],"stateMachine":{"states":[{"name":"idle","isInitial":true}],"events":[{"key":"INIT","id":"evt_0QMCASQJJPS9BCPMGKAR1R8ACR","name":"Initialize"},{"key":"META_ADS_GET_SPEND","id":"evt_AVCWHKJ5WC2Y64YRRJW8G3V3WB","name":"Meta Ads Get Spend","description":"Fetch total spend, impressions and clicks of an ad account (id with or without the act_ prefix; defaults to the defaultAccountId knob) for a date range (YYYY-MM-DD).","synonyms":"get ad spend, meta spend report, insights for range","payloadSchema":[{"nullable":true,"name":"accountId","type":"string"},{"nullable":false,"name":"since","type":"string","required":true},{"nullable":false,"name":"until","type":"string","required":true}],"input":true,"listened":true},{"key":"META_ADS_SPEND_REPLIED","id":"evt_WVN4MRG2021011AMZYWT0M1W8P","name":"Meta Ads Spend Replied","payloadSchema":[{"nullable":false,"name":"status","type":"number","required":true},{"nullable":false,"name":"headers","type":"Map<string,string>","items":{"nullable":false,"name":"","type":"string"}},{"nullable":false,"name":"body","type":"string","required":true}],"listened":true},{"key":"META_ADS_SPEND_FAILED","id":"evt_0S4X25SJCAS65DJ2WGAWH35GXQ","name":"Meta Ads Spend Failed","payloadSchema":[{"nullable":false,"name":"error","type":"string","required":true},{"nullable":false,"name":"kind","type":"string","required":true}],"listened":true},{"key":"META_ADS_LIST_CAMPAIGNS","id":"evt_SGPSYZ65V42XJ8689F0HWRK7NE","name":"Meta Ads List Campaigns","description":"List campaigns of an ad account, optionally filtered by effective status (ACTIVE, PAUSED).","synonyms":"list meta campaigns, campaigns by status","payloadSchema":[{"nullable":true,"name":"accountId","type":"string"},{"nullable":true,"name":"status","type":"string"}],"input":true,"listened":true},{"key":"META_ADS_CAMPAIGNS_REPLIED","id":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","name":"Meta Ads Campaigns Replied","payloadSchema":[{"nullable":false,"name":"status","type":"number","required":true},{"nullable":false,"name":"headers","type":"Map<string,string>","items":{"nullable":false,"name":"","type":"string"}},{"nullable":false,"name":"body","type":"string","required":true}],"listened":true},{"key":"META_ADS_CAMPAIGNS_FAILED","id":"evt_J8ECYSMP33B1HKADV5BDAKKRPC","name":"Meta Ads Campaigns Failed","payloadSchema":[{"nullable":false,"name":"error","type":"string","required":true},{"nullable":false,"name":"kind","type":"string","required":true}],"listened":true},{"key":"META_ADS_SPEND_RESULT","id":"evt_HA4KP0T23N11TW7W9XF0CVPS65","name":"Meta Ads Spend Result","description":"Total spend, impressions and clicks of the ad account over the range; zeros and an empty currency when Meta returns no rows, spend null when Meta's figure is not numeric.","synonyms":"ad spend, meta spend, facebook ads cost, campaign insights","tier":"primary","payloadSchema":[{"nullable":false,"name":"spend","type":"number"},{"nullable":false,"name":"currency","type":"string","required":true},{"nullable":false,"name":"impressions","type":"number"},{"nullable":false,"name":"clicks","type":"number"}]},{"key":"META_ADS_CAMPAIGNS_RESULT","id":"evt_TWM3PDTR77C3KMKEJ824HHM6GT","name":"Meta Ads Campaigns Result","description":"The ad account's campaigns with id, name, status and dailyBudget in major currency units.","synonyms":"meta campaigns, facebook ad campaigns, campaign list","tier":"primary","payloadSchema":[{"nullable":false,"name":"campaigns","type":"[object]","required":true,"properties":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"dailyBudget","type":"number"}],"items":{"nullable":false,"name":"","type":"MetaCampaign","projectedFrom":{"type":"MetaCampaign"}}}]},{"key":"META_ADS_FAILED","id":"evt_85DM4ZZ8DAM6NBX59T4N6NSZV9","name":"Meta Ads Failed","description":"The Meta Graph call failed: no ad account, missing access token, unreachable API, a 5xx reply, a Graph API error message, or a 2xx campaigns reply that is not valid JSON or not a list (code MALFORMED_REPLY).","synonyms":"meta ads error, graph api failure","tier":"primary","payloadSchema":[{"nullable":false,"name":"code","type":"string"},{"nullable":false,"name":"message","type":"string","required":true}]},{"key":"META_ADS_HTTP_SEND","id":"evt_WBDWJS273C3HP96JKJ58PKGXDS","name":"Meta Ads Http Send","description":"Internal: one Graph API request, for the HTTP client.","tier":"secondary","payloadSchema":[{"nullable":false,"name":"key","type":"string","required":true},{"nullable":false,"name":"method","type":"string","required":true},{"nullable":false,"name":"target","type":"string","required":true},{"nullable":false,"name":"headers","type":"[object]","required":true,"properties":[{"nullable":false,"name":"name","type":"string","required":true},{"nullable":false,"name":"value","type":"string","required":true}],"items":{"nullable":false,"name":"","type":"HttpHeader","projectedFrom":{"type":"HttpHeader"}}},{"nullable":false,"name":"body","type":"bytes","required":true},{"nullable":false,"name":"stream","type":"string","required":true}]}],"transitions":[{"from":"idle","to":"idle","event":"INIT","eventId":"evt_0QMCASQJJPS9BCPMGKAR1R8ACR"},{"from":"idle","to":"idle","event":"META_ADS_GET_SPEND","eventId":"evt_AVCWHKJ5WC2Y64YRRJW8G3V3WB","guard":["=",["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],""],"effects":[["emit","META_ADS_FAILED",{"message":"No ad account: pass `accountId` or set META_AD_ACCOUNT_ID"}]]},{"from":"idle","to":"idle","event":"META_ADS_GET_SPEND","eventId":"evt_AVCWHKJ5WC2Y64YRRJW8G3V3WB","guard":["!=",["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],""],"effects":[["emit","META_ADS_HTTP_SEND",{"key":"spend","method":"GET","target":["str/concat",["str/concat","/","@config.apiVersion","/",["if",["str/startsWith",["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],"act_"],"","act_"],["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],"/insights"],"?fields=",["str/encode-uri-component","spend,impressions,clicks,account_currency"],"&time_range=",["str/encode-uri-component",["str/concat","{\"since\":",["json/stringify","@payload.since"],",\"until\":",["json/stringify","@payload.until"],"}"]],"&level=account"],"headers":[{"name":"accept","value":"*/*"}],"body":["bytes/from-string",""],"stream":"none"}]]},{"from":"idle","to":"idle","event":"META_ADS_SPEND_REPLIED","eventId":"evt_WVN4MRG2021011AMZYWT0M1W8P","guard":[">=","@payload.status",500],"effects":[["emit","META_ADS_FAILED",{"message":["str/concat","Meta Graph API returned ",["default",["format/number","@payload.status"],""]]}]]},{"from":"idle","to":"idle","event":"META_ADS_SPEND_REPLIED","eventId":"evt_WVN4MRG2021011AMZYWT0M1W8P","guard":["and",["<","@payload.status",500],["or",["<","@payload.status",200],[">=","@payload.status",300]]],"effects":[["emit","META_ADS_FAILED",{"message":["str/concat","Meta Graph API error: ",["let",[["e",["json/parse","@payload.body","MetaErrorReply"]]],["default",["if",["=","@e",null],null,["object/get","@e","error.message",null]],["default",["format/number","@payload.status"],""]]]]}]]},{"from":"idle","to":"idle","event":"META_ADS_SPEND_REPLIED","eventId":"evt_WVN4MRG2021011AMZYWT0M1W8P","guard":["and",[">=","@payload.status",200],["<","@payload.status",300]],"effects":[["let",[["reply",["json/parse","@payload.body","MetaInsightsReply"]]],["if",["=","@reply",null],["emit","META_ADS_FAILED",{"code":"MALFORMED_REPLY","message":"Meta Graph API replied with insights that are not a list"}],["let",[["row",["array/first",["default",["object/get","@reply","data",[]],[]]]]],["if",["=","@row",null],["emit","META_ADS_SPEND_RESULT",{"spend":0,"currency":"","impressions":0,"clicks":0}],["let",[["sp",["if",["=",["str/trim",["object/get","@row","spend",""]],""],0,["str/to-number",["str/trim",["object/get","@row","spend",""]]]]],["im",["if",["=",["str/trim",["object/get","@row","impressions",""]],""],0,["str/to-number",["str/trim",["object/get","@row","impressions",""]]]]],["cl",["if",["=",["str/trim",["object/get","@row","clicks",""]],""],0,["str/to-number",["str/trim",["object/get","@row","clicks",""]]]]]],["if",["or",["=","@sp",null],["=","@im",null],["=","@cl",null]],["emit","META_ADS_FAILED",{"code":"MALFORMED_REPLY","message":"Meta Graph API replied with an insights row whose counts are not numbers"}],["emit","META_ADS_SPEND_RESULT",{"spend":"@sp","currency":["object/get","@row","account_currency",""],"impressions":"@im","clicks":"@cl"}]]]]]]]]},{"from":"idle","to":"idle","event":"META_ADS_SPEND_FAILED","eventId":"evt_0S4X25SJCAS65DJ2WGAWH35GXQ","guard":["array/includes",["denied","unsupported"],"@payload.kind"],"effects":[["emit","META_ADS_FAILED",{"message":"@payload.error"}]]},{"from":"idle","to":"idle","event":"META_ADS_SPEND_FAILED","eventId":"evt_0S4X25SJCAS65DJ2WGAWH35GXQ","guard":["=","@payload.kind","timeout"],"effects":[["emit","META_ADS_FAILED",{"message":"The operation was aborted due to timeout"}]]},{"from":"idle","to":"idle","event":"META_ADS_SPEND_FAILED","eventId":"evt_0S4X25SJCAS65DJ2WGAWH35GXQ","guard":["and",["!=","@payload.kind","denied"],["!=","@payload.kind","unsupported"],["!=","@payload.kind","timeout"]],"effects":[["emit","META_ADS_FAILED",{"message":"fetch failed"}]]},{"from":"idle","to":"idle","event":"META_ADS_LIST_CAMPAIGNS","eventId":"evt_SGPSYZ65V42XJ8689F0HWRK7NE","guard":["=",["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],""],"effects":[["emit","META_ADS_FAILED",{"message":"No ad account: pass `accountId` or set META_AD_ACCOUNT_ID"}]]},{"from":"idle","to":"idle","event":"META_ADS_LIST_CAMPAIGNS","eventId":"evt_SGPSYZ65V42XJ8689F0HWRK7NE","guard":["!=",["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],""],"effects":[["emit","META_ADS_HTTP_SEND",{"key":"campaigns","method":"GET","target":["str/concat",["str/concat","/","@config.apiVersion","/",["if",["str/startsWith",["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],"act_"],"","act_"],["if",["!=",["default","@payload.accountId",""],""],["default","@payload.accountId",""],"@config.defaultAccountId"],"/campaigns"],"?fields=",["str/encode-uri-component","id,name,status,daily_budget"],["if",["!=",["default","@payload.status",""],""],["str/concat","&effective_status=",["str/encode-uri-component",["json/stringify",["@payload.status"]]]],""]],"headers":[{"name":"accept","value":"*/*"}],"body":["bytes/from-string",""],"stream":"none"}]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_REPLIED","eventId":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","guard":[">=","@payload.status",500],"effects":[["emit","META_ADS_FAILED",{"message":["str/concat","Meta Graph API returned ",["default",["format/number","@payload.status"],""]]}]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_REPLIED","eventId":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","guard":["and",["<","@payload.status",500],["or",["<","@payload.status",200],[">=","@payload.status",300]]],"effects":[["emit","META_ADS_FAILED",{"message":["str/concat","Meta Graph API error: ",["let",[["e",["json/parse","@payload.body","MetaErrorReply"]]],["default",["if",["=","@e",null],null,["object/get","@e","error.message",null]],["default",["format/number","@payload.status"],""]]]]}]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_REPLIED","eventId":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","guard":["and",[">=","@payload.status",200],["<","@payload.status",300],["not",["json/valid","@payload.body"]]],"effects":[["emit","META_ADS_FAILED",{"code":"MALFORMED_REPLY","message":"Meta Graph API replied with a body that is not valid JSON"}]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_REPLIED","eventId":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","guard":["and",[">=","@payload.status",200],["<","@payload.status",300],["json/valid","@payload.body"],["let",[["r",["json/parse","@payload.body","MetaCampaignsReply"]]],["if",["=","@r",null],true,["not",["validate/array",["default",["object/get","@r","data",[]],[]]]]]]],"effects":[["emit","META_ADS_FAILED",{"code":"MALFORMED_REPLY","message":"Meta Graph API replied with campaigns that are not a list"}]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_REPLIED","eventId":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","guard":["and",[">=","@payload.status",200],["<","@payload.status",300],["json/valid","@payload.body"],["let",[["r",["json/parse","@payload.body","MetaCampaignsReply"]]],["if",["=","@r",null],false,["validate/array",["default",["object/get","@r","data",[]],[]]]]]],"effects":[["let",[["rows",["array/map",["default",["object/get",["default",["json/parse","@payload.body","MetaCampaignsReply"],{"data":[]}],"data",[]],[]],["fn","row",{"id":["object/get","@row","id",""],"name":["object/get","@row","name",""],"status":["object/get","@row","status",""],"dailyBudget":["if",["=",["str/trim",["object/get","@row","daily_budget",""]],""],0,["let",[["n",["str/to-number",["str/trim",["object/get","@row","daily_budget",""]]]]],["if",["=","@n",null],null,["/","@n",100]]]]}]]]],["if",["array/some","@rows",["fn","r",["=","@r.dailyBudget",null]]],["emit","META_ADS_FAILED",{"code":"MALFORMED_REPLY","message":"Meta Graph API replied with a campaign whose daily budget is not a number"}],["emit","META_ADS_CAMPAIGNS_RESULT",{"campaigns":"@rows"}]]]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_FAILED","eventId":"evt_J8ECYSMP33B1HKADV5BDAKKRPC","guard":["array/includes",["denied","unsupported"],"@payload.kind"],"effects":[["emit","META_ADS_FAILED",{"message":"@payload.error"}]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_FAILED","eventId":"evt_J8ECYSMP33B1HKADV5BDAKKRPC","guard":["=","@payload.kind","timeout"],"effects":[["emit","META_ADS_FAILED",{"message":"The operation was aborted due to timeout"}]]},{"from":"idle","to":"idle","event":"META_ADS_CAMPAIGNS_FAILED","eventId":"evt_J8ECYSMP33B1HKADV5BDAKKRPC","guard":["and",["!=","@payload.kind","denied"],["!=","@payload.kind","unsupported"],["!=","@payload.kind","timeout"]],"effects":[["emit","META_ADS_FAILED",{"message":"fetch failed"}]]}]},"config":{"apiVersion":{"nullable":false,"type":"string","default":"v21.0","label":"Graph API version","description":"The Graph API version path segment.","synonyms":"api version, graph version","tier":"infra"},"defaultAccountId":{"nullable":false,"type":"string","default":"","label":"Default ad account id","description":"Ad account id used when a request passes none (with or without the act_ prefix).","synonyms":"ad account, default account","tier":"infra"}},"dispatch":"optimistic","sourceDeclaration":{"traitId":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS","fingerprint":"683687a505319a982c3bdbc14c710070265d4623f1706e8793a123df46311d6e"}}],"pages":[{"name":"MetaAdsPage","id":"pag_0R107Y1J5NS2TRFKGVPSAGC9JW","path":"","protocol":"boot","traits":[{"ref":"MetaAdsClient","refId":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},{"ref":"MetaAdsHttp","refId":"trt_GBBDTR4CAJ659F64TNJVN0NPQY"},{"ref":"MetaAdsTimeout","refId":"trt_JJW2VT3T3NX1TRZZAP68CVKEEP"}]}],"types":{"HttpHeader":[{"nullable":false,"name":"name","type":"string","required":true},{"nullable":false,"name":"value","type":"string","required":true}],"MetaCampaign":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"dailyBudget","type":"number"}],"MetaCampaignRow":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"daily_budget","type":"string"}],"MetaCampaignsReply":[{"nullable":false,"name":"data","type":"[object]","properties":[{"nullable":false,"name":"id","type":"string"},{"nullable":false,"name":"name","type":"string"},{"nullable":false,"name":"status","type":"string"},{"nullable":false,"name":"daily_budget","type":"string"}],"items":{"nullable":false,"name":"","type":"MetaCampaignRow","projectedFrom":{"type":"MetaCampaignRow"}}}],"MetaCount":[{"nullable":false,"name":"v","type":"number"}],"MetaErrorDetail":[{"nullable":false,"name":"message","type":"string"}],"MetaErrorReply":[{"nullable":false,"name":"error","type":"object","properties":[{"nullable":false,"name":"message","type":"string"}],"projectedFrom":{"type":"MetaErrorDetail"}}],"MetaInsightRow":[{"nullable":false,"name":"spend","type":"string"},{"nullable":false,"name":"impressions","type":"string"},{"nullable":false,"name":"clicks","type":"string"},{"nullable":false,"name":"account_currency","type":"string"}],"MetaInsightsReply":[{"nullable":false,"name":"data","type":"[object]","properties":[{"nullable":false,"name":"spend","type":"string"},{"nullable":false,"name":"impressions","type":"string"},{"nullable":false,"name":"clicks","type":"string"},{"nullable":false,"name":"account_currency","type":"string"}],"items":{"nullable":false,"name":"","type":"MetaInsightRow","projectedFrom":{"type":"MetaInsightRow"}}}]}}],"osGrants":{"fs":[],"exec":[],"net":[{"target":"graph.facebook.com:443","kinds":["tcp"]}],"env":[],"stdio":[],"sys":[],"desktop":[]},"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_RJ5M5VYR6GC388PN6NKHFZHKXS":{"id":"ent_RJ5M5VYR6GC388PN6NKHFZHKXS","kind":"entity","bakedName":"MetaAdsLookup","curName":"MetaAdsLookup","renames":[],"owner":"workspace"},"evt_0QMCASQJJPS9BCPMGKAR1R8ACR":{"id":"evt_0QMCASQJJPS9BCPMGKAR1R8ACR","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_0S4X25SJCAS65DJ2WGAWH35GXQ":{"id":"evt_0S4X25SJCAS65DJ2WGAWH35GXQ","kind":"event","bakedName":"META_ADS_SPEND_FAILED","curName":"META_ADS_SPEND_FAILED","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_4NNBNMT6FB37NVFMB6RM6YPSNY":{"id":"evt_4NNBNMT6FB37NVFMB6RM6YPSNY","kind":"event","bakedName":"META_ADS_CAMPAIGNS_REPLIED","curName":"META_ADS_CAMPAIGNS_REPLIED","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_85DM4ZZ8DAM6NBX59T4N6NSZV9":{"id":"evt_85DM4ZZ8DAM6NBX59T4N6NSZV9","kind":"event","bakedName":"META_ADS_FAILED","curName":"META_ADS_FAILED","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_AVCWHKJ5WC2Y64YRRJW8G3V3WB":{"id":"evt_AVCWHKJ5WC2Y64YRRJW8G3V3WB","kind":"event","bakedName":"META_ADS_GET_SPEND","curName":"META_ADS_GET_SPEND","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_HA4KP0T23N11TW7W9XF0CVPS65":{"id":"evt_HA4KP0T23N11TW7W9XF0CVPS65","kind":"event","bakedName":"META_ADS_SPEND_RESULT","curName":"META_ADS_SPEND_RESULT","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_J8ECYSMP33B1HKADV5BDAKKRPC":{"id":"evt_J8ECYSMP33B1HKADV5BDAKKRPC","kind":"event","bakedName":"META_ADS_CAMPAIGNS_FAILED","curName":"META_ADS_CAMPAIGNS_FAILED","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_SGPSYZ65V42XJ8689F0HWRK7NE":{"id":"evt_SGPSYZ65V42XJ8689F0HWRK7NE","kind":"event","bakedName":"META_ADS_LIST_CAMPAIGNS","curName":"META_ADS_LIST_CAMPAIGNS","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_TWM3PDTR77C3KMKEJ824HHM6GT":{"id":"evt_TWM3PDTR77C3KMKEJ824HHM6GT","kind":"event","bakedName":"META_ADS_CAMPAIGNS_RESULT","curName":"META_ADS_CAMPAIGNS_RESULT","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_WBDWJS273C3HP96JKJ58PKGXDS":{"id":"evt_WBDWJS273C3HP96JKJ58PKGXDS","kind":"event","bakedName":"META_ADS_HTTP_SEND","curName":"META_ADS_HTTP_SEND","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"evt_WVN4MRG2021011AMZYWT0M1W8P":{"id":"evt_WVN4MRG2021011AMZYWT0M1W8P","kind":"event","bakedName":"META_ADS_SPEND_REPLIED","curName":"META_ADS_SPEND_REPLIED","renames":[],"owner":"workspace","parent":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS"},"orb_K5C46X2NN7ATKMX7GS0VN0RFGG":{"id":"orb_K5C46X2NN7ATKMX7GS0VN0RFGG","kind":"orbital","bakedName":"MetaAdsOrbital","curName":"MetaAdsOrbital","renames":[],"owner":"workspace"},"pag_0R107Y1J5NS2TRFKGVPSAGC9JW":{"id":"pag_0R107Y1J5NS2TRFKGVPSAGC9JW","kind":"page","bakedName":"MetaAdsPage","curName":"MetaAdsPage","renames":[],"owner":"workspace"},"trt_8ZZWEXYHWM8YA0SFAE894C2JNS":{"id":"trt_8ZZWEXYHWM8YA0SFAE894C2JNS","kind":"trait","bakedName":"MetaAdsClient","curName":"MetaAdsClient","renames":[],"owner":"workspace"},"trt_GBBDTR4CAJ659F64TNJVN0NPQY":{"id":"trt_GBBDTR4CAJ659F64TNJVN0NPQY","kind":"trait","bakedName":"MetaAdsHttp","curName":"MetaAdsHttp","renames":[],"owner":"workspace"},"trt_JJW2VT3T3NX1TRZZAP68CVKEEP":{"id":"trt_JJW2VT3T3NX1TRZZAP68CVKEEP","kind":"trait","bakedName":"MetaAdsTimeout","curName":"MetaAdsTimeout","renames":[],"owner":"workspace"}}}}