@milaboratories/pl-middle-layer 1.48.11 → 1.48.13

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 (589) hide show
  1. package/dist/_virtual/_@oxc-project_runtime@0.114.0/helpers/usingCtx.cjs +59 -0
  2. package/dist/_virtual/_@oxc-project_runtime@0.114.0/helpers/usingCtx.js +58 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +29 -0
  4. package/dist/block_registry/index.cjs +3 -0
  5. package/dist/block_registry/index.d.ts +3 -4
  6. package/dist/block_registry/index.js +3 -0
  7. package/dist/block_registry/registry-v2-provider.cjs +18 -19
  8. package/dist/block_registry/registry-v2-provider.cjs.map +1 -1
  9. package/dist/block_registry/registry-v2-provider.d.ts +10 -6
  10. package/dist/block_registry/registry-v2-provider.js +17 -17
  11. package/dist/block_registry/registry-v2-provider.js.map +1 -1
  12. package/dist/block_registry/registry.cjs +188 -219
  13. package/dist/block_registry/registry.cjs.map +1 -1
  14. package/dist/block_registry/registry.d.ts +18 -14
  15. package/dist/block_registry/registry.js +184 -217
  16. package/dist/block_registry/registry.js.map +1 -1
  17. package/dist/block_registry/watcher.cjs +141 -170
  18. package/dist/block_registry/watcher.cjs.map +1 -1
  19. package/dist/block_registry/watcher.d.ts +26 -24
  20. package/dist/block_registry/watcher.js +139 -168
  21. package/dist/block_registry/watcher.js.map +1 -1
  22. package/dist/block_registry/well_known_registries.cjs +9 -8
  23. package/dist/block_registry/well_known_registries.cjs.map +1 -1
  24. package/dist/block_registry/well_known_registries.d.ts +8 -4
  25. package/dist/block_registry/well_known_registries.js +9 -7
  26. package/dist/block_registry/well_known_registries.js.map +1 -1
  27. package/dist/cfg_render/executor.cjs +136 -137
  28. package/dist/cfg_render/executor.cjs.map +1 -1
  29. package/dist/cfg_render/executor.js +133 -135
  30. package/dist/cfg_render/executor.js.map +1 -1
  31. package/dist/cfg_render/renderer.cjs +354 -462
  32. package/dist/cfg_render/renderer.cjs.map +1 -1
  33. package/dist/cfg_render/renderer.js +353 -460
  34. package/dist/cfg_render/renderer.js.map +1 -1
  35. package/dist/cfg_render/traverse.cjs +58 -60
  36. package/dist/cfg_render/traverse.cjs.map +1 -1
  37. package/dist/cfg_render/traverse.js +57 -58
  38. package/dist/cfg_render/traverse.js.map +1 -1
  39. package/dist/cfg_render/util.cjs +14 -19
  40. package/dist/cfg_render/util.cjs.map +1 -1
  41. package/dist/cfg_render/util.js +14 -17
  42. package/dist/cfg_render/util.js.map +1 -1
  43. package/dist/debug/index.cjs +13 -17
  44. package/dist/debug/index.cjs.map +1 -1
  45. package/dist/debug/index.js +13 -16
  46. package/dist/debug/index.js.map +1 -1
  47. package/dist/dev_env/index.cjs +60 -44
  48. package/dist/dev_env/index.cjs.map +1 -1
  49. package/dist/dev_env/index.js +57 -33
  50. package/dist/dev_env/index.js.map +1 -1
  51. package/dist/dev_env/util.cjs +12 -32
  52. package/dist/dev_env/util.cjs.map +1 -1
  53. package/dist/dev_env/util.js +10 -11
  54. package/dist/dev_env/util.js.map +1 -1
  55. package/dist/index.cjs +75 -74
  56. package/dist/index.d.ts +21 -13
  57. package/dist/index.js +25 -18
  58. package/dist/js_render/computable_context.cjs +432 -568
  59. package/dist/js_render/computable_context.cjs.map +1 -1
  60. package/dist/js_render/computable_context.js +431 -566
  61. package/dist/js_render/computable_context.js.map +1 -1
  62. package/dist/js_render/context.cjs +184 -237
  63. package/dist/js_render/context.cjs.map +1 -1
  64. package/dist/js_render/context.js +184 -235
  65. package/dist/js_render/context.js.map +1 -1
  66. package/dist/js_render/index.cjs +137 -156
  67. package/dist/js_render/index.cjs.map +1 -1
  68. package/dist/js_render/index.js +136 -154
  69. package/dist/js_render/index.js.map +1 -1
  70. package/dist/middle_layer/active_cfg.cjs +28 -35
  71. package/dist/middle_layer/active_cfg.cjs.map +1 -1
  72. package/dist/middle_layer/active_cfg.js +27 -33
  73. package/dist/middle_layer/active_cfg.js.map +1 -1
  74. package/dist/middle_layer/block.cjs +36 -42
  75. package/dist/middle_layer/block.cjs.map +1 -1
  76. package/dist/middle_layer/block.js +35 -40
  77. package/dist/middle_layer/block.js.map +1 -1
  78. package/dist/middle_layer/block_ctx.cjs +91 -133
  79. package/dist/middle_layer/block_ctx.cjs.map +1 -1
  80. package/dist/middle_layer/block_ctx.js +90 -131
  81. package/dist/middle_layer/block_ctx.js.map +1 -1
  82. package/dist/middle_layer/block_ctx_unsafe.cjs +20 -19
  83. package/dist/middle_layer/block_ctx_unsafe.cjs.map +1 -1
  84. package/dist/middle_layer/block_ctx_unsafe.js +20 -18
  85. package/dist/middle_layer/block_ctx_unsafe.js.map +1 -1
  86. package/dist/middle_layer/driver_kit.cjs +47 -51
  87. package/dist/middle_layer/driver_kit.cjs.map +1 -1
  88. package/dist/middle_layer/driver_kit.d.ts +31 -27
  89. package/dist/middle_layer/driver_kit.js +46 -49
  90. package/dist/middle_layer/driver_kit.js.map +1 -1
  91. package/dist/middle_layer/frontend_path.cjs +49 -55
  92. package/dist/middle_layer/frontend_path.cjs.map +1 -1
  93. package/dist/middle_layer/frontend_path.js +48 -53
  94. package/dist/middle_layer/frontend_path.js.map +1 -1
  95. package/dist/middle_layer/index.cjs +4 -0
  96. package/dist/middle_layer/index.d.ts +4 -5
  97. package/dist/middle_layer/index.js +4 -0
  98. package/dist/middle_layer/middle_layer.cjs +216 -245
  99. package/dist/middle_layer/middle_layer.cjs.map +1 -1
  100. package/dist/middle_layer/middle_layer.d.ts +95 -91
  101. package/dist/middle_layer/middle_layer.js +215 -243
  102. package/dist/middle_layer/middle_layer.js.map +1 -1
  103. package/dist/middle_layer/navigation_states.cjs +45 -38
  104. package/dist/middle_layer/navigation_states.cjs.map +1 -1
  105. package/dist/middle_layer/navigation_states.js +44 -36
  106. package/dist/middle_layer/navigation_states.js.map +1 -1
  107. package/dist/middle_layer/ops.cjs +56 -57
  108. package/dist/middle_layer/ops.cjs.map +1 -1
  109. package/dist/middle_layer/ops.d.ts +86 -96
  110. package/dist/middle_layer/ops.js +54 -55
  111. package/dist/middle_layer/ops.js.map +1 -1
  112. package/dist/middle_layer/project.cjs +497 -527
  113. package/dist/middle_layer/project.cjs.map +1 -1
  114. package/dist/middle_layer/project.d.ts +155 -152
  115. package/dist/middle_layer/project.js +494 -525
  116. package/dist/middle_layer/project.js.map +1 -1
  117. package/dist/middle_layer/project_list.cjs +45 -43
  118. package/dist/middle_layer/project_list.cjs.map +1 -1
  119. package/dist/middle_layer/project_list.js +45 -41
  120. package/dist/middle_layer/project_list.js.map +1 -1
  121. package/dist/middle_layer/project_overview.cjs +202 -240
  122. package/dist/middle_layer/project_overview.cjs.map +1 -1
  123. package/dist/middle_layer/project_overview.js +201 -238
  124. package/dist/middle_layer/project_overview.js.map +1 -1
  125. package/dist/middle_layer/project_overview_light.cjs +11 -14
  126. package/dist/middle_layer/project_overview_light.cjs.map +1 -1
  127. package/dist/middle_layer/project_overview_light.js +10 -12
  128. package/dist/middle_layer/project_overview_light.js.map +1 -1
  129. package/dist/middle_layer/render.cjs +14 -18
  130. package/dist/middle_layer/render.cjs.map +1 -1
  131. package/dist/middle_layer/render.js +13 -16
  132. package/dist/middle_layer/render.js.map +1 -1
  133. package/dist/middle_layer/types.d.ts +7 -10
  134. package/dist/middle_layer/util.cjs +26 -21
  135. package/dist/middle_layer/util.cjs.map +1 -1
  136. package/dist/middle_layer/util.js +25 -19
  137. package/dist/middle_layer/util.js.map +1 -1
  138. package/dist/model/args.cjs +44 -53
  139. package/dist/model/args.cjs.map +1 -1
  140. package/dist/model/args.js +44 -51
  141. package/dist/model/args.js.map +1 -1
  142. package/dist/model/block_pack_spec.cjs +9 -5
  143. package/dist/model/block_pack_spec.cjs.map +1 -1
  144. package/dist/model/block_pack_spec.d.ts +34 -30
  145. package/dist/model/block_pack_spec.js +9 -4
  146. package/dist/model/block_pack_spec.js.map +1 -1
  147. package/dist/model/frontend.d.ts +8 -5
  148. package/dist/model/index.d.ts +2 -3
  149. package/dist/model/project_helper.cjs +154 -193
  150. package/dist/model/project_helper.cjs.map +1 -1
  151. package/dist/model/project_helper.d.ts +96 -92
  152. package/dist/model/project_helper.js +153 -191
  153. package/dist/model/project_helper.js.map +1 -1
  154. package/dist/model/project_model.cjs +33 -32
  155. package/dist/model/project_model.cjs.map +1 -1
  156. package/dist/model/project_model.d.ts +13 -64
  157. package/dist/model/project_model.js +34 -30
  158. package/dist/model/project_model.js.map +1 -1
  159. package/dist/model/project_model_util.cjs +119 -158
  160. package/dist/model/project_model_util.cjs.map +1 -1
  161. package/dist/model/project_model_util.js +120 -156
  162. package/dist/model/project_model_util.js.map +1 -1
  163. package/dist/model/project_model_v1.cjs +3 -2
  164. package/dist/model/project_model_v1.cjs.map +1 -1
  165. package/dist/model/project_model_v1.js +3 -1
  166. package/dist/model/project_model_v1.js.map +1 -1
  167. package/dist/model/template_spec.d.ts +20 -16
  168. package/dist/mutator/block-pack/block_pack.cjs +200 -223
  169. package/dist/mutator/block-pack/block_pack.cjs.map +1 -1
  170. package/dist/mutator/block-pack/block_pack.d.ts +20 -19
  171. package/dist/mutator/block-pack/block_pack.js +199 -221
  172. package/dist/mutator/block-pack/block_pack.js.map +1 -1
  173. package/dist/mutator/block-pack/frontend.cjs +14 -16
  174. package/dist/mutator/block-pack/frontend.cjs.map +1 -1
  175. package/dist/mutator/block-pack/frontend.js +13 -14
  176. package/dist/mutator/block-pack/frontend.js.map +1 -1
  177. package/dist/mutator/context_export.cjs +18 -17
  178. package/dist/mutator/context_export.cjs.map +1 -1
  179. package/dist/mutator/context_export.js +17 -15
  180. package/dist/mutator/context_export.js.map +1 -1
  181. package/dist/mutator/migration.cjs +86 -112
  182. package/dist/mutator/migration.cjs.map +1 -1
  183. package/dist/mutator/migration.js +85 -110
  184. package/dist/mutator/migration.js.map +1 -1
  185. package/dist/mutator/project.cjs +903 -1240
  186. package/dist/mutator/project.cjs.map +1 -1
  187. package/dist/mutator/project.js +901 -1237
  188. package/dist/mutator/project.js.map +1 -1
  189. package/dist/mutator/template/direct_template_loader.cjs +104 -130
  190. package/dist/mutator/template/direct_template_loader.cjs.map +1 -1
  191. package/dist/mutator/template/direct_template_loader.js +103 -128
  192. package/dist/mutator/template/direct_template_loader.js.map +1 -1
  193. package/dist/mutator/template/direct_template_loader_v3.cjs +104 -124
  194. package/dist/mutator/template/direct_template_loader_v3.cjs.map +1 -1
  195. package/dist/mutator/template/direct_template_loader_v3.js +103 -122
  196. package/dist/mutator/template/direct_template_loader_v3.js.map +1 -1
  197. package/dist/mutator/template/render_block.cjs +26 -30
  198. package/dist/mutator/template/render_block.cjs.map +1 -1
  199. package/dist/mutator/template/render_block.js +26 -23
  200. package/dist/mutator/template/render_block.js.map +1 -1
  201. package/dist/mutator/template/render_template.cjs +25 -25
  202. package/dist/mutator/template/render_template.cjs.map +1 -1
  203. package/dist/mutator/template/render_template.d.ts +6 -3
  204. package/dist/mutator/template/render_template.js +24 -23
  205. package/dist/mutator/template/render_template.js.map +1 -1
  206. package/dist/mutator/template/template_loading.cjs +42 -46
  207. package/dist/mutator/template/template_loading.cjs.map +1 -1
  208. package/dist/mutator/template/template_loading.d.ts +16 -12
  209. package/dist/mutator/template/template_loading.js +40 -44
  210. package/dist/mutator/template/template_loading.js.map +1 -1
  211. package/dist/network_check/network_check.cjs +149 -194
  212. package/dist/network_check/network_check.cjs.map +1 -1
  213. package/dist/network_check/network_check.d.ts +50 -66
  214. package/dist/network_check/network_check.js +146 -190
  215. package/dist/network_check/network_check.js.map +1 -1
  216. package/dist/network_check/pings.cjs +71 -69
  217. package/dist/network_check/pings.cjs.map +1 -1
  218. package/dist/network_check/pings.js +71 -65
  219. package/dist/network_check/pings.js.map +1 -1
  220. package/dist/network_check/template.cjs +256 -273
  221. package/dist/network_check/template.cjs.map +1 -1
  222. package/dist/network_check/template.js +253 -265
  223. package/dist/network_check/template.js.map +1 -1
  224. package/dist/pool/data.cjs +205 -226
  225. package/dist/pool/data.cjs.map +1 -1
  226. package/dist/pool/data.d.ts +10 -27
  227. package/dist/pool/data.js +196 -209
  228. package/dist/pool/data.js.map +1 -1
  229. package/dist/pool/driver.cjs +180 -207
  230. package/dist/pool/driver.cjs.map +1 -1
  231. package/dist/pool/driver.d.ts +12 -17
  232. package/dist/pool/driver.js +178 -205
  233. package/dist/pool/driver.js.map +1 -1
  234. package/dist/pool/index.cjs +2 -0
  235. package/dist/pool/index.d.ts +2 -3
  236. package/dist/pool/index.js +2 -0
  237. package/dist/pool/p_object_collection.cjs +67 -79
  238. package/dist/pool/p_object_collection.cjs.map +1 -1
  239. package/dist/pool/p_object_collection.d.ts +7 -28
  240. package/dist/pool/p_object_collection.js +65 -77
  241. package/dist/pool/p_object_collection.js.map +1 -1
  242. package/dist/pool/result_pool.cjs +217 -262
  243. package/dist/pool/result_pool.cjs.map +1 -1
  244. package/dist/pool/result_pool.d.ts +4 -27
  245. package/dist/pool/result_pool.js +216 -260
  246. package/dist/pool/result_pool.js.map +1 -1
  247. package/dist/worker/WorkerManager.cjs +51 -49
  248. package/dist/worker/WorkerManager.cjs.map +1 -1
  249. package/dist/worker/WorkerManager.js +49 -47
  250. package/dist/worker/WorkerManager.js.map +1 -1
  251. package/dist/worker/worker.cjs +19 -15
  252. package/dist/worker/worker.cjs.map +1 -1
  253. package/dist/worker/worker.d.ts +1 -2
  254. package/dist/worker/worker.js +18 -13
  255. package/dist/worker/worker.js.map +1 -1
  256. package/dist/worker/workerApi.cjs +14 -18
  257. package/dist/worker/workerApi.cjs.map +1 -1
  258. package/dist/worker/workerApi.js +13 -16
  259. package/dist/worker/workerApi.js.map +1 -1
  260. package/package.json +24 -24
  261. package/src/mutator/template/template_render.test.ts +22 -18
  262. package/dist/__external/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.52.4_tslib@2.8.1_typescript@5.6.3/__external/tslib/tslib.es6.cjs +0 -77
  263. package/dist/__external/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.52.4_tslib@2.8.1_typescript@5.6.3/__external/tslib/tslib.es6.cjs.map +0 -1
  264. package/dist/__external/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.52.4_tslib@2.8.1_typescript@5.6.3/__external/tslib/tslib.es6.js +0 -74
  265. package/dist/__external/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.52.4_tslib@2.8.1_typescript@5.6.3/__external/tslib/tslib.es6.js.map +0 -1
  266. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/classes/comparator.cjs +0 -162
  267. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/classes/comparator.cjs.map +0 -1
  268. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/classes/comparator.js +0 -160
  269. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/classes/comparator.js.map +0 -1
  270. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/classes/range.cjs +0 -576
  271. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/classes/range.cjs.map +0 -1
  272. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/classes/range.js +0 -574
  273. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/classes/range.js.map +0 -1
  274. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/classes/semver.cjs +0 -337
  275. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/classes/semver.cjs.map +0 -1
  276. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/classes/semver.js +0 -335
  277. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/classes/semver.js.map +0 -1
  278. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/clean.cjs +0 -22
  279. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/clean.cjs.map +0 -1
  280. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/clean.js +0 -20
  281. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/clean.js.map +0 -1
  282. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/cmp.cjs +0 -73
  283. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/cmp.cjs.map +0 -1
  284. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/cmp.js +0 -71
  285. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/cmp.js.map +0 -1
  286. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/coerce.cjs +0 -78
  287. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/coerce.cjs.map +0 -1
  288. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/coerce.js +0 -76
  289. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/coerce.js.map +0 -1
  290. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/compare-build.cjs +0 -23
  291. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/compare-build.cjs.map +0 -1
  292. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/compare-build.js +0 -21
  293. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/compare-build.js.map +0 -1
  294. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/compare-loose.cjs +0 -19
  295. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/compare-loose.cjs.map +0 -1
  296. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/compare-loose.js +0 -17
  297. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/compare-loose.js.map +0 -1
  298. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/compare.cjs +0 -21
  299. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/compare.cjs.map +0 -1
  300. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/compare.js +0 -19
  301. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/compare.js.map +0 -1
  302. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/diff.cjs +0 -74
  303. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/diff.cjs.map +0 -1
  304. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/diff.js +0 -72
  305. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/diff.js.map +0 -1
  306. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/eq.cjs +0 -19
  307. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/eq.cjs.map +0 -1
  308. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/eq.js +0 -17
  309. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/eq.js.map +0 -1
  310. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/gt.cjs +0 -19
  311. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/gt.cjs.map +0 -1
  312. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/gt.js +0 -17
  313. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/gt.js.map +0 -1
  314. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/gte.cjs +0 -19
  315. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/gte.cjs.map +0 -1
  316. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/gte.js +0 -17
  317. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/gte.js.map +0 -1
  318. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/inc.cjs +0 -35
  319. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/inc.cjs.map +0 -1
  320. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/inc.js +0 -33
  321. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/inc.js.map +0 -1
  322. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/lt.cjs +0 -19
  323. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/lt.cjs.map +0 -1
  324. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/lt.js +0 -17
  325. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/lt.js.map +0 -1
  326. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/lte.cjs +0 -19
  327. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/lte.cjs.map +0 -1
  328. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/lte.js +0 -17
  329. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/lte.js.map +0 -1
  330. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/major.cjs +0 -19
  331. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/major.cjs.map +0 -1
  332. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/major.js +0 -17
  333. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/major.js.map +0 -1
  334. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/minor.cjs +0 -19
  335. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/minor.cjs.map +0 -1
  336. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/minor.js +0 -17
  337. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/minor.js.map +0 -1
  338. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/neq.cjs +0 -19
  339. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/neq.cjs.map +0 -1
  340. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/neq.js +0 -17
  341. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/neq.js.map +0 -1
  342. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/parse.cjs +0 -32
  343. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/parse.cjs.map +0 -1
  344. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/parse.js +0 -30
  345. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/parse.js.map +0 -1
  346. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/patch.cjs +0 -19
  347. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/patch.cjs.map +0 -1
  348. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/patch.js +0 -17
  349. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/patch.js.map +0 -1
  350. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/prerelease.cjs +0 -22
  351. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/prerelease.cjs.map +0 -1
  352. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/prerelease.js +0 -20
  353. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/prerelease.js.map +0 -1
  354. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/rcompare.cjs +0 -19
  355. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/rcompare.cjs.map +0 -1
  356. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/rcompare.js +0 -17
  357. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/rcompare.js.map +0 -1
  358. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/rsort.cjs +0 -19
  359. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/rsort.cjs.map +0 -1
  360. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/rsort.js +0 -17
  361. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/rsort.js.map +0 -1
  362. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/satisfies.cjs +0 -26
  363. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/satisfies.cjs.map +0 -1
  364. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/satisfies.js +0 -24
  365. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/satisfies.js.map +0 -1
  366. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/sort.cjs +0 -19
  367. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/sort.cjs.map +0 -1
  368. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/sort.js +0 -17
  369. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/sort.js.map +0 -1
  370. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/valid.cjs +0 -22
  371. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/valid.cjs.map +0 -1
  372. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/valid.js +0 -20
  373. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/functions/valid.js.map +0 -1
  374. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/index.cjs +0 -145
  375. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/index.cjs.map +0 -1
  376. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/index.js +0 -143
  377. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/index.js.map +0 -1
  378. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/constants.cjs +0 -49
  379. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/constants.cjs.map +0 -1
  380. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/constants.js +0 -47
  381. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/constants.js.map +0 -1
  382. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/debug.cjs +0 -23
  383. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/debug.cjs.map +0 -1
  384. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/debug.js +0 -21
  385. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/debug.js.map +0 -1
  386. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/identifiers.cjs +0 -37
  387. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/identifiers.cjs.map +0 -1
  388. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/identifiers.js +0 -35
  389. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/identifiers.js.map +0 -1
  390. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/lrucache.cjs +0 -54
  391. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/lrucache.cjs.map +0 -1
  392. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/lrucache.js +0 -52
  393. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/lrucache.js.map +0 -1
  394. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/parse-options.cjs +0 -29
  395. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/parse-options.cjs.map +0 -1
  396. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/parse-options.js +0 -27
  397. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/parse-options.js.map +0 -1
  398. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/re.cjs +0 -240
  399. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/re.cjs.map +0 -1
  400. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/re.js +0 -238
  401. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/internal/re.js.map +0 -1
  402. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/gtr.cjs +0 -20
  403. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/gtr.cjs.map +0 -1
  404. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/gtr.js +0 -18
  405. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/gtr.js.map +0 -1
  406. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/intersects.cjs +0 -23
  407. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/intersects.cjs.map +0 -1
  408. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/intersects.js +0 -21
  409. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/intersects.js.map +0 -1
  410. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/ltr.cjs +0 -20
  411. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/ltr.cjs.map +0 -1
  412. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/ltr.js +0 -18
  413. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/ltr.js.map +0 -1
  414. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/max-satisfying.cjs +0 -42
  415. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/max-satisfying.cjs.map +0 -1
  416. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/max-satisfying.js +0 -40
  417. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/max-satisfying.js.map +0 -1
  418. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/min-satisfying.cjs +0 -41
  419. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/min-satisfying.cjs.map +0 -1
  420. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/min-satisfying.js +0 -39
  421. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/min-satisfying.js.map +0 -1
  422. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/min-version.cjs +0 -79
  423. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/min-version.cjs.map +0 -1
  424. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/min-version.js +0 -77
  425. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/min-version.js.map +0 -1
  426. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/outside.cjs +0 -103
  427. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/outside.cjs.map +0 -1
  428. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/outside.js +0 -101
  429. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/outside.js.map +0 -1
  430. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/simplify.cjs +0 -64
  431. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/simplify.cjs.map +0 -1
  432. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/simplify.js +0 -62
  433. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/simplify.js.map +0 -1
  434. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/subset.cjs +0 -266
  435. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/subset.cjs.map +0 -1
  436. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/subset.js +0 -264
  437. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/subset.js.map +0 -1
  438. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/to-comparators.cjs +0 -24
  439. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/to-comparators.cjs.map +0 -1
  440. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/to-comparators.js +0 -22
  441. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/to-comparators.js.map +0 -1
  442. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/valid.cjs +0 -27
  443. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/valid.cjs.map +0 -1
  444. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/valid.js +0 -25
  445. package/dist/__external/.pnpm/semver@7.7.2/__external/semver/ranges/valid.js.map +0 -1
  446. package/dist/_virtual/index.cjs +0 -8
  447. package/dist/_virtual/index.cjs.map +0 -1
  448. package/dist/_virtual/index.js +0 -6
  449. package/dist/_virtual/index.js.map +0 -1
  450. package/dist/_virtual/re.cjs +0 -6
  451. package/dist/_virtual/re.cjs.map +0 -1
  452. package/dist/_virtual/re.js +0 -4
  453. package/dist/_virtual/re.js.map +0 -1
  454. package/dist/block_registry/index.d.ts.map +0 -1
  455. package/dist/block_registry/registry-v2-provider.d.ts.map +0 -1
  456. package/dist/block_registry/registry.d.ts.map +0 -1
  457. package/dist/block_registry/registry.test.d.ts +0 -2
  458. package/dist/block_registry/registry.test.d.ts.map +0 -1
  459. package/dist/block_registry/watcher.d.ts.map +0 -1
  460. package/dist/block_registry/well_known_registries.d.ts.map +0 -1
  461. package/dist/cfg_render/executor.d.ts +0 -9
  462. package/dist/cfg_render/executor.d.ts.map +0 -1
  463. package/dist/cfg_render/executor.test.d.ts +0 -2
  464. package/dist/cfg_render/executor.test.d.ts.map +0 -1
  465. package/dist/cfg_render/operation.d.ts +0 -29
  466. package/dist/cfg_render/operation.d.ts.map +0 -1
  467. package/dist/cfg_render/renderer.d.ts +0 -6
  468. package/dist/cfg_render/renderer.d.ts.map +0 -1
  469. package/dist/cfg_render/traverse.d.ts +0 -3
  470. package/dist/cfg_render/traverse.d.ts.map +0 -1
  471. package/dist/cfg_render/util.d.ts +0 -5
  472. package/dist/cfg_render/util.d.ts.map +0 -1
  473. package/dist/debug/index.d.ts +0 -9
  474. package/dist/debug/index.d.ts.map +0 -1
  475. package/dist/dev_env/index.d.ts +0 -21
  476. package/dist/dev_env/index.d.ts.map +0 -1
  477. package/dist/dev_env/util.d.ts +0 -3
  478. package/dist/dev_env/util.d.ts.map +0 -1
  479. package/dist/index.cjs.map +0 -1
  480. package/dist/index.d.ts.map +0 -1
  481. package/dist/index.js.map +0 -1
  482. package/dist/js_render/computable_context.d.ts +0 -74
  483. package/dist/js_render/computable_context.d.ts.map +0 -1
  484. package/dist/js_render/context.d.ts +0 -73
  485. package/dist/js_render/context.d.ts.map +0 -1
  486. package/dist/js_render/index.d.ts +0 -57
  487. package/dist/js_render/index.d.ts.map +0 -1
  488. package/dist/middle_layer/active_cfg.d.ts +0 -6
  489. package/dist/middle_layer/active_cfg.d.ts.map +0 -1
  490. package/dist/middle_layer/block.d.ts +0 -10
  491. package/dist/middle_layer/block.d.ts.map +0 -1
  492. package/dist/middle_layer/block_ctx.d.ts +0 -23
  493. package/dist/middle_layer/block_ctx.d.ts.map +0 -1
  494. package/dist/middle_layer/block_ctx_unsafe.d.ts +0 -16
  495. package/dist/middle_layer/block_ctx_unsafe.d.ts.map +0 -1
  496. package/dist/middle_layer/driver_kit.d.ts.map +0 -1
  497. package/dist/middle_layer/frontend_path.d.ts +0 -6
  498. package/dist/middle_layer/frontend_path.d.ts.map +0 -1
  499. package/dist/middle_layer/index.d.ts.map +0 -1
  500. package/dist/middle_layer/middle_layer.d.ts.map +0 -1
  501. package/dist/middle_layer/navigation_states.d.ts +0 -10
  502. package/dist/middle_layer/navigation_states.d.ts.map +0 -1
  503. package/dist/middle_layer/ops.d.ts.map +0 -1
  504. package/dist/middle_layer/project.d.ts.map +0 -1
  505. package/dist/middle_layer/project_list.d.ts +0 -11
  506. package/dist/middle_layer/project_list.d.ts.map +0 -1
  507. package/dist/middle_layer/project_overview.d.ts +0 -8
  508. package/dist/middle_layer/project_overview.d.ts.map +0 -1
  509. package/dist/middle_layer/project_overview_light.d.ts +0 -8
  510. package/dist/middle_layer/project_overview_light.d.ts.map +0 -1
  511. package/dist/middle_layer/render.d.ts +0 -7
  512. package/dist/middle_layer/render.d.ts.map +0 -1
  513. package/dist/middle_layer/render.test.d.ts +0 -5
  514. package/dist/middle_layer/render.test.d.ts.map +0 -1
  515. package/dist/middle_layer/types.d.ts.map +0 -1
  516. package/dist/middle_layer/util.d.ts +0 -16
  517. package/dist/middle_layer/util.d.ts.map +0 -1
  518. package/dist/model/args.d.ts +0 -14
  519. package/dist/model/args.d.ts.map +0 -1
  520. package/dist/model/block_pack.d.ts +0 -8
  521. package/dist/model/block_pack.d.ts.map +0 -1
  522. package/dist/model/block_pack_spec.d.ts.map +0 -1
  523. package/dist/model/frontend.d.ts.map +0 -1
  524. package/dist/model/index.d.ts.map +0 -1
  525. package/dist/model/project_helper.d.ts.map +0 -1
  526. package/dist/model/project_model.d.ts.map +0 -1
  527. package/dist/model/project_model.test.d.ts +0 -2
  528. package/dist/model/project_model.test.d.ts.map +0 -1
  529. package/dist/model/project_model_util.d.ts +0 -43
  530. package/dist/model/project_model_util.d.ts.map +0 -1
  531. package/dist/model/project_model_util.test.d.ts +0 -2
  532. package/dist/model/project_model_util.test.d.ts.map +0 -1
  533. package/dist/model/project_model_v1.d.ts +0 -8
  534. package/dist/model/project_model_v1.d.ts.map +0 -1
  535. package/dist/model/template_spec.d.ts.map +0 -1
  536. package/dist/mutator/block-pack/block_pack.d.ts.map +0 -1
  537. package/dist/mutator/block-pack/block_pack.test.d.ts +0 -2
  538. package/dist/mutator/block-pack/block_pack.test.d.ts.map +0 -1
  539. package/dist/mutator/block-pack/frontend.d.ts +0 -4
  540. package/dist/mutator/block-pack/frontend.d.ts.map +0 -1
  541. package/dist/mutator/context_export.d.ts +0 -9
  542. package/dist/mutator/context_export.d.ts.map +0 -1
  543. package/dist/mutator/migration.d.ts +0 -9
  544. package/dist/mutator/migration.d.ts.map +0 -1
  545. package/dist/mutator/project-v3.test.d.ts +0 -2
  546. package/dist/mutator/project-v3.test.d.ts.map +0 -1
  547. package/dist/mutator/project.d.ts +0 -211
  548. package/dist/mutator/project.d.ts.map +0 -1
  549. package/dist/mutator/project.test.d.ts +0 -2
  550. package/dist/mutator/project.test.d.ts.map +0 -1
  551. package/dist/mutator/template/direct_template_loader.d.ts +0 -5
  552. package/dist/mutator/template/direct_template_loader.d.ts.map +0 -1
  553. package/dist/mutator/template/direct_template_loader_v3.d.ts +0 -15
  554. package/dist/mutator/template/direct_template_loader_v3.d.ts.map +0 -1
  555. package/dist/mutator/template/render_block.d.ts +0 -32
  556. package/dist/mutator/template/render_block.d.ts.map +0 -1
  557. package/dist/mutator/template/render_template.d.ts.map +0 -1
  558. package/dist/mutator/template/template_loading.d.ts.map +0 -1
  559. package/dist/mutator/template/template_render.test.d.ts +0 -2
  560. package/dist/mutator/template/template_render.test.d.ts.map +0 -1
  561. package/dist/network_check/network_check.d.ts.map +0 -1
  562. package/dist/network_check/network_check.test.d.ts +0 -2
  563. package/dist/network_check/network_check.test.d.ts.map +0 -1
  564. package/dist/network_check/pings.d.ts +0 -32
  565. package/dist/network_check/pings.d.ts.map +0 -1
  566. package/dist/network_check/template.d.ts +0 -57
  567. package/dist/network_check/template.d.ts.map +0 -1
  568. package/dist/network_check/template.test.d.ts +0 -2
  569. package/dist/network_check/template.test.d.ts.map +0 -1
  570. package/dist/network_check/test_utils.d.ts +0 -6
  571. package/dist/network_check/test_utils.d.ts.map +0 -1
  572. package/dist/pool/data.d.ts.map +0 -1
  573. package/dist/pool/driver.d.ts.map +0 -1
  574. package/dist/pool/index.d.ts.map +0 -1
  575. package/dist/pool/p_object_collection.d.ts.map +0 -1
  576. package/dist/pool/result_pool.d.ts.map +0 -1
  577. package/dist/test/block_packs.d.ts +0 -6
  578. package/dist/test/block_packs.d.ts.map +0 -1
  579. package/dist/test/explicit_templates.d.ts +0 -3
  580. package/dist/test/explicit_templates.d.ts.map +0 -1
  581. package/dist/test/known_templates.d.ts +0 -6
  582. package/dist/test/known_templates.d.ts.map +0 -1
  583. package/dist/test_env.d.ts +0 -6
  584. package/dist/test_env.d.ts.map +0 -1
  585. package/dist/worker/WorkerManager.d.ts +0 -12
  586. package/dist/worker/WorkerManager.d.ts.map +0 -1
  587. package/dist/worker/worker.d.ts.map +0 -1
  588. package/dist/worker/workerApi.d.ts +0 -15
  589. package/dist/worker/workerApi.d.ts.map +0 -1
@@ -1,1254 +1,917 @@
1
- 'use strict';
2
-
3
- var plClient = require('@milaboratories/pl-client');
4
- var render_block = require('./template/render_block.cjs');
5
- var project_model = require('../model/project_model.cjs');
6
- var block_pack = require('./block-pack/block_pack.cjs');
7
- var project_model_util = require('../model/project_model_util.cjs');
8
- var plModelMiddleLayer = require('@milaboratories/pl-model-middle-layer');
9
- var Denque = require('denque');
10
- var context_export = require('./context_export.cjs');
11
- var template_loading = require('./template/template_loading.cjs');
12
- var tsHelpers = require('@milaboratories/ts-helpers');
13
- var model = require('@platforma-sdk/model');
14
- var index = require('../debug/index.cjs');
1
+ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
+ const require_project_model = require('../model/project_model.cjs');
3
+ const require_render_block = require('./template/render_block.cjs');
4
+ const require_template_loading = require('./template/template_loading.cjs');
5
+ const require_block_pack = require('./block-pack/block_pack.cjs');
6
+ const require_project_model_util = require('../model/project_model_util.cjs');
7
+ const require_context_export = require('./context_export.cjs');
8
+ const require_index = require('../debug/index.cjs');
9
+ let _platforma_sdk_model = require("@platforma-sdk/model");
10
+ let _milaboratories_pl_model_middle_layer = require("@milaboratories/pl-model-middle-layer");
11
+ let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
12
+ let _milaboratories_pl_client = require("@milaboratories/pl-client");
13
+ let denque = require("denque");
14
+ denque = require_runtime.__toESM(denque);
15
15
 
16
+ //#region src/mutator/project.ts
16
17
  function cached(modIdCb, valueCb) {
17
- let initialized = false;
18
- let lastModId = undefined;
19
- let value = undefined;
20
- return () => {
21
- if (!initialized) {
22
- initialized = true;
23
- lastModId = modIdCb();
24
- value = valueCb();
25
- return value;
26
- }
27
- const currentModId = modIdCb();
28
- if (lastModId !== currentModId) {
29
- lastModId = currentModId;
30
- value = valueCb();
31
- }
32
- return valueCb();
33
- };
34
- }
35
- class BlockInfo {
36
- id;
37
- fields;
38
- config;
39
- source;
40
- constructor(id, fields, config, source) {
41
- this.id = id;
42
- this.fields = fields;
43
- this.config = config;
44
- this.source = source;
45
- }
46
- check() {
47
- // state assertions
48
- if ((this.fields.prodOutput === undefined) !== (this.fields.prodCtx === undefined))
49
- throw new Error("inconsistent prod fields");
50
- if ((this.fields.stagingOutput === undefined) !== (this.fields.stagingCtx === undefined))
51
- throw new Error("inconsistent stage fields");
52
- if ((this.fields.prodOutputPrevious === undefined) !==
53
- (this.fields.prodCtxPrevious === undefined))
54
- throw new Error("inconsistent prod cache fields");
55
- if ((this.fields.stagingOutputPrevious === undefined) !==
56
- (this.fields.stagingCtxPrevious === undefined))
57
- throw new Error("inconsistent stage cache fields");
58
- if (this.fields.blockPack === undefined)
59
- throw new Error("no block pack field");
60
- if (this.fields.blockStorage === undefined)
61
- throw new Error("no block storage field");
62
- }
63
- currentArgsC = cached(() => this.fields.currentArgs?.modCount, () => {
64
- const bin = this.fields.currentArgs?.value;
65
- if (bin === undefined)
66
- return undefined;
67
- return tsHelpers.cachedDeserialize(bin);
68
- });
69
- blockStorageC = cached(() => this.fields.blockStorage.modCount, () => {
70
- const bin = this.fields.blockStorage?.value;
71
- if (bin === undefined)
72
- return undefined;
73
- return tsHelpers.cachedDeserialize(bin);
74
- });
75
- blockStorageJ = cached(() => this.fields.blockStorage.modCount, () => {
76
- const bin = this.fields.blockStorage?.value;
77
- if (bin === undefined)
78
- return undefined;
79
- return tsHelpers.cachedDecode(bin);
80
- });
81
- prodArgsC = cached(() => this.fields.prodArgs?.modCount, () => {
82
- const bin = this.fields.prodArgs?.value;
83
- if (bin === undefined)
84
- return undefined;
85
- return tsHelpers.cachedDeserialize(bin);
86
- });
87
- currentPrerunArgsC = cached(() => this.fields.currentPrerunArgs?.modCount, () => {
88
- const bin = this.fields.currentPrerunArgs?.value;
89
- if (bin === undefined)
90
- return undefined;
91
- return tsHelpers.cachedDeserialize(bin);
92
- });
93
- get currentArgs() {
94
- return this.currentArgsC();
95
- }
96
- get blockStorage() {
97
- try {
98
- return this.blockStorageC();
99
- }
100
- catch (e) {
101
- console.error("Error getting blockStorage:", e);
102
- return undefined;
103
- }
104
- }
105
- get blockStorageJson() {
106
- return this.blockStorageJ();
107
- }
108
- get currentPrerunArgs() {
109
- return this.currentPrerunArgsC();
110
- }
111
- get stagingRendered() {
112
- return this.fields.stagingCtx !== undefined;
113
- }
114
- get productionRendered() {
115
- return this.fields.prodCtx !== undefined;
116
- }
117
- get productionHasErrors() {
118
- return this.fields.prodUiCtx?.status === "Error";
119
- }
120
- productionStaleC = cached(() => `${this.fields.currentArgs.modCount}_${this.fields.prodArgs?.modCount}`, () => this.fields.prodArgs === undefined ||
121
- Buffer.compare(this.fields.currentArgs.value, this.fields.prodArgs.value) !== 0);
122
- get requireProductionRendering() {
123
- return !this.productionRendered || this.productionStaleC() || this.productionHasErrors;
124
- }
125
- /** Returns true if staging should be re-rendered (stagingCtx is not set) */
126
- get requireStagingRendering() {
127
- // No staging needed if currentPrerunArgs is undefined (args derivation failed)
128
- if (this.fields.currentPrerunArgs === undefined)
129
- return false;
130
- return !this.stagingRendered;
131
- }
132
- get prodArgs() {
133
- return this.prodArgsC();
134
- }
135
- getTemplate(tx) {
136
- return tx.getFutureFieldValue(plClient.Pl.unwrapHolder(tx, this.fields.blockPack.ref), block_pack.BlockPackTemplateField, "Input");
137
- }
18
+ let initialized = false;
19
+ let lastModId = void 0;
20
+ let value = void 0;
21
+ return () => {
22
+ if (!initialized) {
23
+ initialized = true;
24
+ lastModId = modIdCb();
25
+ value = valueCb();
26
+ return value;
27
+ }
28
+ const currentModId = modIdCb();
29
+ if (lastModId !== currentModId) {
30
+ lastModId = currentModId;
31
+ value = valueCb();
32
+ }
33
+ return valueCb();
34
+ };
138
35
  }
36
+ var BlockInfo = class {
37
+ constructor(id, fields, config, source) {
38
+ this.id = id;
39
+ this.fields = fields;
40
+ this.config = config;
41
+ this.source = source;
42
+ }
43
+ check() {
44
+ if (this.fields.prodOutput === void 0 !== (this.fields.prodCtx === void 0)) throw new Error("inconsistent prod fields");
45
+ if (this.fields.stagingOutput === void 0 !== (this.fields.stagingCtx === void 0)) throw new Error("inconsistent stage fields");
46
+ if (this.fields.prodOutputPrevious === void 0 !== (this.fields.prodCtxPrevious === void 0)) throw new Error("inconsistent prod cache fields");
47
+ if (this.fields.stagingOutputPrevious === void 0 !== (this.fields.stagingCtxPrevious === void 0)) throw new Error("inconsistent stage cache fields");
48
+ if (this.fields.blockPack === void 0) throw new Error("no block pack field");
49
+ if (this.fields.blockStorage === void 0) throw new Error("no block storage field");
50
+ }
51
+ currentArgsC = cached(() => this.fields.currentArgs?.modCount, () => {
52
+ const bin = this.fields.currentArgs?.value;
53
+ if (bin === void 0) return void 0;
54
+ return (0, _milaboratories_ts_helpers.cachedDeserialize)(bin);
55
+ });
56
+ blockStorageC = cached(() => this.fields.blockStorage.modCount, () => {
57
+ const bin = this.fields.blockStorage?.value;
58
+ if (bin === void 0) return void 0;
59
+ return (0, _milaboratories_ts_helpers.cachedDeserialize)(bin);
60
+ });
61
+ blockStorageJ = cached(() => this.fields.blockStorage.modCount, () => {
62
+ const bin = this.fields.blockStorage?.value;
63
+ if (bin === void 0) return void 0;
64
+ return (0, _milaboratories_ts_helpers.cachedDecode)(bin);
65
+ });
66
+ prodArgsC = cached(() => this.fields.prodArgs?.modCount, () => {
67
+ const bin = this.fields.prodArgs?.value;
68
+ if (bin === void 0) return void 0;
69
+ return (0, _milaboratories_ts_helpers.cachedDeserialize)(bin);
70
+ });
71
+ currentPrerunArgsC = cached(() => this.fields.currentPrerunArgs?.modCount, () => {
72
+ const bin = this.fields.currentPrerunArgs?.value;
73
+ if (bin === void 0) return void 0;
74
+ return (0, _milaboratories_ts_helpers.cachedDeserialize)(bin);
75
+ });
76
+ get currentArgs() {
77
+ return this.currentArgsC();
78
+ }
79
+ get blockStorage() {
80
+ try {
81
+ return this.blockStorageC();
82
+ } catch (e) {
83
+ console.error("Error getting blockStorage:", e);
84
+ return;
85
+ }
86
+ }
87
+ get blockStorageJson() {
88
+ return this.blockStorageJ();
89
+ }
90
+ get currentPrerunArgs() {
91
+ return this.currentPrerunArgsC();
92
+ }
93
+ get stagingRendered() {
94
+ return this.fields.stagingCtx !== void 0;
95
+ }
96
+ get productionRendered() {
97
+ return this.fields.prodCtx !== void 0;
98
+ }
99
+ get productionHasErrors() {
100
+ return this.fields.prodUiCtx?.status === "Error";
101
+ }
102
+ productionStaleC = cached(() => `${this.fields.currentArgs.modCount}_${this.fields.prodArgs?.modCount}`, () => this.fields.prodArgs === void 0 || Buffer.compare(this.fields.currentArgs.value, this.fields.prodArgs.value) !== 0);
103
+ get requireProductionRendering() {
104
+ return !this.productionRendered || this.productionStaleC() || this.productionHasErrors;
105
+ }
106
+ /** Returns true if staging should be re-rendered (stagingCtx is not set) */
107
+ get requireStagingRendering() {
108
+ if (this.fields.currentPrerunArgs === void 0) return false;
109
+ return !this.stagingRendered;
110
+ }
111
+ get prodArgs() {
112
+ return this.prodArgsC();
113
+ }
114
+ getTemplate(tx) {
115
+ return tx.getFutureFieldValue(_milaboratories_pl_client.Pl.unwrapHolder(tx, this.fields.blockPack.ref), require_block_pack.BlockPackTemplateField, "Input");
116
+ }
117
+ };
139
118
  const NoNewBlocks = (blockId) => {
140
- throw new Error(`No new block info for ${blockId}`);
119
+ throw new Error(`No new block info for ${blockId}`);
141
120
  };
142
- class ProjectMutator {
143
- rid;
144
- tx;
145
- author;
146
- schema;
147
- lastModified;
148
- meta;
149
- struct;
150
- renderingState;
151
- blocksInLimbo;
152
- blockInfos;
153
- ctxExportTplHolder;
154
- projectHelper;
155
- globalModCount = 0;
156
- fieldsChanged = false;
157
- //
158
- // Change trackers
159
- //
160
- lastModifiedChanged = false;
161
- structureChanged = false;
162
- metaChanged = false;
163
- renderingStateChanged = false;
164
- /** Set blocks will be assigned current mutator author marker on save */
165
- blocksWithChangedInputs = new Set();
166
- constructor(rid, tx, author, schema, lastModified, meta, struct, renderingState, blocksInLimbo, blockInfos, ctxExportTplHolder, projectHelper) {
167
- this.rid = rid;
168
- this.tx = tx;
169
- this.author = author;
170
- this.schema = schema;
171
- this.lastModified = lastModified;
172
- this.meta = meta;
173
- this.struct = struct;
174
- this.renderingState = renderingState;
175
- this.blocksInLimbo = blocksInLimbo;
176
- this.blockInfos = blockInfos;
177
- this.ctxExportTplHolder = ctxExportTplHolder;
178
- this.projectHelper = projectHelper;
179
- }
180
- fixProblemsAndMigrate() {
181
- // Fixing problems introduced by old code
182
- this.blockInfos.forEach((blockInfo) => {
183
- if (blockInfo.fields.prodArgs === undefined ||
184
- blockInfo.fields.prodOutput === undefined ||
185
- blockInfo.fields.prodCtx === undefined)
186
- this.deleteBlockFields(blockInfo.id, "prodArgs", "prodOutput", "prodCtx");
187
- });
188
- // Migration for addition of block settings field
189
- let initialBlockSettings;
190
- this.blockInfos.forEach((blockInfo) => {
191
- if (blockInfo.fields.blockSettings === undefined) {
192
- if (initialBlockSettings === undefined)
193
- initialBlockSettings = this.createJsonFieldValue(plModelMiddleLayer.InitialBlockSettings);
194
- this.setBlockFieldObj(blockInfo.id, "blockSettings", initialBlockSettings);
195
- }
196
- });
197
- }
198
- get wasModified() {
199
- return (this.lastModifiedChanged ||
200
- this.structureChanged ||
201
- this.fieldsChanged ||
202
- this.metaChanged ||
203
- this.renderingStateChanged);
204
- }
205
- get structure() {
206
- return JSON.parse(JSON.stringify(this.struct));
207
- }
208
- //
209
- // Graph calculation
210
- //
211
- stagingGraph = undefined;
212
- pendingProductionGraph = undefined;
213
- actualProductionGraph = undefined;
214
- getStagingGraph() {
215
- if (this.stagingGraph === undefined)
216
- this.stagingGraph = project_model_util.stagingGraph(this.struct);
217
- return this.stagingGraph;
218
- }
219
- getProductionGraphBlockInfo(blockId, prod) {
220
- const bInfo = this.getBlockInfo(blockId);
221
- let argsField;
222
- let args;
223
- if (prod) {
224
- if (bInfo.fields.prodArgs === undefined)
225
- return undefined;
226
- argsField = bInfo.fields.prodArgs;
227
- args = bInfo.prodArgs;
228
- }
229
- else {
230
- argsField = bInfo.fields.currentArgs;
231
- args = bInfo.currentArgs;
232
- }
233
- // Can't compute enrichment targets without args
234
- if (argsField === undefined) {
235
- return { args, enrichmentTargets: undefined };
236
- }
237
- const blockPackField = tsHelpers.notEmpty(bInfo.fields.blockPack);
238
- if (plClient.isResourceId(argsField.ref) && plClient.isResourceId(blockPackField.ref))
239
- return {
240
- args,
241
- enrichmentTargets: this.projectHelper.getEnrichmentTargets(() => bInfo.config, () => args, { argsRid: argsField.ref, blockPackRid: blockPackField.ref }),
242
- };
243
- else
244
- return {
245
- args,
246
- enrichmentTargets: this.projectHelper.getEnrichmentTargets(() => bInfo.config, () => args),
247
- };
248
- }
249
- getPendingProductionGraph() {
250
- if (this.pendingProductionGraph === undefined)
251
- this.pendingProductionGraph = project_model_util.productionGraph(this.struct, (blockId) => this.getProductionGraphBlockInfo(blockId, false));
252
- return this.pendingProductionGraph;
253
- }
254
- getActualProductionGraph() {
255
- if (this.actualProductionGraph === undefined)
256
- this.actualProductionGraph = project_model_util.productionGraph(this.struct, (blockId) => this.getProductionGraphBlockInfo(blockId, true));
257
- return this.actualProductionGraph;
258
- }
259
- //
260
- // Generic helpers to interact with project state
261
- //
262
- getBlockInfo(blockId) {
263
- const info = this.blockInfos.get(blockId);
264
- if (info === undefined)
265
- throw new Error(`No such block: ${blockId}`);
266
- return info;
267
- }
268
- createJsonFieldValueByContent(content) {
269
- if (content === undefined)
270
- throw new Error("content is undefined");
271
- const value = Buffer.from(content);
272
- const ref = this.tx.createValue(plClient.Pl.JsonObject, value);
273
- return { ref, value, status: "Ready" };
274
- }
275
- createJsonFieldValue(obj) {
276
- return this.createJsonFieldValueByContent(JSON.stringify(obj));
277
- }
278
- getBlock(blockId) {
279
- for (const block of project_model_util.allBlocks(this.struct))
280
- if (block.id === blockId)
281
- return block;
282
- throw new Error("block not found");
283
- }
284
- setBlockFieldObj(blockId, fieldName, state) {
285
- const fid = plClient.field(this.rid, project_model.projectFieldName(blockId, fieldName));
286
- if (state.ref === undefined)
287
- throw new Error("Can't set value with empty ref");
288
- if (this.getBlockInfo(blockId).fields[fieldName] === undefined)
289
- this.tx.createField(fid, "Dynamic", state.ref);
290
- else
291
- this.tx.setField(fid, state.ref);
292
- this.getBlockInfo(blockId).fields[fieldName] = {
293
- modCount: this.globalModCount++,
294
- ...state,
295
- };
296
- this.fieldsChanged = true;
297
- }
298
- setBlockField(blockId, fieldName, ref, status, value) {
299
- this.setBlockFieldObj(blockId, fieldName, { ref, status, value });
300
- }
301
- deleteBlockFields(blockId, ...fieldNames) {
302
- let deleted = false;
303
- const info = this.getBlockInfo(blockId);
304
- for (const fieldName of fieldNames) {
305
- const fields = info.fields;
306
- if (!(fieldName in fields))
307
- continue;
308
- this.tx.removeField(plClient.field(this.rid, project_model.projectFieldName(blockId, fieldName)));
309
- delete fields[fieldName];
310
- this.fieldsChanged = true;
311
- deleted = true;
312
- }
313
- return deleted;
314
- }
315
- updateLastModified() {
316
- this.lastModified = Date.now();
317
- this.lastModifiedChanged = true;
318
- }
319
- //
320
- // Main project actions
321
- //
322
- resetStagingRefreshTimestamp() {
323
- this.renderingState.stagingRefreshTimestamp = Date.now();
324
- this.renderingStateChanged = true;
325
- }
326
- resetStaging(blockId) {
327
- const fields = this.getBlockInfo(blockId).fields;
328
- if (fields.stagingOutput?.status === "Ready" &&
329
- fields.stagingCtx?.status === "Ready" &&
330
- fields.stagingUiCtx?.status === "Ready") {
331
- this.setBlockFieldObj(blockId, "stagingOutputPrevious", fields.stagingOutput);
332
- this.setBlockFieldObj(blockId, "stagingCtxPrevious", fields.stagingCtx);
333
- this.setBlockFieldObj(blockId, "stagingUiCtxPrevious", fields.stagingUiCtx);
334
- }
335
- if (this.deleteBlockFields(blockId, "stagingOutput", "stagingCtx", "stagingUiCtx"))
336
- this.resetStagingRefreshTimestamp();
337
- }
338
- resetProduction(blockId) {
339
- const fields = this.getBlockInfo(blockId).fields;
340
- if (fields.prodOutput?.status === "Ready" &&
341
- fields.prodCtx?.status === "Ready" &&
342
- fields.prodUiCtx?.status === "Ready") {
343
- this.setBlockFieldObj(blockId, "prodOutputPrevious", fields.prodOutput);
344
- this.setBlockFieldObj(blockId, "prodCtxPrevious", fields.prodCtx);
345
- this.setBlockFieldObj(blockId, "prodUiCtxPrevious", fields.prodUiCtx);
346
- }
347
- this.deleteBlockFields(blockId, "prodOutput", "prodCtx", "prodUiCtx", "prodArgs");
348
- }
349
- /** Running blocks are reset, already computed moved to limbo. Returns if
350
- * either of the actions were actually performed.
351
- * This method ensures the block is left in a consistent state that passes check() constraints. */
352
- resetOrLimboProduction(blockId) {
353
- const fields = this.getBlockInfo(blockId).fields;
354
- // Check if we can safely move to limbo (both core production fields are ready)
355
- if (fields.prodOutput?.status === "Ready" && fields.prodCtx?.status === "Ready") {
356
- if (this.blocksInLimbo.has(blockId))
357
- // we are already in limbo
358
- return false;
359
- // limbo - keep the ready production results but clean up cache
360
- this.blocksInLimbo.add(blockId);
361
- this.renderingStateChanged = true;
362
- // doing some gc - clean up previous cache fields
363
- this.deleteBlockFields(blockId, "prodOutputPrevious", "prodCtxPrevious", "prodUiCtxPrevious");
364
- return true;
365
- }
366
- else {
367
- // reset - clean up any partial/inconsistent production stat
368
- return this.deleteBlockFields(blockId, "prodOutput", "prodCtx", "prodUiCtx", "prodArgs", "prodOutputPrevious", "prodCtxPrevious", "prodUiCtxPrevious");
369
- }
370
- }
371
- /**
372
- * Gets current block state and merges with partial updates.
373
- * Used by legacy v1/v2 methods like setBlockArgs and setUiState.
374
- *
375
- * @param blockId The block to get state for
376
- * @param partialUpdate Partial state to merge (e.g. { args } or { uiState })
377
- * @returns Merged state in unified format { args, uiState }
378
- */
379
- mergeBlockState(blockId, partialUpdate) {
380
- const info = this.getBlockInfo(blockId);
381
- const currentState = info.blockStorage;
382
- return { ...currentState, ...partialUpdate };
383
- }
384
- /**
385
- * Sets raw block storage content directly (for testing purposes).
386
- * This bypasses all normalization and VM transformations.
387
- *
388
- * @param blockId The block to set storage for
389
- * @param rawStorageJson Raw storage as JSON string
390
- */
391
- setBlockStorageRaw(blockId, rawStorageJson) {
392
- this.setBlockFieldObj(blockId, "blockStorage", this.createJsonFieldValueByContent(rawStorageJson));
393
- this.blocksWithChangedInputs.add(blockId);
394
- this.updateLastModified();
395
- }
396
- /**
397
- * Resets a v2+ block to its initial storage state.
398
- * Gets initial storage from VM and derives args from it.
399
- *
400
- * For v1 blocks, use setStates() instead.
401
- *
402
- * @param blockId The block to reset
403
- */
404
- resetToInitialStorage(blockId) {
405
- const info = this.getBlockInfo(blockId);
406
- const blockConfig = info.config;
407
- if (blockConfig.modelAPIVersion !== model.BLOCK_STORAGE_FACADE_VERSION) {
408
- throw new Error("resetToInitialStorage is only supported for model API version 2");
409
- }
410
- // Get initial storage from VM
411
- const initialStorageJson = this.projectHelper.getInitialStorageInVM(blockConfig);
412
- this.setBlockStorageRaw(blockId, initialStorageJson);
413
- // Derive args from storage - set or clear currentArgs based on derivation result
414
- const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, initialStorageJson);
415
- if (!deriveArgsResult.error) {
416
- this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(deriveArgsResult.value));
417
- // Derive prerunArgs from storage
418
- const prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, initialStorageJson);
419
- if (prerunArgs !== undefined) {
420
- this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
421
- }
422
- }
423
- else {
424
- this.deleteBlockFields(blockId, "currentArgs");
425
- }
426
- }
427
- /** Optimally sets inputs for multiple blocks in one go */
428
- setStates(requests) {
429
- const changedArgs = [];
430
- let somethingChanged = false;
431
- for (const req of requests) {
432
- const info = this.getBlockInfo(req.blockId);
433
- let blockChanged = false;
434
- const blockConfig = info.config;
435
- // modelAPIVersion === 2 means BlockModelV3 with .args() lambda for deriving args
436
- if (req.modelAPIVersion !== blockConfig.modelAPIVersion) {
437
- throw new Error(`Model API version mismatch for block ${req.blockId}: ${req.modelAPIVersion} !== ${blockConfig.modelAPIVersion}`);
438
- }
439
- // Derive args from storage using the block's config.args() callback
440
- let args;
441
- let prerunArgs;
442
- if (req.modelAPIVersion === model.BLOCK_STORAGE_FACADE_VERSION) {
443
- const currentStorageJson = info.blockStorageJson;
444
- if (currentStorageJson === undefined) {
445
- throw new Error(`Block ${req.blockId} has no blockStorage - this should not happen`);
446
- }
447
- // Apply the state update to storage
448
- const updatedStorageJson = this.projectHelper.applyStorageUpdateInVM(blockConfig, currentStorageJson, req.payload);
449
- this.setBlockFieldObj(req.blockId, "blockStorage", this.createJsonFieldValueByContent(updatedStorageJson));
450
- // Derive args directly from storage (VM extracts data internally)
451
- const derivedArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, updatedStorageJson);
452
- if (derivedArgsResult.error) {
453
- args = undefined;
454
- prerunArgs = undefined;
455
- }
456
- else {
457
- args = derivedArgsResult.value;
458
- // Derive prerunArgs from storage, or fall back to args
459
- prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, updatedStorageJson);
460
- }
461
- }
462
- else {
463
- this.setBlockFieldObj(req.blockId, "blockStorage", this.createJsonFieldValue(req.state));
464
- if (req.state !== null && typeof req.state === "object" && "args" in req.state) {
465
- args = req.state.args;
466
- }
467
- else {
468
- args = req.state;
469
- }
470
- // For the legacy blocks, prerunArgs = args (same as production args)
471
- prerunArgs = args;
472
- }
473
- // Set or clear currentArgs based on derivation result
474
- if (args !== undefined) {
475
- const currentArgsData = tsHelpers.canonicalJsonBytes(args);
476
- const argsPartRef = this.tx.createValue(plClient.Pl.JsonObject, currentArgsData);
477
- this.setBlockField(req.blockId, "currentArgs", argsPartRef, "Ready", currentArgsData);
478
- }
479
- else {
480
- this.deleteBlockFields(req.blockId, "currentArgs");
481
- }
482
- // Set currentPrerunArgs field and check if it actually changed
483
- let prerunArgsChanged = false;
484
- if (prerunArgs !== undefined) {
485
- const prerunArgsData = tsHelpers.canonicalJsonBytes(prerunArgs);
486
- const oldPrerunArgsData = info.fields.currentPrerunArgs?.value;
487
- // Check if prerunArgs actually changed
488
- if (oldPrerunArgsData === undefined ||
489
- Buffer.compare(oldPrerunArgsData, prerunArgsData) !== 0) {
490
- prerunArgsChanged = true;
491
- }
492
- const prerunArgsRef = this.tx.createValue(plClient.Pl.JsonObject, prerunArgsData);
493
- this.setBlockField(req.blockId, "currentPrerunArgs", prerunArgsRef, "Ready", prerunArgsData);
494
- }
495
- else {
496
- // prerunArgs is undefined - check if we previously had one
497
- if (info.fields.currentPrerunArgs !== undefined) {
498
- prerunArgsChanged = true;
499
- }
500
- }
501
- blockChanged = true;
502
- // Only add to changedArgs if prerunArgs changed - this controls staging reset
503
- if (prerunArgsChanged) {
504
- changedArgs.push(req.blockId);
505
- }
506
- if (blockChanged) {
507
- // will be assigned our author marker
508
- this.blocksWithChangedInputs.add(req.blockId);
509
- somethingChanged = true;
510
- }
511
- }
512
- // resetting staging outputs for all downstream blocks
513
- this.getStagingGraph().traverse("downstream", changedArgs, ({ id }) => this.resetStaging(id));
514
- if (somethingChanged)
515
- this.updateLastModified();
516
- }
517
- setBlockSettings(blockId, newValue) {
518
- this.setBlockFieldObj(blockId, "blockSettings", this.createJsonFieldValue(newValue));
519
- this.updateLastModified();
520
- }
521
- createProdCtx(upstream) {
522
- const upstreamContexts = [];
523
- upstream.forEach((id) => {
524
- const info = this.getBlockInfo(id);
525
- if (info.fields["prodCtx"]?.ref === undefined)
526
- throw new Error("One of the upstreams staging is not rendered.");
527
- upstreamContexts.push(plClient.Pl.unwrapHolder(this.tx, info.fields["prodCtx"].ref));
528
- });
529
- return render_block.createBContextFromUpstreams(this.tx, upstreamContexts);
530
- }
531
- createStagingCtx(upstream) {
532
- const upstreamContexts = [];
533
- upstream.forEach((id) => {
534
- const info = this.getBlockInfo(id);
535
- if (info.fields["stagingCtx"]?.ref === undefined)
536
- throw new Error("One of the upstreams staging is not rendered.");
537
- upstreamContexts.push(plClient.Pl.unwrapHolder(this.tx, info.fields["stagingCtx"].ref));
538
- if (info.fields["prodCtx"]?.ref !== undefined)
539
- upstreamContexts.push(plClient.Pl.unwrapHolder(this.tx, info.fields["prodCtx"].ref));
540
- });
541
- return render_block.createBContextFromUpstreams(this.tx, upstreamContexts);
542
- }
543
- exportCtx(ctx) {
544
- return context_export.exportContext(this.tx, plClient.Pl.unwrapHolder(this.tx, this.ctxExportTplHolder), ctx);
545
- }
546
- /**
547
- * Renders staging for a block using currentPrerunArgs.
548
- * If currentPrerunArgs is not set (prerunArgs returned undefined), skips staging for this block.
549
- */
550
- renderStagingFor(blockId) {
551
- this.resetStaging(blockId);
552
- const info = this.getBlockInfo(blockId);
553
- // If currentPrerunArgs is not set (prerunArgs returned undefined), skip staging for this block
554
- const prerunArgsRef = info.fields.currentPrerunArgs?.ref;
555
- if (prerunArgsRef === undefined) {
556
- return;
557
- }
558
- const ctx = this.createStagingCtx(this.getStagingGraph().nodes.get(blockId).upstream);
559
- if (this.getBlock(blockId).renderingMode !== "Heavy")
560
- throw new Error("not supported yet");
561
- const tpl = info.getTemplate(this.tx);
562
- // Use currentPrerunArgs for staging rendering
563
- const results = render_block.createRenderHeavyBlock(this.tx, tpl, {
564
- args: prerunArgsRef,
565
- blockId: this.tx.createValue(plClient.Pl.JsonString, JSON.stringify(blockId)),
566
- isProduction: this.tx.createValue(plClient.Pl.JsonBool, JSON.stringify(false)),
567
- context: ctx,
568
- });
569
- // Here we set the staging ctx to the input context of the staging workflow, not the output because exports
570
- // of one staging context should stay within the same block, and not travel downstream.
571
- // We may change this decision in the future if wanted to support traveling staging exports downstream.
572
- this.setBlockField(blockId, "stagingCtx", plClient.Pl.wrapInEphHolder(this.tx, ctx), "NotReady");
573
- // Yet the staging UI Ctx is the output context of the staging workflow, because it is used to form the result pool
574
- // thus creating a certain discrepancy between staging workflow context behavior and desktop's result pool.
575
- this.setBlockField(blockId, "stagingUiCtx", this.exportCtx(results.context), "NotReady");
576
- this.setBlockField(blockId, "stagingOutput", results.result, "NotReady");
577
- }
578
- renderProductionFor(blockId) {
579
- this.resetProduction(blockId);
580
- const info = this.getBlockInfo(blockId);
581
- // Can't render production if currentArgs is not set
582
- if (info.fields.currentArgs === undefined) {
583
- throw new Error(`Can't render production for block ${blockId}: currentArgs not set`);
584
- }
585
- const ctx = this.createProdCtx(this.getPendingProductionGraph().nodes.get(blockId).upstream);
586
- if (this.getBlock(blockId).renderingMode === "Light")
587
- throw new Error("Can't render production for light block.");
588
- const tpl = info.getTemplate(this.tx);
589
- const results = render_block.createRenderHeavyBlock(this.tx, tpl, {
590
- args: info.fields.currentArgs.ref,
591
- blockId: this.tx.createValue(plClient.Pl.JsonString, JSON.stringify(blockId)),
592
- isProduction: this.tx.createValue(plClient.Pl.JsonBool, JSON.stringify(true)),
593
- context: ctx,
594
- });
595
- this.setBlockField(blockId, "prodCtx", plClient.Pl.wrapInEphHolder(this.tx, results.context), "NotReady");
596
- this.setBlockField(blockId, "prodUiCtx", this.exportCtx(results.context), "NotReady");
597
- this.setBlockField(blockId, "prodOutput", results.result, "NotReady");
598
- // saving inputs for which we rendered the production
599
- this.setBlockFieldObj(blockId, "prodArgs", info.fields.currentArgs);
600
- // removing block from limbo as we juts rendered fresh production for it
601
- if (this.blocksInLimbo.delete(blockId))
602
- this.renderingStateChanged = true;
603
- }
604
- //
605
- // Structure changes
606
- //
607
- initializeNewBlock(blockId, spec) {
608
- const info = new BlockInfo(blockId, {}, model.extractConfig(spec.blockPack.config), spec.blockPack.source);
609
- this.blockInfos.set(blockId, info);
610
- // block pack
611
- const bp = block_pack.createBlockPack(this.tx, spec.blockPack);
612
- this.setBlockField(blockId, "blockPack", plClient.Pl.wrapInHolder(this.tx, bp), "NotReady");
613
- // settings
614
- this.setBlockFieldObj(blockId, "blockSettings", this.createJsonFieldValue(plModelMiddleLayer.InitialBlockSettings));
615
- const blockConfig = info.config;
616
- let args;
617
- let prerunArgs;
618
- let storageToWrite;
619
- if (spec.storageMode === "fromModel") {
620
- // Model API v2+: get initial storage and derive args from it
621
- storageToWrite = this.projectHelper.getInitialStorageInVM(blockConfig);
622
- // Derive args directly from storage (VM extracts data internally)
623
- const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, storageToWrite);
624
- if (deriveArgsResult.error) {
625
- args = undefined;
626
- prerunArgs = undefined;
627
- }
628
- else {
629
- args = deriveArgsResult.value;
630
- prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, storageToWrite);
631
- }
632
- }
633
- else if (spec.storageMode === "legacy") {
634
- // Model API v1: use legacyState from spec
635
- const parsedState = JSON.parse(spec.legacyState);
636
- args = parsedState.args;
637
- if (args === undefined) {
638
- throw new Error("args is undefined in legacyState");
639
- }
640
- prerunArgs = args;
641
- storageToWrite = spec.legacyState;
642
- }
643
- else {
644
- throw new Error(`Unknown storageMode: ${spec.storageMode}`);
645
- }
646
- // currentArgs
647
- if (args !== undefined) {
648
- this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(args));
649
- }
650
- // currentPrerunArgs
651
- if (prerunArgs !== undefined) {
652
- this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
653
- }
654
- // blockStorage
655
- this.setBlockFieldObj(blockId, "blockStorage", this.createJsonFieldValueByContent(storageToWrite));
656
- // checking structure
657
- info.check();
658
- }
659
- getFieldNamesToDuplicate(blockId) {
660
- const fields = this.getBlockInfo(blockId).fields;
661
- const diff = (setA, setB) => new Set([...setA].filter((x) => !setB.has(x)));
662
- // Check if we can safely move to limbo (both core production fields are ready)
663
- if (fields.prodOutput?.status === "Ready" && fields.prodCtx?.status === "Ready") {
664
- if (this.blocksInLimbo.has(blockId))
665
- // we are already in limbo
666
- return project_model.FieldsToDuplicate;
667
- return diff(project_model.FieldsToDuplicate, new Set(["prodOutputPrevious", "prodCtxPrevious", "prodUiCtxPrevious"]));
668
- }
669
- else {
670
- return diff(project_model.FieldsToDuplicate, new Set([
671
- "prodOutput",
672
- "prodCtx",
673
- "prodUiCtx",
674
- "prodArgs",
675
- "prodOutputPrevious",
676
- "prodCtxPrevious",
677
- "prodUiCtxPrevious",
678
- ]));
679
- }
680
- }
681
- initializeBlockDuplicate(blockId, originalBlockInfo) {
682
- const info = new BlockInfo(blockId, {}, originalBlockInfo.config, originalBlockInfo.source);
683
- this.blockInfos.set(blockId, info);
684
- const fieldNamesToDuplicate = this.getFieldNamesToDuplicate(blockId);
685
- // Copy all fields from original block to new block by sharing references
686
- for (const [fieldName, fieldState] of Object.entries(originalBlockInfo.fields)) {
687
- if (fieldNamesToDuplicate.has(fieldName) &&
688
- fieldState &&
689
- fieldState.ref) {
690
- this.setBlockFieldObj(blockId, fieldName, {
691
- ref: fieldState.ref,
692
- status: fieldState.status,
693
- value: fieldState.value,
694
- });
695
- }
696
- }
697
- this.resetOrLimboProduction(blockId);
698
- info.check();
699
- }
700
- /** Very generic method, better check for more specialized case-specific methods first. */
701
- updateStructure(newStructure, newBlockInitializer = NoNewBlocks) {
702
- const currentStagingGraph = this.getStagingGraph();
703
- const currentActualProductionGraph = this.getActualProductionGraph();
704
- const newStagingGraph = project_model_util.stagingGraph(newStructure);
705
- const stagingDiff = project_model_util.graphDiff(currentStagingGraph, newStagingGraph);
706
- // removing blocks
707
- for (const blockId of stagingDiff.onlyInA) {
708
- const { fields } = this.getBlockInfo(blockId);
709
- this.deleteBlockFields(blockId, ...Object.keys(fields));
710
- this.blockInfos.delete(blockId);
711
- if (this.blocksInLimbo.delete(blockId))
712
- this.renderingStateChanged = true;
713
- }
714
- // creating new blocks
715
- for (const blockId of stagingDiff.onlyInB) {
716
- newBlockInitializer(blockId);
717
- }
718
- // resetting stagings affected by topology change
719
- for (const blockId of stagingDiff.different)
720
- this.resetStaging(blockId);
721
- // new actual production graph without new blocks
722
- const newActualProductionGraph = project_model_util.productionGraph(newStructure, (blockId) => this.getProductionGraphBlockInfo(blockId, true));
723
- const prodDiff = project_model_util.graphDiff(currentActualProductionGraph, newActualProductionGraph);
724
- // applying changes due to topology change in production to affected nodes and
725
- // all their downstreams
726
- currentActualProductionGraph.traverse("downstream", [...prodDiff.different], (node) => {
727
- this.resetOrLimboProduction(node.id);
728
- });
729
- if (stagingDiff.onlyInB.size > 0 ||
730
- stagingDiff.onlyInA.size > 0 ||
731
- stagingDiff.different.size > 0)
732
- this.resetStagingRefreshTimestamp();
733
- this.struct = newStructure;
734
- this.structureChanged = true;
735
- this.stagingGraph = undefined;
736
- this.pendingProductionGraph = undefined;
737
- this.actualProductionGraph = undefined;
738
- this.updateLastModified();
739
- }
740
- //
741
- // Structure change helpers
742
- //
743
- addBlock(block, spec, before) {
744
- const newStruct = this.structure; // copy current structure
745
- if (before === undefined) {
746
- // adding as a very last block
747
- newStruct.groups[newStruct.groups.length - 1].blocks.push(block);
748
- }
749
- else {
750
- let done = false;
751
- for (const group of newStruct.groups) {
752
- const idx = group.blocks.findIndex((b) => b.id === before);
753
- if (idx < 0)
754
- continue;
755
- group.blocks.splice(idx, 0, block);
756
- done = true;
757
- break;
758
- }
759
- if (!done)
760
- throw new Error(`Can't find element with id: ${before}`);
761
- }
762
- this.updateStructure(newStruct, (blockId) => {
763
- if (blockId !== block.id)
764
- throw new Error("Unexpected");
765
- this.initializeNewBlock(blockId, spec);
766
- });
767
- }
768
- /**
769
- * Duplicates an existing block by copying all its fields and structure.
770
- * This method creates a deep copy of the block at the mutator level.
771
- *
772
- * @param originalBlockId id of the block to duplicate
773
- * @param newBlockId id for the new duplicated block
774
- * @param after id of the block to insert new block after
775
- */
776
- duplicateBlock(originalBlockId, newBlockId, after) {
777
- // Get the original block from structure
778
- const originalBlock = this.getBlock(originalBlockId);
779
- const originalBlockInfo = this.getBlockInfo(originalBlockId);
780
- // Create new block in structure
781
- const newBlock = {
782
- id: newBlockId,
783
- label: originalBlock.label,
784
- renderingMode: originalBlock.renderingMode,
785
- };
786
- // Add the new block to structure
787
- const newStruct = this.structure; // copy current structure
788
- if (after === undefined) {
789
- // adding as a very last block
790
- newStruct.groups[newStruct.groups.length - 1].blocks.push(newBlock);
791
- }
792
- else {
793
- let done = false;
794
- for (const group of newStruct.groups) {
795
- const idx = group.blocks.findIndex((b) => b.id === after);
796
- if (idx < 0)
797
- continue;
798
- group.blocks.splice(idx + 1, 0, newBlock);
799
- done = true;
800
- break;
801
- }
802
- if (!done)
803
- throw new Error(`Can't find element with id: ${after}`);
804
- }
805
- this.updateStructure(newStruct, (blockId) => {
806
- if (blockId !== newBlockId)
807
- throw new Error("Unexpected");
808
- this.initializeBlockDuplicate(blockId, originalBlockInfo);
809
- });
810
- }
811
- deleteBlock(blockId) {
812
- const newStruct = this.structure; // copy current structure
813
- let done = false;
814
- for (const group of newStruct.groups) {
815
- const idx = group.blocks.findIndex((b) => b.id === blockId);
816
- if (idx < 0)
817
- continue;
818
- group.blocks.splice(idx, 1);
819
- done = true;
820
- break;
821
- }
822
- if (!done)
823
- throw new Error(`Can't find element with id: ${blockId}`);
824
- this.updateStructure(newStruct);
825
- }
826
- //
827
- // Block-pack migration
828
- //
829
- migrateBlockPack(blockId, spec, newClearState) {
830
- const info = this.getBlockInfo(blockId);
831
- const newConfig = model.extractConfig(spec.config);
832
- const persistBlockPack = () => {
833
- this.setBlockField(blockId, "blockPack", plClient.Pl.wrapInHolder(this.tx, block_pack.createBlockPack(this.tx, spec)), "NotReady");
834
- };
835
- const applyStorageAndDeriveArgs = (storageJson) => {
836
- persistBlockPack();
837
- this.setBlockStorageRaw(blockId, storageJson);
838
- const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(newConfig, storageJson);
839
- if (!deriveArgsResult.error) {
840
- this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(deriveArgsResult.value));
841
- const prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(newConfig, storageJson);
842
- if (prerunArgs !== undefined) {
843
- this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
844
- }
845
- }
846
- };
847
- if (newClearState !== undefined) {
848
- // State is being reset - no migration needed
849
- const supportsStorageFromVM = newConfig.modelAPIVersion === model.BLOCK_STORAGE_FACADE_VERSION;
850
- if (supportsStorageFromVM) {
851
- // V2+: Get initial storage directly from VM and derive args from it
852
- const initialStorageJson = this.projectHelper.getInitialStorageInVM(newConfig);
853
- applyStorageAndDeriveArgs(initialStorageJson);
854
- this.blocksWithChangedInputs.add(blockId);
855
- this.updateLastModified();
856
- }
857
- else {
858
- // V1: Use setStates with legacy state format
859
- persistBlockPack();
860
- this.setStates([{ modelAPIVersion: 1, blockId, state: newClearState.state }]);
861
- }
862
- }
863
- else {
864
- // State is being preserved - run migrations if needed via VM
865
- // Only Model API v2 blocks support migrations
866
- const supportsStateMigrations = newConfig.modelAPIVersion === model.BLOCK_STORAGE_FACADE_VERSION;
867
- if (supportsStateMigrations) {
868
- const currentStorageJson = info.blockStorageJson;
869
- // Attempt migration BEFORE persisting block pack — on failure,
870
- // block stays on old version (no inconsistent new-code/old-storage state)
871
- const migrationResult = this.projectHelper.migrateStorageInVM(newConfig, currentStorageJson);
872
- if (migrationResult.error !== undefined) {
873
- throw new Error(`[migrateBlockPack] Block ${blockId} migration failed: ${migrationResult.error}`);
874
- }
875
- console.log(`[migrateBlockPack] Block ${blockId}: ${migrationResult.info}`);
876
- applyStorageAndDeriveArgs(migrationResult.newStorageJson);
877
- }
878
- else {
879
- // Legacy blocks (modelAPIVersion 1): persist block pack, set prerunArgs = currentArgs
880
- persistBlockPack();
881
- if (info.fields.currentArgs !== undefined) {
882
- this.setBlockFieldObj(blockId, "currentPrerunArgs", info.fields.currentArgs);
883
- }
884
- }
885
- this.blocksWithChangedInputs.add(blockId);
886
- // resetting staging outputs for all downstream blocks
887
- this.getStagingGraph().traverse("downstream", [blockId], ({ id }) => this.resetStaging(id));
888
- }
889
- // also reset or limbo all downstream productions
890
- if (info.productionRendered)
891
- this.getActualProductionGraph().traverse("downstream", [blockId], ({ id }) => this.resetOrLimboProduction(id));
892
- this.updateLastModified();
893
- }
894
- //
895
- // Render
896
- //
897
- renderProduction(blockIds, addUpstreams = false) {
898
- const blockIdsSet = new Set(blockIds);
899
- const prodGraph = this.getPendingProductionGraph();
900
- if (addUpstreams)
901
- // adding all upstreams automatically
902
- prodGraph.traverse("upstream", blockIds, (node) => {
903
- blockIdsSet.add(node.id);
904
- });
905
- else
906
- // checking that targets contain all upstreams
907
- for (const blockId of blockIdsSet) {
908
- const node = prodGraph.nodes.get(blockId);
909
- if (node === undefined)
910
- throw new Error(`Can't find block with id: ${blockId}`);
911
- for (const upstream of node.upstream)
912
- if (!blockIdsSet.has(upstream))
913
- throw new Error("Can't render blocks not including all upstreams.");
914
- }
915
- // traversing in topological order and rendering target blocks
916
- const rendered = new Set();
917
- for (const block of project_model_util.allBlocks(this.structure)) {
918
- if (!blockIdsSet.has(block.id))
919
- continue;
920
- let render = this.getBlockInfo(block.id).requireProductionRendering || this.blocksInLimbo.has(block.id);
921
- if (!render)
922
- for (const upstream of prodGraph.nodes.get(block.id).upstream)
923
- if (rendered.has(upstream)) {
924
- render = true;
925
- break;
926
- }
927
- if (render) {
928
- this.renderProductionFor(block.id);
929
- rendered.add(block.id);
930
- }
931
- }
932
- const renderedArray = [...rendered];
933
- // sending to limbo all downstream blocks
934
- prodGraph.traverse("downstream", renderedArray, (node) => {
935
- if (rendered.has(node.id))
936
- // don't send to limbo blocks that were just rendered
937
- return;
938
- this.resetOrLimboProduction(node.id);
939
- });
940
- // resetting staging outputs for all downstream blocks
941
- this.getStagingGraph().traverse("downstream", renderedArray, ({ id }) => {
942
- // don't reset staging of the first rendered block
943
- if (renderedArray[0] !== id)
944
- this.resetStaging(id);
945
- });
946
- if (rendered.size > 0)
947
- this.updateLastModified();
948
- return rendered;
949
- }
950
- /** Stops running blocks from the list and modify states of other blocks
951
- * accordingly */
952
- stopProduction(...blockIds) {
953
- const activeProdGraph = this.getActualProductionGraph();
954
- // we will stop all blocks listed in request and all their downstreams
955
- const queue = new Denque(blockIds);
956
- const queued = new Set(blockIds);
957
- const stopped = [];
958
- while (!queue.isEmpty()) {
959
- const blockId = queue.shift();
960
- const fields = this.getBlockInfo(blockId).fields;
961
- if (fields.prodOutput?.status === "Ready" && fields.prodCtx?.status === "Ready")
962
- // skipping finished blocks
963
- continue;
964
- if (this.deleteBlockFields(blockId, "prodOutput", "prodCtx", "prodUiCtx", "prodArgs")) {
965
- // was actually stopped
966
- stopped.push(blockId);
967
- // will try to stop all its downstreams
968
- for (const downstream of activeProdGraph.traverseIdsExcludingRoots("downstream", blockId)) {
969
- if (queued.has(downstream))
970
- continue;
971
- queue.push(downstream);
972
- queued.add(downstream);
973
- }
974
- }
975
- }
976
- // blocks under stopped blocks, but having finished production results, goes to limbo
977
- for (const blockId of activeProdGraph.traverseIdsExcludingRoots("downstream", ...stopped))
978
- this.resetOrLimboProduction(blockId);
979
- // reset staging outputs for all downstream blocks
980
- this.getStagingGraph().traverse("downstream", stopped, ({ id }) => this.resetStaging(id));
981
- }
982
- traverseWithStagingLag(cb) {
983
- const lags = new Map();
984
- const stagingGraph = this.getStagingGraph();
985
- stagingGraph.nodes.forEach((node) => {
986
- const info = this.getBlockInfo(node.id);
987
- // Use requireStagingRendering to check both: staging exists AND prerunArgs hasn't changed
988
- const requiresRendering = info.requireStagingRendering;
989
- let lag = requiresRendering ? 1 : 0;
990
- node.upstream.forEach((upstream) => {
991
- const upstreamLag = lags.get(upstream);
992
- if (upstreamLag === 0)
993
- return;
994
- lag = Math.max(upstreamLag + 1, lag);
995
- });
996
- if (!requiresRendering && info.stagingRendered) ;
997
- cb(node.id, lag);
998
- lags.set(node.id, lag);
999
- });
1000
- }
1001
- /** @param stagingRenderingRate rate in blocks per second */
1002
- refreshStagings(stagingRenderingRate) {
1003
- const elapsed = Date.now() - this.renderingState.stagingRefreshTimestamp;
1004
- const lagThreshold = stagingRenderingRate === undefined
1005
- ? undefined
1006
- : 1 + Math.max(0, (elapsed * stagingRenderingRate) / 1000);
1007
- let rendered = 0;
1008
- this.traverseWithStagingLag((blockId, lag) => {
1009
- if (lag === 0)
1010
- // meaning staging already rendered
1011
- return;
1012
- if (lagThreshold === undefined || lag <= lagThreshold) {
1013
- // console.log(`[refreshStagings] RENDER staging for ${blockId} (lag=${lag})`);
1014
- this.renderStagingFor(blockId);
1015
- rendered++;
1016
- }
1017
- });
1018
- if (rendered > 0)
1019
- this.resetStagingRefreshTimestamp();
1020
- }
1021
- //
1022
- // Meta
1023
- //
1024
- /** Updates project metadata */
1025
- setMeta(meta) {
1026
- this.meta = meta;
1027
- this.metaChanged = true;
1028
- this.updateLastModified();
1029
- }
1030
- //
1031
- // Maintenance
1032
- //
1033
- /** @param stagingRenderingRate rate in blocks per second */
1034
- doRefresh(stagingRenderingRate) {
1035
- this.refreshStagings(stagingRenderingRate);
1036
- this.blockInfos.forEach((blockInfo) => {
1037
- if (blockInfo.fields.prodCtx?.status === "Ready" &&
1038
- blockInfo.fields.prodOutput?.status === "Ready")
1039
- this.deleteBlockFields(blockInfo.id, "prodOutputPrevious", "prodCtxPrevious", "prodUiCtxPrevious");
1040
- if (blockInfo.fields.stagingCtx?.status === "Ready" &&
1041
- blockInfo.fields.stagingOutput?.status === "Ready")
1042
- this.deleteBlockFields(blockInfo.id, "stagingOutputPrevious", "stagingCtxPrevious", "stagingUiCtxPrevious");
1043
- });
1044
- }
1045
- assignAuthorMarkers() {
1046
- const markerStr = this.author ? JSON.stringify(this.author) : undefined;
1047
- for (const blockId of this.blocksWithChangedInputs)
1048
- if (markerStr === undefined)
1049
- this.tx.deleteKValue(this.rid, project_model.blockArgsAuthorKey(blockId));
1050
- else
1051
- this.tx.setKValue(this.rid, project_model.blockArgsAuthorKey(blockId), markerStr);
1052
- if (this.metaChanged || this.structureChanged) {
1053
- if (markerStr === undefined)
1054
- this.tx.deleteKValue(this.rid, project_model.ProjectStructureAuthorKey);
1055
- else
1056
- this.tx.setKValue(this.rid, project_model.ProjectStructureAuthorKey, markerStr);
1057
- }
1058
- }
1059
- save() {
1060
- if (!this.wasModified)
1061
- return;
1062
- if (this.lastModifiedChanged)
1063
- this.tx.setKValue(this.rid, project_model.ProjectLastModifiedTimestamp, JSON.stringify(this.lastModified));
1064
- if (this.structureChanged)
1065
- this.tx.setKValue(this.rid, project_model.ProjectStructureKey, JSON.stringify(this.struct));
1066
- if (this.renderingStateChanged)
1067
- this.tx.setKValue(this.rid, project_model.BlockRenderingStateKey, JSON.stringify({
1068
- ...this.renderingState,
1069
- blocksInLimbo: [...this.blocksInLimbo],
1070
- }));
1071
- if (this.metaChanged)
1072
- this.tx.setKValue(this.rid, project_model.ProjectMetaKey, JSON.stringify(this.meta));
1073
- this.assignAuthorMarkers();
1074
- }
1075
- static async load(projectHelper, tx, rid, author) {
1076
- //
1077
- // Sending initial requests to read project state (start of round-trip #1)
1078
- //
1079
- const fullResourceStateP = tx.getResourceData(rid, true);
1080
- const schemaP = tx.getKValueJson(rid, project_model.SchemaVersionKey);
1081
- const lastModifiedP = tx.getKValueJson(rid, project_model.ProjectLastModifiedTimestamp);
1082
- const metaP = tx.getKValueJson(rid, project_model.ProjectMetaKey);
1083
- const structureP = tx.getKValueJson(rid, project_model.ProjectStructureKey);
1084
- const renderingStateP = tx.getKValueJson(rid, project_model.BlockRenderingStateKey);
1085
- const fullResourceState = await fullResourceStateP;
1086
- // loading field information
1087
- const blockInfoStates = new Map();
1088
- for (const f of fullResourceState.fields) {
1089
- const projectField = project_model.parseProjectField(f.name);
1090
- // processing only fields with known structure
1091
- if (projectField === undefined)
1092
- continue;
1093
- let info = blockInfoStates.get(projectField.blockId);
1094
- if (info === undefined) {
1095
- info = {
1096
- id: projectField.blockId,
1097
- fields: {},
1098
- };
1099
- blockInfoStates.set(projectField.blockId, info);
1100
- }
1101
- info.fields[projectField.fieldName] = plClient.isNullResourceId(f.value)
1102
- ? { modCount: 0 }
1103
- : { modCount: 0, ref: f.value };
1104
- }
1105
- //
1106
- // Roundtrip #1 not yet finished, but as soon as field list is received,
1107
- // we can start sending requests to read states of referenced resources
1108
- // (start of round-trip #2)
1109
- //
1110
- const blockFieldRequests = [];
1111
- blockInfoStates.forEach((info) => {
1112
- const fields = info.fields;
1113
- for (const [fName, state] of Object.entries(fields)) {
1114
- if (state.ref === undefined)
1115
- continue;
1116
- if (!plClient.isResource(state.ref) || plClient.isResourceRef(state.ref))
1117
- throw new Error("unexpected behaviour");
1118
- const fieldName = fName;
1119
- blockFieldRequests.push([
1120
- info,
1121
- fieldName,
1122
- state,
1123
- tx.getResourceData(state.ref, fieldName == "blockPack"),
1124
- ]);
1125
- }
1126
- });
1127
- // loading jsons
1128
- const [schema, lastModified, meta, structure, { stagingRefreshTimestamp, blocksInLimbo }] = await Promise.all([schemaP, lastModifiedP, metaP, structureP, renderingStateP]);
1129
- // Checking schema version of the project
1130
- if (schema !== project_model.SchemaVersionCurrent) {
1131
- if (Number(schema) < Number(project_model.SchemaVersionCurrent))
1132
- throw new model.UiError(`Can't perform this action on this project because it has older schema. Try (re)loading the project to update it.`);
1133
- else
1134
- throw new model.UiError(`Can't perform this action on this project because it has newer schema. Upgrade your desktop app to the latest version.`);
1135
- }
1136
- //
1137
- // <- at this point we have all the responses from round-trip #1
1138
- //
1139
- //
1140
- // Receiving responses from round-trip #2 and sending requests to read block pack descriptions
1141
- // (start of round-trip #3)
1142
- //
1143
- const blockPackRequests = [];
1144
- for (const [info, fieldName, state, response] of blockFieldRequests) {
1145
- const result = await response;
1146
- state.value = result.data;
1147
- if (plClient.isNotNullResourceId(result.error))
1148
- state.status = "Error";
1149
- else if (result.resourceReady || plClient.isNotNullResourceId(result.originalResourceId))
1150
- state.status = "Ready";
1151
- else
1152
- state.status = "NotReady";
1153
- // For block pack we need to traverse the ref field from the resource data
1154
- if (fieldName === "blockPack") {
1155
- const refField = result.fields.find((f) => f.name === plClient.Pl.HolderRefField);
1156
- if (refField === undefined)
1157
- throw new Error("Block pack ref field is missing");
1158
- blockPackRequests.push([
1159
- info,
1160
- tx.getResourceData(plClient.ensureResourceIdNotNull(refField.value), false),
1161
- ]);
1162
- }
1163
- }
1164
- //
1165
- // <- at this point we have all the responses from round-trip #2
1166
- //
1167
- for (const [info, response] of blockPackRequests) {
1168
- const result = await response;
1169
- const bpInfo = tsHelpers.cachedDeserialize(tsHelpers.notEmpty(result.data));
1170
- info.blockConfig = model.extractConfig(bpInfo.config);
1171
- info.blockPack = bpInfo.source;
1172
- }
1173
- //
1174
- // <- at this point we have all the responses from round-trip #3
1175
- //
1176
- // loading ctx export template to check if we already have cached materialized template in our project
1177
- const ctxExportTplEnvelope = await context_export.getPreparedExportTemplateEnvelope();
1178
- // expected field name
1179
- const ctxExportTplCacheFieldName = project_model.getServiceTemplateField(ctxExportTplEnvelope.hash);
1180
- const ctxExportTplField = fullResourceState.fields.find((f) => f.name === ctxExportTplCacheFieldName);
1181
- let ctxExportTplHolder;
1182
- if (ctxExportTplField !== undefined)
1183
- ctxExportTplHolder = plClient.ensureResourceIdNotNull(ctxExportTplField.value);
1184
- else {
1185
- ctxExportTplHolder = plClient.Pl.wrapInHolder(tx, template_loading.loadTemplate(tx, ctxExportTplEnvelope.spec));
1186
- tx.createField(plClient.field(rid, project_model.getServiceTemplateField(ctxExportTplEnvelope.hash)), "Dynamic", ctxExportTplHolder);
1187
- }
1188
- const renderingState = { stagingRefreshTimestamp };
1189
- const blocksInLimboSet = new Set(blocksInLimbo);
1190
- const blockInfos = new Map();
1191
- blockInfoStates.forEach(({ id, fields, blockConfig, blockPack }) => blockInfos.set(id, new BlockInfo(id, fields, tsHelpers.notEmpty(blockConfig), tsHelpers.notEmpty(blockPack))));
1192
- // check consistency of project state
1193
- const blockInStruct = new Set();
1194
- for (const b of project_model_util.allBlocks(structure)) {
1195
- if (!blockInfos.has(b.id))
1196
- throw new Error(`Inconsistent project structure: no inputs for ${b.id}`);
1197
- blockInStruct.add(b.id);
1198
- }
1199
- blockInfos.forEach((info) => {
1200
- if (!blockInStruct.has(info.id))
1201
- throw new Error(`Inconsistent project structure: no structure entry for ${info.id}`);
1202
- // checking structure
1203
- info.check();
1204
- });
1205
- const prj = new ProjectMutator(rid, tx, author, schema, lastModified, meta, structure, renderingState, blocksInLimboSet, blockInfos, ctxExportTplHolder, projectHelper);
1206
- prj.fixProblemsAndMigrate();
1207
- return prj;
1208
- }
1209
- }
1210
- async function createProject(tx, meta = project_model.InitialBlockMeta) {
1211
- const prj = tx.createEphemeral(project_model.ProjectResourceType);
1212
- tx.lock(prj);
1213
- const ts = String(Date.now());
1214
- tx.setKValue(prj, project_model.SchemaVersionKey, JSON.stringify(project_model.SchemaVersionCurrent));
1215
- tx.setKValue(prj, project_model.ProjectCreatedTimestamp, ts);
1216
- tx.setKValue(prj, project_model.ProjectLastModifiedTimestamp, ts);
1217
- tx.setKValue(prj, project_model.ProjectMetaKey, JSON.stringify(meta));
1218
- tx.setKValue(prj, project_model.ProjectStructureKey, JSON.stringify(project_model.InitialBlockStructure));
1219
- tx.setKValue(prj, project_model.BlockRenderingStateKey, JSON.stringify(project_model.InitialProjectRenderingState));
1220
- const ctxExportTplEnvelope = await context_export.getPreparedExportTemplateEnvelope();
1221
- tx.createField(plClient.field(prj, project_model.getServiceTemplateField(ctxExportTplEnvelope.hash)), "Dynamic", plClient.Pl.wrapInHolder(tx, template_loading.loadTemplate(tx, ctxExportTplEnvelope.spec)));
1222
- return prj;
121
+ var ProjectMutator = class ProjectMutator {
122
+ globalModCount = 0;
123
+ fieldsChanged = false;
124
+ lastModifiedChanged = false;
125
+ structureChanged = false;
126
+ metaChanged = false;
127
+ renderingStateChanged = false;
128
+ /** Set blocks will be assigned current mutator author marker on save */
129
+ blocksWithChangedInputs = /* @__PURE__ */ new Set();
130
+ constructor(rid, tx, author, schema, lastModified, meta, struct, renderingState, blocksInLimbo, blockInfos, ctxExportTplHolder, projectHelper) {
131
+ this.rid = rid;
132
+ this.tx = tx;
133
+ this.author = author;
134
+ this.schema = schema;
135
+ this.lastModified = lastModified;
136
+ this.meta = meta;
137
+ this.struct = struct;
138
+ this.renderingState = renderingState;
139
+ this.blocksInLimbo = blocksInLimbo;
140
+ this.blockInfos = blockInfos;
141
+ this.ctxExportTplHolder = ctxExportTplHolder;
142
+ this.projectHelper = projectHelper;
143
+ }
144
+ fixProblemsAndMigrate() {
145
+ this.blockInfos.forEach((blockInfo) => {
146
+ if (blockInfo.fields.prodArgs === void 0 || blockInfo.fields.prodOutput === void 0 || blockInfo.fields.prodCtx === void 0) this.deleteBlockFields(blockInfo.id, "prodArgs", "prodOutput", "prodCtx");
147
+ });
148
+ let initialBlockSettings;
149
+ this.blockInfos.forEach((blockInfo) => {
150
+ if (blockInfo.fields.blockSettings === void 0) {
151
+ if (initialBlockSettings === void 0) initialBlockSettings = this.createJsonFieldValue(_milaboratories_pl_model_middle_layer.InitialBlockSettings);
152
+ this.setBlockFieldObj(blockInfo.id, "blockSettings", initialBlockSettings);
153
+ }
154
+ });
155
+ }
156
+ get wasModified() {
157
+ return this.lastModifiedChanged || this.structureChanged || this.fieldsChanged || this.metaChanged || this.renderingStateChanged;
158
+ }
159
+ get structure() {
160
+ return JSON.parse(JSON.stringify(this.struct));
161
+ }
162
+ stagingGraph = void 0;
163
+ pendingProductionGraph = void 0;
164
+ actualProductionGraph = void 0;
165
+ getStagingGraph() {
166
+ if (this.stagingGraph === void 0) this.stagingGraph = require_project_model_util.stagingGraph(this.struct);
167
+ return this.stagingGraph;
168
+ }
169
+ getProductionGraphBlockInfo(blockId, prod) {
170
+ const bInfo = this.getBlockInfo(blockId);
171
+ let argsField;
172
+ let args;
173
+ if (prod) {
174
+ if (bInfo.fields.prodArgs === void 0) return void 0;
175
+ argsField = bInfo.fields.prodArgs;
176
+ args = bInfo.prodArgs;
177
+ } else {
178
+ argsField = bInfo.fields.currentArgs;
179
+ args = bInfo.currentArgs;
180
+ }
181
+ if (argsField === void 0) return {
182
+ args,
183
+ enrichmentTargets: void 0
184
+ };
185
+ const blockPackField = (0, _milaboratories_ts_helpers.notEmpty)(bInfo.fields.blockPack);
186
+ if ((0, _milaboratories_pl_client.isResourceId)(argsField.ref) && (0, _milaboratories_pl_client.isResourceId)(blockPackField.ref)) return {
187
+ args,
188
+ enrichmentTargets: this.projectHelper.getEnrichmentTargets(() => bInfo.config, () => args, {
189
+ argsRid: argsField.ref,
190
+ blockPackRid: blockPackField.ref
191
+ })
192
+ };
193
+ else return {
194
+ args,
195
+ enrichmentTargets: this.projectHelper.getEnrichmentTargets(() => bInfo.config, () => args)
196
+ };
197
+ }
198
+ getPendingProductionGraph() {
199
+ if (this.pendingProductionGraph === void 0) this.pendingProductionGraph = require_project_model_util.productionGraph(this.struct, (blockId) => this.getProductionGraphBlockInfo(blockId, false));
200
+ return this.pendingProductionGraph;
201
+ }
202
+ getActualProductionGraph() {
203
+ if (this.actualProductionGraph === void 0) this.actualProductionGraph = require_project_model_util.productionGraph(this.struct, (blockId) => this.getProductionGraphBlockInfo(blockId, true));
204
+ return this.actualProductionGraph;
205
+ }
206
+ getBlockInfo(blockId) {
207
+ const info = this.blockInfos.get(blockId);
208
+ if (info === void 0) throw new Error(`No such block: ${blockId}`);
209
+ return info;
210
+ }
211
+ createJsonFieldValueByContent(content) {
212
+ if (content === void 0) throw new Error("content is undefined");
213
+ const value = Buffer.from(content);
214
+ return {
215
+ ref: this.tx.createValue(_milaboratories_pl_client.Pl.JsonObject, value),
216
+ value,
217
+ status: "Ready"
218
+ };
219
+ }
220
+ createJsonFieldValue(obj) {
221
+ return this.createJsonFieldValueByContent(JSON.stringify(obj));
222
+ }
223
+ getBlock(blockId) {
224
+ for (const block of require_project_model_util.allBlocks(this.struct)) if (block.id === blockId) return block;
225
+ throw new Error("block not found");
226
+ }
227
+ setBlockFieldObj(blockId, fieldName, state) {
228
+ const fid = (0, _milaboratories_pl_client.field)(this.rid, require_project_model.projectFieldName(blockId, fieldName));
229
+ if (state.ref === void 0) throw new Error("Can't set value with empty ref");
230
+ if (this.getBlockInfo(blockId).fields[fieldName] === void 0) this.tx.createField(fid, "Dynamic", state.ref);
231
+ else this.tx.setField(fid, state.ref);
232
+ this.getBlockInfo(blockId).fields[fieldName] = {
233
+ modCount: this.globalModCount++,
234
+ ...state
235
+ };
236
+ this.fieldsChanged = true;
237
+ }
238
+ setBlockField(blockId, fieldName, ref, status, value) {
239
+ this.setBlockFieldObj(blockId, fieldName, {
240
+ ref,
241
+ status,
242
+ value
243
+ });
244
+ }
245
+ deleteBlockFields(blockId, ...fieldNames) {
246
+ let deleted = false;
247
+ const info = this.getBlockInfo(blockId);
248
+ for (const fieldName of fieldNames) {
249
+ const fields = info.fields;
250
+ if (!(fieldName in fields)) continue;
251
+ this.tx.removeField((0, _milaboratories_pl_client.field)(this.rid, require_project_model.projectFieldName(blockId, fieldName)));
252
+ delete fields[fieldName];
253
+ this.fieldsChanged = true;
254
+ deleted = true;
255
+ }
256
+ return deleted;
257
+ }
258
+ updateLastModified() {
259
+ this.lastModified = Date.now();
260
+ this.lastModifiedChanged = true;
261
+ }
262
+ resetStagingRefreshTimestamp() {
263
+ this.renderingState.stagingRefreshTimestamp = Date.now();
264
+ this.renderingStateChanged = true;
265
+ }
266
+ resetStaging(blockId) {
267
+ const fields = this.getBlockInfo(blockId).fields;
268
+ if (fields.stagingOutput?.status === "Ready" && fields.stagingCtx?.status === "Ready" && fields.stagingUiCtx?.status === "Ready") {
269
+ this.setBlockFieldObj(blockId, "stagingOutputPrevious", fields.stagingOutput);
270
+ this.setBlockFieldObj(blockId, "stagingCtxPrevious", fields.stagingCtx);
271
+ this.setBlockFieldObj(blockId, "stagingUiCtxPrevious", fields.stagingUiCtx);
272
+ }
273
+ if (this.deleteBlockFields(blockId, "stagingOutput", "stagingCtx", "stagingUiCtx")) this.resetStagingRefreshTimestamp();
274
+ }
275
+ resetProduction(blockId) {
276
+ const fields = this.getBlockInfo(blockId).fields;
277
+ if (fields.prodOutput?.status === "Ready" && fields.prodCtx?.status === "Ready" && fields.prodUiCtx?.status === "Ready") {
278
+ this.setBlockFieldObj(blockId, "prodOutputPrevious", fields.prodOutput);
279
+ this.setBlockFieldObj(blockId, "prodCtxPrevious", fields.prodCtx);
280
+ this.setBlockFieldObj(blockId, "prodUiCtxPrevious", fields.prodUiCtx);
281
+ }
282
+ this.deleteBlockFields(blockId, "prodOutput", "prodCtx", "prodUiCtx", "prodArgs");
283
+ }
284
+ /** Running blocks are reset, already computed moved to limbo. Returns if
285
+ * either of the actions were actually performed.
286
+ * This method ensures the block is left in a consistent state that passes check() constraints. */
287
+ resetOrLimboProduction(blockId) {
288
+ const fields = this.getBlockInfo(blockId).fields;
289
+ if (fields.prodOutput?.status === "Ready" && fields.prodCtx?.status === "Ready") {
290
+ if (this.blocksInLimbo.has(blockId)) return false;
291
+ this.blocksInLimbo.add(blockId);
292
+ this.renderingStateChanged = true;
293
+ this.deleteBlockFields(blockId, "prodOutputPrevious", "prodCtxPrevious", "prodUiCtxPrevious");
294
+ return true;
295
+ } else return this.deleteBlockFields(blockId, "prodOutput", "prodCtx", "prodUiCtx", "prodArgs", "prodOutputPrevious", "prodCtxPrevious", "prodUiCtxPrevious");
296
+ }
297
+ /**
298
+ * Gets current block state and merges with partial updates.
299
+ * Used by legacy v1/v2 methods like setBlockArgs and setUiState.
300
+ *
301
+ * @param blockId The block to get state for
302
+ * @param partialUpdate Partial state to merge (e.g. { args } or { uiState })
303
+ * @returns Merged state in unified format { args, uiState }
304
+ */
305
+ mergeBlockState(blockId, partialUpdate) {
306
+ return {
307
+ ...this.getBlockInfo(blockId).blockStorage,
308
+ ...partialUpdate
309
+ };
310
+ }
311
+ /**
312
+ * Sets raw block storage content directly (for testing purposes).
313
+ * This bypasses all normalization and VM transformations.
314
+ *
315
+ * @param blockId The block to set storage for
316
+ * @param rawStorageJson Raw storage as JSON string
317
+ */
318
+ setBlockStorageRaw(blockId, rawStorageJson) {
319
+ this.setBlockFieldObj(blockId, "blockStorage", this.createJsonFieldValueByContent(rawStorageJson));
320
+ this.blocksWithChangedInputs.add(blockId);
321
+ this.updateLastModified();
322
+ }
323
+ /**
324
+ * Resets a v2+ block to its initial storage state.
325
+ * Gets initial storage from VM and derives args from it.
326
+ *
327
+ * For v1 blocks, use setStates() instead.
328
+ *
329
+ * @param blockId The block to reset
330
+ */
331
+ resetToInitialStorage(blockId) {
332
+ const blockConfig = this.getBlockInfo(blockId).config;
333
+ if (blockConfig.modelAPIVersion !== _platforma_sdk_model.BLOCK_STORAGE_FACADE_VERSION) throw new Error("resetToInitialStorage is only supported for model API version 2");
334
+ const initialStorageJson = this.projectHelper.getInitialStorageInVM(blockConfig);
335
+ this.setBlockStorageRaw(blockId, initialStorageJson);
336
+ const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, initialStorageJson);
337
+ if (!deriveArgsResult.error) {
338
+ this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(deriveArgsResult.value));
339
+ const prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, initialStorageJson);
340
+ if (prerunArgs !== void 0) this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
341
+ } else this.deleteBlockFields(blockId, "currentArgs");
342
+ }
343
+ /** Optimally sets inputs for multiple blocks in one go */
344
+ setStates(requests) {
345
+ const changedArgs = [];
346
+ let somethingChanged = false;
347
+ for (const req of requests) {
348
+ const info = this.getBlockInfo(req.blockId);
349
+ let blockChanged = false;
350
+ const blockConfig = info.config;
351
+ if (req.modelAPIVersion !== blockConfig.modelAPIVersion) throw new Error(`Model API version mismatch for block ${req.blockId}: ${req.modelAPIVersion} !== ${blockConfig.modelAPIVersion}`);
352
+ let args;
353
+ let prerunArgs;
354
+ if (req.modelAPIVersion === _platforma_sdk_model.BLOCK_STORAGE_FACADE_VERSION) {
355
+ const currentStorageJson = info.blockStorageJson;
356
+ if (currentStorageJson === void 0) throw new Error(`Block ${req.blockId} has no blockStorage - this should not happen`);
357
+ const updatedStorageJson = this.projectHelper.applyStorageUpdateInVM(blockConfig, currentStorageJson, req.payload);
358
+ this.setBlockFieldObj(req.blockId, "blockStorage", this.createJsonFieldValueByContent(updatedStorageJson));
359
+ const derivedArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, updatedStorageJson);
360
+ if (derivedArgsResult.error) {
361
+ args = void 0;
362
+ prerunArgs = void 0;
363
+ } else {
364
+ args = derivedArgsResult.value;
365
+ prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, updatedStorageJson);
366
+ }
367
+ } else {
368
+ this.setBlockFieldObj(req.blockId, "blockStorage", this.createJsonFieldValue(req.state));
369
+ if (req.state !== null && typeof req.state === "object" && "args" in req.state) args = req.state.args;
370
+ else args = req.state;
371
+ prerunArgs = args;
372
+ }
373
+ if (args !== void 0) {
374
+ const currentArgsData = (0, _milaboratories_ts_helpers.canonicalJsonBytes)(args);
375
+ const argsPartRef = this.tx.createValue(_milaboratories_pl_client.Pl.JsonObject, currentArgsData);
376
+ this.setBlockField(req.blockId, "currentArgs", argsPartRef, "Ready", currentArgsData);
377
+ } else this.deleteBlockFields(req.blockId, "currentArgs");
378
+ let prerunArgsChanged = false;
379
+ if (prerunArgs !== void 0) {
380
+ const prerunArgsData = (0, _milaboratories_ts_helpers.canonicalJsonBytes)(prerunArgs);
381
+ const oldPrerunArgsData = info.fields.currentPrerunArgs?.value;
382
+ if (oldPrerunArgsData === void 0 || Buffer.compare(oldPrerunArgsData, prerunArgsData) !== 0) prerunArgsChanged = true;
383
+ const prerunArgsRef = this.tx.createValue(_milaboratories_pl_client.Pl.JsonObject, prerunArgsData);
384
+ this.setBlockField(req.blockId, "currentPrerunArgs", prerunArgsRef, "Ready", prerunArgsData);
385
+ } else if (info.fields.currentPrerunArgs !== void 0) prerunArgsChanged = true;
386
+ blockChanged = true;
387
+ if (prerunArgsChanged) changedArgs.push(req.blockId);
388
+ if (blockChanged) {
389
+ this.blocksWithChangedInputs.add(req.blockId);
390
+ somethingChanged = true;
391
+ }
392
+ }
393
+ this.getStagingGraph().traverse("downstream", changedArgs, ({ id }) => this.resetStaging(id));
394
+ if (somethingChanged) this.updateLastModified();
395
+ }
396
+ setBlockSettings(blockId, newValue) {
397
+ this.setBlockFieldObj(blockId, "blockSettings", this.createJsonFieldValue(newValue));
398
+ this.updateLastModified();
399
+ }
400
+ createProdCtx(upstream) {
401
+ const upstreamContexts = [];
402
+ upstream.forEach((id) => {
403
+ const info = this.getBlockInfo(id);
404
+ if (info.fields["prodCtx"]?.ref === void 0) throw new Error("One of the upstreams staging is not rendered.");
405
+ upstreamContexts.push(_milaboratories_pl_client.Pl.unwrapHolder(this.tx, info.fields["prodCtx"].ref));
406
+ });
407
+ return require_render_block.createBContextFromUpstreams(this.tx, upstreamContexts);
408
+ }
409
+ createStagingCtx(upstream) {
410
+ const upstreamContexts = [];
411
+ upstream.forEach((id) => {
412
+ const info = this.getBlockInfo(id);
413
+ if (info.fields["stagingCtx"]?.ref === void 0) throw new Error("One of the upstreams staging is not rendered.");
414
+ upstreamContexts.push(_milaboratories_pl_client.Pl.unwrapHolder(this.tx, info.fields["stagingCtx"].ref));
415
+ if (info.fields["prodCtx"]?.ref !== void 0) upstreamContexts.push(_milaboratories_pl_client.Pl.unwrapHolder(this.tx, info.fields["prodCtx"].ref));
416
+ });
417
+ return require_render_block.createBContextFromUpstreams(this.tx, upstreamContexts);
418
+ }
419
+ exportCtx(ctx) {
420
+ return require_context_export.exportContext(this.tx, _milaboratories_pl_client.Pl.unwrapHolder(this.tx, this.ctxExportTplHolder), ctx);
421
+ }
422
+ /**
423
+ * Renders staging for a block using currentPrerunArgs.
424
+ * If currentPrerunArgs is not set (prerunArgs returned undefined), skips staging for this block.
425
+ */
426
+ renderStagingFor(blockId) {
427
+ this.resetStaging(blockId);
428
+ const info = this.getBlockInfo(blockId);
429
+ const prerunArgsRef = info.fields.currentPrerunArgs?.ref;
430
+ if (prerunArgsRef === void 0) return;
431
+ const ctx = this.createStagingCtx(this.getStagingGraph().nodes.get(blockId).upstream);
432
+ if (this.getBlock(blockId).renderingMode !== "Heavy") throw new Error("not supported yet");
433
+ const tpl = info.getTemplate(this.tx);
434
+ const results = require_render_block.createRenderHeavyBlock(this.tx, tpl, {
435
+ args: prerunArgsRef,
436
+ blockId: this.tx.createValue(_milaboratories_pl_client.Pl.JsonString, JSON.stringify(blockId)),
437
+ isProduction: this.tx.createValue(_milaboratories_pl_client.Pl.JsonBool, JSON.stringify(false)),
438
+ context: ctx
439
+ });
440
+ this.setBlockField(blockId, "stagingCtx", _milaboratories_pl_client.Pl.wrapInEphHolder(this.tx, ctx), "NotReady");
441
+ this.setBlockField(blockId, "stagingUiCtx", this.exportCtx(results.context), "NotReady");
442
+ this.setBlockField(blockId, "stagingOutput", results.result, "NotReady");
443
+ }
444
+ renderProductionFor(blockId) {
445
+ this.resetProduction(blockId);
446
+ const info = this.getBlockInfo(blockId);
447
+ if (info.fields.currentArgs === void 0) throw new Error(`Can't render production for block ${blockId}: currentArgs not set`);
448
+ const ctx = this.createProdCtx(this.getPendingProductionGraph().nodes.get(blockId).upstream);
449
+ if (this.getBlock(blockId).renderingMode === "Light") throw new Error("Can't render production for light block.");
450
+ const tpl = info.getTemplate(this.tx);
451
+ const results = require_render_block.createRenderHeavyBlock(this.tx, tpl, {
452
+ args: info.fields.currentArgs.ref,
453
+ blockId: this.tx.createValue(_milaboratories_pl_client.Pl.JsonString, JSON.stringify(blockId)),
454
+ isProduction: this.tx.createValue(_milaboratories_pl_client.Pl.JsonBool, JSON.stringify(true)),
455
+ context: ctx
456
+ });
457
+ this.setBlockField(blockId, "prodCtx", _milaboratories_pl_client.Pl.wrapInEphHolder(this.tx, results.context), "NotReady");
458
+ this.setBlockField(blockId, "prodUiCtx", this.exportCtx(results.context), "NotReady");
459
+ this.setBlockField(blockId, "prodOutput", results.result, "NotReady");
460
+ this.setBlockFieldObj(blockId, "prodArgs", info.fields.currentArgs);
461
+ if (this.blocksInLimbo.delete(blockId)) this.renderingStateChanged = true;
462
+ }
463
+ initializeNewBlock(blockId, spec) {
464
+ const info = new BlockInfo(blockId, {}, (0, _platforma_sdk_model.extractConfig)(spec.blockPack.config), spec.blockPack.source);
465
+ this.blockInfos.set(blockId, info);
466
+ const bp = require_block_pack.createBlockPack(this.tx, spec.blockPack);
467
+ this.setBlockField(blockId, "blockPack", _milaboratories_pl_client.Pl.wrapInHolder(this.tx, bp), "NotReady");
468
+ this.setBlockFieldObj(blockId, "blockSettings", this.createJsonFieldValue(_milaboratories_pl_model_middle_layer.InitialBlockSettings));
469
+ const blockConfig = info.config;
470
+ let args;
471
+ let prerunArgs;
472
+ let storageToWrite;
473
+ if (spec.storageMode === "fromModel") {
474
+ storageToWrite = this.projectHelper.getInitialStorageInVM(blockConfig);
475
+ const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, storageToWrite);
476
+ if (deriveArgsResult.error) {
477
+ args = void 0;
478
+ prerunArgs = void 0;
479
+ } else {
480
+ args = deriveArgsResult.value;
481
+ prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, storageToWrite);
482
+ }
483
+ } else if (spec.storageMode === "legacy") {
484
+ args = JSON.parse(spec.legacyState).args;
485
+ if (args === void 0) throw new Error("args is undefined in legacyState");
486
+ prerunArgs = args;
487
+ storageToWrite = spec.legacyState;
488
+ } else throw new Error(`Unknown storageMode: ${spec.storageMode}`);
489
+ if (args !== void 0) this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(args));
490
+ if (prerunArgs !== void 0) this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
491
+ this.setBlockFieldObj(blockId, "blockStorage", this.createJsonFieldValueByContent(storageToWrite));
492
+ info.check();
493
+ }
494
+ getFieldNamesToDuplicate(blockId) {
495
+ const fields = this.getBlockInfo(blockId).fields;
496
+ const diff = (setA, setB) => new Set([...setA].filter((x) => !setB.has(x)));
497
+ if (fields.prodOutput?.status === "Ready" && fields.prodCtx?.status === "Ready") {
498
+ if (this.blocksInLimbo.has(blockId)) return require_project_model.FieldsToDuplicate;
499
+ return diff(require_project_model.FieldsToDuplicate, new Set([
500
+ "prodOutputPrevious",
501
+ "prodCtxPrevious",
502
+ "prodUiCtxPrevious"
503
+ ]));
504
+ } else return diff(require_project_model.FieldsToDuplicate, new Set([
505
+ "prodOutput",
506
+ "prodCtx",
507
+ "prodUiCtx",
508
+ "prodArgs",
509
+ "prodOutputPrevious",
510
+ "prodCtxPrevious",
511
+ "prodUiCtxPrevious"
512
+ ]));
513
+ }
514
+ initializeBlockDuplicate(blockId, originalBlockInfo) {
515
+ const info = new BlockInfo(blockId, {}, originalBlockInfo.config, originalBlockInfo.source);
516
+ this.blockInfos.set(blockId, info);
517
+ const fieldNamesToDuplicate = this.getFieldNamesToDuplicate(blockId);
518
+ for (const [fieldName, fieldState] of Object.entries(originalBlockInfo.fields)) if (fieldNamesToDuplicate.has(fieldName) && fieldState && fieldState.ref) this.setBlockFieldObj(blockId, fieldName, {
519
+ ref: fieldState.ref,
520
+ status: fieldState.status,
521
+ value: fieldState.value
522
+ });
523
+ this.resetOrLimboProduction(blockId);
524
+ info.check();
525
+ }
526
+ /** Very generic method, better check for more specialized case-specific methods first. */
527
+ updateStructure(newStructure, newBlockInitializer = NoNewBlocks) {
528
+ const currentStagingGraph = this.getStagingGraph();
529
+ const currentActualProductionGraph = this.getActualProductionGraph();
530
+ const stagingDiff = require_project_model_util.graphDiff(currentStagingGraph, require_project_model_util.stagingGraph(newStructure));
531
+ for (const blockId of stagingDiff.onlyInA) {
532
+ const { fields } = this.getBlockInfo(blockId);
533
+ this.deleteBlockFields(blockId, ...Object.keys(fields));
534
+ this.blockInfos.delete(blockId);
535
+ if (this.blocksInLimbo.delete(blockId)) this.renderingStateChanged = true;
536
+ }
537
+ for (const blockId of stagingDiff.onlyInB) newBlockInitializer(blockId);
538
+ for (const blockId of stagingDiff.different) this.resetStaging(blockId);
539
+ const prodDiff = require_project_model_util.graphDiff(currentActualProductionGraph, require_project_model_util.productionGraph(newStructure, (blockId) => this.getProductionGraphBlockInfo(blockId, true)));
540
+ currentActualProductionGraph.traverse("downstream", [...prodDiff.different], (node) => {
541
+ this.resetOrLimboProduction(node.id);
542
+ });
543
+ if (stagingDiff.onlyInB.size > 0 || stagingDiff.onlyInA.size > 0 || stagingDiff.different.size > 0) this.resetStagingRefreshTimestamp();
544
+ this.struct = newStructure;
545
+ this.structureChanged = true;
546
+ this.stagingGraph = void 0;
547
+ this.pendingProductionGraph = void 0;
548
+ this.actualProductionGraph = void 0;
549
+ this.updateLastModified();
550
+ }
551
+ addBlock(block, spec, before) {
552
+ const newStruct = this.structure;
553
+ if (before === void 0) newStruct.groups[newStruct.groups.length - 1].blocks.push(block);
554
+ else {
555
+ let done = false;
556
+ for (const group of newStruct.groups) {
557
+ const idx = group.blocks.findIndex((b) => b.id === before);
558
+ if (idx < 0) continue;
559
+ group.blocks.splice(idx, 0, block);
560
+ done = true;
561
+ break;
562
+ }
563
+ if (!done) throw new Error(`Can't find element with id: ${before}`);
564
+ }
565
+ this.updateStructure(newStruct, (blockId) => {
566
+ if (blockId !== block.id) throw new Error("Unexpected");
567
+ this.initializeNewBlock(blockId, spec);
568
+ });
569
+ }
570
+ /**
571
+ * Duplicates an existing block by copying all its fields and structure.
572
+ * This method creates a deep copy of the block at the mutator level.
573
+ *
574
+ * @param originalBlockId id of the block to duplicate
575
+ * @param newBlockId id for the new duplicated block
576
+ * @param after id of the block to insert new block after
577
+ */
578
+ duplicateBlock(originalBlockId, newBlockId, after) {
579
+ const originalBlock = this.getBlock(originalBlockId);
580
+ const originalBlockInfo = this.getBlockInfo(originalBlockId);
581
+ const newBlock = {
582
+ id: newBlockId,
583
+ label: originalBlock.label,
584
+ renderingMode: originalBlock.renderingMode
585
+ };
586
+ const newStruct = this.structure;
587
+ if (after === void 0) newStruct.groups[newStruct.groups.length - 1].blocks.push(newBlock);
588
+ else {
589
+ let done = false;
590
+ for (const group of newStruct.groups) {
591
+ const idx = group.blocks.findIndex((b) => b.id === after);
592
+ if (idx < 0) continue;
593
+ group.blocks.splice(idx + 1, 0, newBlock);
594
+ done = true;
595
+ break;
596
+ }
597
+ if (!done) throw new Error(`Can't find element with id: ${after}`);
598
+ }
599
+ this.updateStructure(newStruct, (blockId) => {
600
+ if (blockId !== newBlockId) throw new Error("Unexpected");
601
+ this.initializeBlockDuplicate(blockId, originalBlockInfo);
602
+ });
603
+ }
604
+ deleteBlock(blockId) {
605
+ const newStruct = this.structure;
606
+ let done = false;
607
+ for (const group of newStruct.groups) {
608
+ const idx = group.blocks.findIndex((b) => b.id === blockId);
609
+ if (idx < 0) continue;
610
+ group.blocks.splice(idx, 1);
611
+ done = true;
612
+ break;
613
+ }
614
+ if (!done) throw new Error(`Can't find element with id: ${blockId}`);
615
+ this.updateStructure(newStruct);
616
+ }
617
+ migrateBlockPack(blockId, spec, newClearState) {
618
+ const info = this.getBlockInfo(blockId);
619
+ const newConfig = (0, _platforma_sdk_model.extractConfig)(spec.config);
620
+ const persistBlockPack = () => {
621
+ this.setBlockField(blockId, "blockPack", _milaboratories_pl_client.Pl.wrapInHolder(this.tx, require_block_pack.createBlockPack(this.tx, spec)), "NotReady");
622
+ };
623
+ const applyStorageAndDeriveArgs = (storageJson) => {
624
+ persistBlockPack();
625
+ this.setBlockStorageRaw(blockId, storageJson);
626
+ const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(newConfig, storageJson);
627
+ if (!deriveArgsResult.error) {
628
+ this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(deriveArgsResult.value));
629
+ const prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(newConfig, storageJson);
630
+ if (prerunArgs !== void 0) this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
631
+ }
632
+ };
633
+ if (newClearState !== void 0) if (newConfig.modelAPIVersion === _platforma_sdk_model.BLOCK_STORAGE_FACADE_VERSION) {
634
+ applyStorageAndDeriveArgs(this.projectHelper.getInitialStorageInVM(newConfig));
635
+ this.blocksWithChangedInputs.add(blockId);
636
+ this.updateLastModified();
637
+ } else {
638
+ persistBlockPack();
639
+ this.setStates([{
640
+ modelAPIVersion: 1,
641
+ blockId,
642
+ state: newClearState.state
643
+ }]);
644
+ }
645
+ else {
646
+ if (newConfig.modelAPIVersion === _platforma_sdk_model.BLOCK_STORAGE_FACADE_VERSION) {
647
+ const currentStorageJson = info.blockStorageJson;
648
+ const migrationResult = this.projectHelper.migrateStorageInVM(newConfig, currentStorageJson);
649
+ if (migrationResult.error !== void 0) throw new Error(`[migrateBlockPack] Block ${blockId} migration failed: ${migrationResult.error}`);
650
+ console.log(`[migrateBlockPack] Block ${blockId}: ${migrationResult.info}`);
651
+ applyStorageAndDeriveArgs(migrationResult.newStorageJson);
652
+ } else {
653
+ persistBlockPack();
654
+ if (info.fields.currentArgs !== void 0) this.setBlockFieldObj(blockId, "currentPrerunArgs", info.fields.currentArgs);
655
+ }
656
+ this.blocksWithChangedInputs.add(blockId);
657
+ this.getStagingGraph().traverse("downstream", [blockId], ({ id }) => this.resetStaging(id));
658
+ }
659
+ if (info.productionRendered) this.getActualProductionGraph().traverse("downstream", [blockId], ({ id }) => this.resetOrLimboProduction(id));
660
+ this.updateLastModified();
661
+ }
662
+ renderProduction(blockIds, addUpstreams = false) {
663
+ const blockIdsSet = new Set(blockIds);
664
+ const prodGraph = this.getPendingProductionGraph();
665
+ if (addUpstreams) prodGraph.traverse("upstream", blockIds, (node) => {
666
+ blockIdsSet.add(node.id);
667
+ });
668
+ else for (const blockId of blockIdsSet) {
669
+ const node = prodGraph.nodes.get(blockId);
670
+ if (node === void 0) throw new Error(`Can't find block with id: ${blockId}`);
671
+ for (const upstream of node.upstream) if (!blockIdsSet.has(upstream)) throw new Error("Can't render blocks not including all upstreams.");
672
+ }
673
+ const rendered = /* @__PURE__ */ new Set();
674
+ for (const block of require_project_model_util.allBlocks(this.structure)) {
675
+ if (!blockIdsSet.has(block.id)) continue;
676
+ let render = this.getBlockInfo(block.id).requireProductionRendering || this.blocksInLimbo.has(block.id);
677
+ if (!render) {
678
+ for (const upstream of prodGraph.nodes.get(block.id).upstream) if (rendered.has(upstream)) {
679
+ render = true;
680
+ break;
681
+ }
682
+ }
683
+ if (render) {
684
+ this.renderProductionFor(block.id);
685
+ rendered.add(block.id);
686
+ }
687
+ }
688
+ const renderedArray = [...rendered];
689
+ prodGraph.traverse("downstream", renderedArray, (node) => {
690
+ if (rendered.has(node.id)) return;
691
+ this.resetOrLimboProduction(node.id);
692
+ });
693
+ this.getStagingGraph().traverse("downstream", renderedArray, ({ id }) => {
694
+ if (renderedArray[0] !== id) this.resetStaging(id);
695
+ });
696
+ if (rendered.size > 0) this.updateLastModified();
697
+ return rendered;
698
+ }
699
+ /** Stops running blocks from the list and modify states of other blocks
700
+ * accordingly */
701
+ stopProduction(...blockIds) {
702
+ const activeProdGraph = this.getActualProductionGraph();
703
+ const queue = new denque.default(blockIds);
704
+ const queued = new Set(blockIds);
705
+ const stopped = [];
706
+ while (!queue.isEmpty()) {
707
+ const blockId = queue.shift();
708
+ const fields = this.getBlockInfo(blockId).fields;
709
+ if (fields.prodOutput?.status === "Ready" && fields.prodCtx?.status === "Ready") continue;
710
+ if (this.deleteBlockFields(blockId, "prodOutput", "prodCtx", "prodUiCtx", "prodArgs")) {
711
+ stopped.push(blockId);
712
+ for (const downstream of activeProdGraph.traverseIdsExcludingRoots("downstream", blockId)) {
713
+ if (queued.has(downstream)) continue;
714
+ queue.push(downstream);
715
+ queued.add(downstream);
716
+ }
717
+ }
718
+ }
719
+ for (const blockId of activeProdGraph.traverseIdsExcludingRoots("downstream", ...stopped)) this.resetOrLimboProduction(blockId);
720
+ this.getStagingGraph().traverse("downstream", stopped, ({ id }) => this.resetStaging(id));
721
+ }
722
+ traverseWithStagingLag(cb) {
723
+ const lags = /* @__PURE__ */ new Map();
724
+ this.getStagingGraph().nodes.forEach((node) => {
725
+ const info = this.getBlockInfo(node.id);
726
+ const requiresRendering = info.requireStagingRendering;
727
+ let lag = requiresRendering ? 1 : 0;
728
+ node.upstream.forEach((upstream) => {
729
+ const upstreamLag = lags.get(upstream);
730
+ if (upstreamLag === 0) return;
731
+ lag = Math.max(upstreamLag + 1, lag);
732
+ });
733
+ if (!requiresRendering && info.stagingRendered) {}
734
+ cb(node.id, lag);
735
+ lags.set(node.id, lag);
736
+ });
737
+ }
738
+ /** @param stagingRenderingRate rate in blocks per second */
739
+ refreshStagings(stagingRenderingRate) {
740
+ const elapsed = Date.now() - this.renderingState.stagingRefreshTimestamp;
741
+ const lagThreshold = stagingRenderingRate === void 0 ? void 0 : 1 + Math.max(0, elapsed * stagingRenderingRate / 1e3);
742
+ let rendered = 0;
743
+ this.traverseWithStagingLag((blockId, lag) => {
744
+ if (lag === 0) return;
745
+ if (lagThreshold === void 0 || lag <= lagThreshold) {
746
+ this.renderStagingFor(blockId);
747
+ rendered++;
748
+ }
749
+ });
750
+ if (rendered > 0) this.resetStagingRefreshTimestamp();
751
+ }
752
+ /** Updates project metadata */
753
+ setMeta(meta) {
754
+ this.meta = meta;
755
+ this.metaChanged = true;
756
+ this.updateLastModified();
757
+ }
758
+ /** @param stagingRenderingRate rate in blocks per second */
759
+ doRefresh(stagingRenderingRate) {
760
+ this.refreshStagings(stagingRenderingRate);
761
+ this.blockInfos.forEach((blockInfo) => {
762
+ if (blockInfo.fields.prodCtx?.status === "Ready" && blockInfo.fields.prodOutput?.status === "Ready") this.deleteBlockFields(blockInfo.id, "prodOutputPrevious", "prodCtxPrevious", "prodUiCtxPrevious");
763
+ if (blockInfo.fields.stagingCtx?.status === "Ready" && blockInfo.fields.stagingOutput?.status === "Ready") this.deleteBlockFields(blockInfo.id, "stagingOutputPrevious", "stagingCtxPrevious", "stagingUiCtxPrevious");
764
+ });
765
+ }
766
+ assignAuthorMarkers() {
767
+ const markerStr = this.author ? JSON.stringify(this.author) : void 0;
768
+ for (const blockId of this.blocksWithChangedInputs) if (markerStr === void 0) this.tx.deleteKValue(this.rid, require_project_model.blockArgsAuthorKey(blockId));
769
+ else this.tx.setKValue(this.rid, require_project_model.blockArgsAuthorKey(blockId), markerStr);
770
+ if (this.metaChanged || this.structureChanged) if (markerStr === void 0) this.tx.deleteKValue(this.rid, require_project_model.ProjectStructureAuthorKey);
771
+ else this.tx.setKValue(this.rid, require_project_model.ProjectStructureAuthorKey, markerStr);
772
+ }
773
+ save() {
774
+ if (!this.wasModified) return;
775
+ if (this.lastModifiedChanged) this.tx.setKValue(this.rid, require_project_model.ProjectLastModifiedTimestamp, JSON.stringify(this.lastModified));
776
+ if (this.structureChanged) this.tx.setKValue(this.rid, require_project_model.ProjectStructureKey, JSON.stringify(this.struct));
777
+ if (this.renderingStateChanged) this.tx.setKValue(this.rid, require_project_model.BlockRenderingStateKey, JSON.stringify({
778
+ ...this.renderingState,
779
+ blocksInLimbo: [...this.blocksInLimbo]
780
+ }));
781
+ if (this.metaChanged) this.tx.setKValue(this.rid, require_project_model.ProjectMetaKey, JSON.stringify(this.meta));
782
+ this.assignAuthorMarkers();
783
+ }
784
+ static async load(projectHelper, tx, rid, author) {
785
+ const fullResourceStateP = tx.getResourceData(rid, true);
786
+ const schemaP = tx.getKValueJson(rid, require_project_model.SchemaVersionKey);
787
+ const lastModifiedP = tx.getKValueJson(rid, require_project_model.ProjectLastModifiedTimestamp);
788
+ const metaP = tx.getKValueJson(rid, require_project_model.ProjectMetaKey);
789
+ const structureP = tx.getKValueJson(rid, require_project_model.ProjectStructureKey);
790
+ const renderingStateP = tx.getKValueJson(rid, require_project_model.BlockRenderingStateKey);
791
+ const fullResourceState = await fullResourceStateP;
792
+ const blockInfoStates = /* @__PURE__ */ new Map();
793
+ for (const f of fullResourceState.fields) {
794
+ const projectField = require_project_model.parseProjectField(f.name);
795
+ if (projectField === void 0) continue;
796
+ let info = blockInfoStates.get(projectField.blockId);
797
+ if (info === void 0) {
798
+ info = {
799
+ id: projectField.blockId,
800
+ fields: {}
801
+ };
802
+ blockInfoStates.set(projectField.blockId, info);
803
+ }
804
+ info.fields[projectField.fieldName] = (0, _milaboratories_pl_client.isNullResourceId)(f.value) ? { modCount: 0 } : {
805
+ modCount: 0,
806
+ ref: f.value
807
+ };
808
+ }
809
+ const blockFieldRequests = [];
810
+ blockInfoStates.forEach((info) => {
811
+ const fields = info.fields;
812
+ for (const [fName, state] of Object.entries(fields)) {
813
+ if (state.ref === void 0) continue;
814
+ if (!(0, _milaboratories_pl_client.isResource)(state.ref) || (0, _milaboratories_pl_client.isResourceRef)(state.ref)) throw new Error("unexpected behaviour");
815
+ const fieldName = fName;
816
+ blockFieldRequests.push([
817
+ info,
818
+ fieldName,
819
+ state,
820
+ tx.getResourceData(state.ref, fieldName == "blockPack")
821
+ ]);
822
+ }
823
+ });
824
+ const [schema, lastModified, meta, structure, { stagingRefreshTimestamp, blocksInLimbo }] = await Promise.all([
825
+ schemaP,
826
+ lastModifiedP,
827
+ metaP,
828
+ structureP,
829
+ renderingStateP
830
+ ]);
831
+ if (schema !== require_project_model.SchemaVersionCurrent) if (Number(schema) < Number(require_project_model.SchemaVersionCurrent)) throw new _platforma_sdk_model.UiError(`Can't perform this action on this project because it has older schema. Try (re)loading the project to update it.`);
832
+ else throw new _platforma_sdk_model.UiError(`Can't perform this action on this project because it has newer schema. Upgrade your desktop app to the latest version.`);
833
+ const blockPackRequests = [];
834
+ for (const [info, fieldName, state, response] of blockFieldRequests) {
835
+ const result = await response;
836
+ state.value = result.data;
837
+ if ((0, _milaboratories_pl_client.isNotNullResourceId)(result.error)) state.status = "Error";
838
+ else if (result.resourceReady || (0, _milaboratories_pl_client.isNotNullResourceId)(result.originalResourceId)) state.status = "Ready";
839
+ else state.status = "NotReady";
840
+ if (fieldName === "blockPack") {
841
+ const refField = result.fields.find((f) => f.name === _milaboratories_pl_client.Pl.HolderRefField);
842
+ if (refField === void 0) throw new Error("Block pack ref field is missing");
843
+ blockPackRequests.push([info, tx.getResourceData((0, _milaboratories_pl_client.ensureResourceIdNotNull)(refField.value), false)]);
844
+ }
845
+ }
846
+ for (const [info, response] of blockPackRequests) {
847
+ const bpInfo = (0, _milaboratories_ts_helpers.cachedDeserialize)((0, _milaboratories_ts_helpers.notEmpty)((await response).data));
848
+ info.blockConfig = (0, _platforma_sdk_model.extractConfig)(bpInfo.config);
849
+ info.blockPack = bpInfo.source;
850
+ }
851
+ const ctxExportTplEnvelope = await require_context_export.getPreparedExportTemplateEnvelope();
852
+ const ctxExportTplCacheFieldName = require_project_model.getServiceTemplateField(ctxExportTplEnvelope.hash);
853
+ const ctxExportTplField = fullResourceState.fields.find((f) => f.name === ctxExportTplCacheFieldName);
854
+ let ctxExportTplHolder;
855
+ if (ctxExportTplField !== void 0) ctxExportTplHolder = (0, _milaboratories_pl_client.ensureResourceIdNotNull)(ctxExportTplField.value);
856
+ else {
857
+ ctxExportTplHolder = _milaboratories_pl_client.Pl.wrapInHolder(tx, require_template_loading.loadTemplate(tx, ctxExportTplEnvelope.spec));
858
+ tx.createField((0, _milaboratories_pl_client.field)(rid, require_project_model.getServiceTemplateField(ctxExportTplEnvelope.hash)), "Dynamic", ctxExportTplHolder);
859
+ }
860
+ const renderingState = { stagingRefreshTimestamp };
861
+ const blocksInLimboSet = new Set(blocksInLimbo);
862
+ const blockInfos = /* @__PURE__ */ new Map();
863
+ blockInfoStates.forEach(({ id, fields, blockConfig, blockPack }) => blockInfos.set(id, new BlockInfo(id, fields, (0, _milaboratories_ts_helpers.notEmpty)(blockConfig), (0, _milaboratories_ts_helpers.notEmpty)(blockPack))));
864
+ const blockInStruct = /* @__PURE__ */ new Set();
865
+ for (const b of require_project_model_util.allBlocks(structure)) {
866
+ if (!blockInfos.has(b.id)) throw new Error(`Inconsistent project structure: no inputs for ${b.id}`);
867
+ blockInStruct.add(b.id);
868
+ }
869
+ blockInfos.forEach((info) => {
870
+ if (!blockInStruct.has(info.id)) throw new Error(`Inconsistent project structure: no structure entry for ${info.id}`);
871
+ info.check();
872
+ });
873
+ const prj = new ProjectMutator(rid, tx, author, schema, lastModified, meta, structure, renderingState, blocksInLimboSet, blockInfos, ctxExportTplHolder, projectHelper);
874
+ prj.fixProblemsAndMigrate();
875
+ return prj;
876
+ }
877
+ };
878
+ async function createProject(tx, meta = require_project_model.InitialBlockMeta) {
879
+ const prj = tx.createEphemeral(require_project_model.ProjectResourceType);
880
+ tx.lock(prj);
881
+ const ts = String(Date.now());
882
+ tx.setKValue(prj, require_project_model.SchemaVersionKey, JSON.stringify(require_project_model.SchemaVersionCurrent));
883
+ tx.setKValue(prj, require_project_model.ProjectCreatedTimestamp, ts);
884
+ tx.setKValue(prj, require_project_model.ProjectLastModifiedTimestamp, ts);
885
+ tx.setKValue(prj, require_project_model.ProjectMetaKey, JSON.stringify(meta));
886
+ tx.setKValue(prj, require_project_model.ProjectStructureKey, JSON.stringify(require_project_model.InitialBlockStructure));
887
+ tx.setKValue(prj, require_project_model.BlockRenderingStateKey, JSON.stringify(require_project_model.InitialProjectRenderingState));
888
+ const ctxExportTplEnvelope = await require_context_export.getPreparedExportTemplateEnvelope();
889
+ tx.createField((0, _milaboratories_pl_client.field)(prj, require_project_model.getServiceTemplateField(ctxExportTplEnvelope.hash)), "Dynamic", _milaboratories_pl_client.Pl.wrapInHolder(tx, require_template_loading.loadTemplate(tx, ctxExportTplEnvelope.spec)));
890
+ return prj;
1223
891
  }
1224
892
  async function withProject(projectHelper, txOrPl, rid, cb, ops) {
1225
- return withProjectAuthored(projectHelper, txOrPl, rid, undefined, cb, ops);
893
+ return withProjectAuthored(projectHelper, txOrPl, rid, void 0, cb, ops);
1226
894
  }
1227
895
  async function withProjectAuthored(projectHelper, txOrPl, rid, author, cb, ops = {}) {
1228
- if (txOrPl instanceof plClient.PlClient) {
1229
- return await txOrPl.withWriteTx("ProjectAction" + (ops.name ? `: ${ops.name}` : ""), async (tx) => {
1230
- const mut = await ProjectMutator.load(projectHelper, tx, rid, author);
1231
- const result = await cb(mut);
1232
- if (!mut.wasModified)
1233
- // skipping save and commit altogether if no modifications were actually made
1234
- return result;
1235
- mut.save();
1236
- await tx.commit();
1237
- if (index.getDebugFlags().logProjectMutationStat)
1238
- console.log(JSON.stringify(tx.stat));
1239
- return result;
1240
- }, ops);
1241
- }
1242
- else {
1243
- const mut = await ProjectMutator.load(projectHelper, txOrPl, rid, author);
1244
- const result = await cb(mut);
1245
- mut.save();
1246
- return result;
1247
- }
896
+ if (txOrPl instanceof _milaboratories_pl_client.PlClient) return await txOrPl.withWriteTx("ProjectAction" + (ops.name ? `: ${ops.name}` : ""), async (tx) => {
897
+ const mut = await ProjectMutator.load(projectHelper, tx, rid, author);
898
+ const result = await cb(mut);
899
+ if (!mut.wasModified) return result;
900
+ mut.save();
901
+ await tx.commit();
902
+ if (require_index.getDebugFlags().logProjectMutationStat) console.log(JSON.stringify(tx.stat));
903
+ return result;
904
+ }, ops);
905
+ else {
906
+ const mut = await ProjectMutator.load(projectHelper, txOrPl, rid, author);
907
+ const result = await cb(mut);
908
+ mut.save();
909
+ return result;
910
+ }
1248
911
  }
1249
912
 
1250
- exports.ProjectMutator = ProjectMutator;
913
+ //#endregion
1251
914
  exports.createProject = createProject;
1252
915
  exports.withProject = withProject;
1253
916
  exports.withProjectAuthored = withProjectAuthored;
1254
- //# sourceMappingURL=project.cjs.map
917
+ //# sourceMappingURL=project.cjs.map