@milaboratories/pl-middle-layer 1.74.19 → 1.76.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/index.cjs +1 -0
  2. package/dist/index.d.ts +3 -2
  3. package/dist/index.js +2 -2
  4. package/dist/middle_layer/block.cjs.map +1 -1
  5. package/dist/middle_layer/block.js.map +1 -1
  6. package/dist/middle_layer/block_action_context.cjs +57 -0
  7. package/dist/middle_layer/block_action_context.cjs.map +1 -0
  8. package/dist/middle_layer/block_action_context.d.ts +47 -0
  9. package/dist/middle_layer/block_action_context.d.ts.map +1 -0
  10. package/dist/middle_layer/block_action_context.js +57 -0
  11. package/dist/middle_layer/block_action_context.js.map +1 -0
  12. package/dist/middle_layer/build_stamp.cjs +1 -1
  13. package/dist/middle_layer/build_stamp.js +1 -1
  14. package/dist/middle_layer/column_links.cjs +106 -0
  15. package/dist/middle_layer/column_links.cjs.map +1 -0
  16. package/dist/middle_layer/column_links.js +104 -0
  17. package/dist/middle_layer/column_links.js.map +1 -0
  18. package/dist/middle_layer/index.d.ts +2 -1
  19. package/dist/middle_layer/middle_layer.cjs +1 -0
  20. package/dist/middle_layer/middle_layer.cjs.map +1 -1
  21. package/dist/middle_layer/middle_layer.js +1 -0
  22. package/dist/middle_layer/middle_layer.js.map +1 -1
  23. package/dist/middle_layer/project.cjs +53 -19
  24. package/dist/middle_layer/project.cjs.map +1 -1
  25. package/dist/middle_layer/project.d.ts +6 -0
  26. package/dist/middle_layer/project.d.ts.map +1 -1
  27. package/dist/middle_layer/project.js +54 -20
  28. package/dist/middle_layer/project.js.map +1 -1
  29. package/dist/middle_layer/project_overview.cjs +56 -24
  30. package/dist/middle_layer/project_overview.cjs.map +1 -1
  31. package/dist/middle_layer/project_overview.js +55 -25
  32. package/dist/middle_layer/project_overview.js.map +1 -1
  33. package/dist/model/args_derivation.cjs +153 -0
  34. package/dist/model/args_derivation.cjs.map +1 -0
  35. package/dist/model/args_derivation.d.ts +21 -0
  36. package/dist/model/args_derivation.d.ts.map +1 -0
  37. package/dist/model/args_derivation.js +148 -0
  38. package/dist/model/args_derivation.js.map +1 -0
  39. package/dist/model/project_helper.cjs +34 -8
  40. package/dist/model/project_helper.cjs.map +1 -1
  41. package/dist/model/project_helper.d.ts +18 -5
  42. package/dist/model/project_helper.d.ts.map +1 -1
  43. package/dist/model/project_helper.js +34 -8
  44. package/dist/model/project_helper.js.map +1 -1
  45. package/dist/model/project_model.cjs +2 -1
  46. package/dist/model/project_model.cjs.map +1 -1
  47. package/dist/model/project_model.d.ts +1 -1
  48. package/dist/model/project_model.js +2 -1
  49. package/dist/model/project_model.js.map +1 -1
  50. package/dist/mutator/project.cjs +73 -12
  51. package/dist/mutator/project.cjs.map +1 -1
  52. package/dist/mutator/project.d.ts +1 -0
  53. package/dist/mutator/project.d.ts.map +1 -1
  54. package/dist/mutator/project.js +73 -12
  55. package/dist/mutator/project.js.map +1 -1
  56. package/dist/mutator/template/render_block.cjs +35 -2
  57. package/dist/mutator/template/render_block.cjs.map +1 -1
  58. package/dist/mutator/template/render_block.js +35 -4
  59. package/dist/mutator/template/render_block.js.map +1 -1
  60. package/dist/mutator/template/render_template.cjs +16 -1
  61. package/dist/mutator/template/render_template.cjs.map +1 -1
  62. package/dist/mutator/template/render_template.d.ts +12 -1
  63. package/dist/mutator/template/render_template.d.ts.map +1 -1
  64. package/dist/mutator/template/render_template.js +16 -2
  65. package/dist/mutator/template/render_template.js.map +1 -1
  66. package/package.json +16 -16
  67. package/src/middle_layer/block.ts +4 -1
  68. package/src/middle_layer/block_action_context.test.ts +148 -0
  69. package/src/middle_layer/block_action_context.ts +162 -0
  70. package/src/middle_layer/column_links.test.ts +350 -0
  71. package/src/middle_layer/column_links.ts +152 -0
  72. package/src/middle_layer/index.ts +6 -0
  73. package/src/middle_layer/middle_layer.ts +2 -0
  74. package/src/middle_layer/project.ts +52 -5
  75. package/src/middle_layer/project_overview.test.ts +200 -0
  76. package/src/middle_layer/project_overview.ts +82 -28
  77. package/src/model/args.test.ts +39 -1
  78. package/src/model/args_derivation.test.ts +326 -0
  79. package/src/model/args_derivation.ts +194 -0
  80. package/src/model/project_helper.ts +55 -25
  81. package/src/model/project_model.ts +7 -2
  82. package/src/mutator/project-v3.test.ts +105 -1
  83. package/src/mutator/project.ts +128 -37
  84. package/src/mutator/project_action_context.test.ts +178 -0
  85. package/src/mutator/template/render_block.ts +70 -5
  86. package/src/mutator/template/render_template.ts +22 -2
  87. package/src/test/fake_project.ts +222 -0
@@ -1 +1 @@
1
- {"version":3,"file":"project_model.js","names":[],"sources":["../../src/model/project_model.ts"],"sourcesContent":["import type { ResourceType } from \"@milaboratories/pl-client\";\nimport type { ProjectId } from \"@milaboratories/pl-model-common\";\nimport type {\n ProjectListEntry as ProjectListEntryFromModel,\n ProjectMeta,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport type { BlockRenderingMode } from \"@platforma-sdk/model\";\n\nexport type { ProjectId };\n\nexport interface ProjectListEntry extends Omit<ProjectListEntryFromModel, \"id\"> {\n /** Unique project identifier in middle layer. Use to operate with given project. */\n id: ProjectId;\n}\n\n/** Entry representing a single block in block structure */\nexport interface Block {\n /** Unique block id */\n readonly id: string;\n\n /**\n * Label shown to the user\n * @deprecated\n * */\n label: string;\n\n /** How to approach block rendering */\n renderingMode: BlockRenderingMode;\n}\n\n/** Block group in block structure */\nexport interface BlockGroup {\n /** Unique group id */\n readonly id: string;\n\n /** Label shown to the user */\n label: string;\n\n /** Blocks */\n blocks: Block[];\n}\n\n/** Root of block structure value */\nexport interface ProjectStructure {\n /** The structure */\n readonly groups: BlockGroup[];\n}\n\nexport const InitialBlockStructure: ProjectStructure = {\n groups: [{ id: \"default\", label: \"Default\", blocks: [] }],\n};\n\n/** Root of project rendering state */\nexport interface ProjectRenderingState {\n /** Timestamp of last staging rendering event */\n stagingRefreshTimestamp: number;\n\n /** Blocks with detached production state, i.e. some of the dependencies of\n * such blocks were re-rendered, but their state was left \"as is\". */\n blocksInLimbo: string[];\n}\n\nexport const InitialProjectRenderingState: ProjectRenderingState = {\n stagingRefreshTimestamp: 0,\n blocksInLimbo: [],\n};\n\nexport const InitialBlockMeta: ProjectMeta = {\n label: \"New Project\",\n};\n\n//\n// Pl Model\n//\n\nexport const ProjectResourceType: ResourceType = { name: \"UserProject\", version: \"2\" };\n\nexport const SchemaVersionKey = \"SchemaVersion\";\nexport const SchemaVersionV2 = \"2\";\nexport const SchemaVersionV3 = \"3\";\nexport const SchemaVersionCurrent = \"4\";\n\nexport const ProjectCreatedTimestamp = \"ProjectCreated\";\nexport const ProjectLastModifiedTimestamp = \"ProjectLastModified\";\nexport const ProjectMetaKey = \"ProjectMeta\";\nexport const ProjectStructureKey = \"ProjectStructure\";\nexport const BlockRenderingStateKey = \"BlockRenderingState\";\n\nexport const BlockArgsAuthorKeyPrefix = \"BlockArgsAuthor/\";\nexport const BlockArgsAuthorKeyPattern = /^BlockArgsAuthor\\/(?<blockid>.*)$/;\n\nexport function blockArgsAuthorKey(blockId: string): string {\n return `${BlockArgsAuthorKeyPrefix}${blockId}`;\n}\n\nexport const ProjectStructureAuthorKey = \"ProjectStructureAuthor\";\n\nexport const ServiceTemplateCacheFieldPrefix = \"__serviceTemplate_\";\n\nexport function getServiceTemplateField(hash: string): string {\n return `${ServiceTemplateCacheFieldPrefix}${hash}`;\n}\n\nexport interface ProjectField {\n blockId: string;\n fieldName:\n | \"blockPack\"\n | \"blockSettings\"\n | \"blockStorage\" // Persistent storage for v3 blocks (state, plugins data, etc.)\n | \"prodArgs\"\n | \"currentArgs\"\n | \"currentPrerunArgs\" // Derived args for staging/prerun rendering (from prerunArgs() or args())\n | \"prodChainCtx\" // Pre-built production context chain node (accumulated prodCtx from all blocks above)\n | \"prodCtx\"\n | \"prodUiCtx\"\n | \"prodOutput\"\n | \"prodCtxPrevious\"\n | \"prodUiCtxPrevious\"\n | \"prodOutputPrevious\"\n | \"stagingCtx\"\n | \"stagingUiCtx\"\n | \"stagingOutput\"\n | \"stagingCtxPrevious\"\n | \"stagingUiCtxPrevious\"\n | \"stagingOutputPrevious\";\n}\n\nexport const FieldsToDuplicate: Set<ProjectField[\"fieldName\"]> = new Set([\n \"blockPack\",\n \"blockSettings\",\n \"blockStorage\",\n \"prodArgs\",\n \"currentArgs\",\n \"currentPrerunArgs\",\n \"prodCtx\",\n \"prodUiCtx\",\n \"prodOutput\",\n]);\n\nexport function projectFieldName(blockId: string, fieldName: ProjectField[\"fieldName\"]): string {\n return `${blockId}-${fieldName}`;\n}\n\nconst projectFieldPattern =\n /^(?<blockId>.*)-(?<fieldName>blockPack|blockSettings|blockStorage|inputsValid|prodArgs|currentArgs|currentPrerunArgs|prodChainCtx|prodCtx|prodUiCtx|prodOutput|prodCtxPrevious|prodUiCtxPrevious|prodOutputPrevious|stagingCtx|stagingUiCtx|stagingOutput|stagingCtxPrevious|stagingUiCtxPrevious|stagingOutputPrevious)$/;\n\nexport function parseProjectField(name: string): ProjectField | undefined {\n const match = name.match(projectFieldPattern);\n if (match === null) return undefined;\n const { blockId, fieldName } = match.groups!;\n return { blockId, fieldName } as ProjectField;\n}\n"],"mappings":";AAgDA,MAAa,wBAA0C,EACrD,QAAQ,CAAC;CAAE,IAAI;CAAW,OAAO;CAAW,QAAQ,CAAC;AAAE,CAAC,EAC1D;AAYA,MAAa,+BAAsD;CACjE,yBAAyB;CACzB,eAAe,CAAC;AAClB;AAEA,MAAa,mBAAgC,EAC3C,OAAO,cACT;AAMA,MAAa,sBAAoC;CAAE,MAAM;CAAe,SAAS;AAAI;AAErF,MAAa,mBAAmB;AAGhC,MAAa,uBAAuB;AAEpC,MAAa,0BAA0B;AACvC,MAAa,+BAA+B;AAC5C,MAAa,iBAAiB;AAC9B,MAAa,sBAAsB;AACnC,MAAa,yBAAyB;AAEtC,MAAa,2BAA2B;AAGxC,SAAgB,mBAAmB,SAAyB;CAC1D,OAAO,GAAG,2BAA2B;AACvC;AAEA,MAAa,4BAA4B;AAEzC,MAAa,kCAAkC;AAE/C,SAAgB,wBAAwB,MAAsB;CAC5D,OAAO,GAAG,kCAAkC;AAC9C;AA0BA,MAAa,oCAAoD,IAAI,IAAI;CACvE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgB,iBAAiB,SAAiB,WAA8C;CAC9F,OAAO,GAAG,QAAQ,GAAG;AACvB;AAEA,MAAM,sBACJ;AAEF,SAAgB,kBAAkB,MAAwC;CACxE,MAAM,QAAQ,KAAK,MAAM,mBAAmB;CAC5C,IAAI,UAAU,MAAM,OAAO,KAAA;CAC3B,MAAM,EAAE,SAAS,cAAc,MAAM;CACrC,OAAO;EAAE;EAAS;CAAU;AAC9B"}
1
+ {"version":3,"file":"project_model.js","names":[],"sources":["../../src/model/project_model.ts"],"sourcesContent":["import type { ResourceType } from \"@milaboratories/pl-client\";\nimport type { ProjectId } from \"@milaboratories/pl-model-common\";\nimport type {\n ProjectListEntry as ProjectListEntryFromModel,\n ProjectMeta,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport type { BlockRenderingMode } from \"@platforma-sdk/model\";\n\nexport type { ProjectId };\n\nexport interface ProjectListEntry extends Omit<ProjectListEntryFromModel, \"id\"> {\n /** Unique project identifier in middle layer. Use to operate with given project. */\n id: ProjectId;\n}\n\n/** Entry representing a single block in block structure */\nexport interface Block {\n /** Unique block id */\n readonly id: string;\n\n /**\n * Label shown to the user\n * @deprecated\n * */\n label: string;\n\n /** How to approach block rendering */\n renderingMode: BlockRenderingMode;\n}\n\n/** Block group in block structure */\nexport interface BlockGroup {\n /** Unique group id */\n readonly id: string;\n\n /** Label shown to the user */\n label: string;\n\n /** Blocks */\n blocks: Block[];\n}\n\n/** Root of block structure value */\nexport interface ProjectStructure {\n /** The structure */\n readonly groups: BlockGroup[];\n}\n\nexport const InitialBlockStructure: ProjectStructure = {\n groups: [{ id: \"default\", label: \"Default\", blocks: [] }],\n};\n\n/** Root of project rendering state */\nexport interface ProjectRenderingState {\n /** Timestamp of last staging rendering event */\n stagingRefreshTimestamp: number;\n\n /** Blocks with detached production state, i.e. some of the dependencies of\n * such blocks were re-rendered, but their state was left \"as is\". */\n blocksInLimbo: string[];\n}\n\nexport const InitialProjectRenderingState: ProjectRenderingState = {\n stagingRefreshTimestamp: 0,\n blocksInLimbo: [],\n};\n\nexport const InitialBlockMeta: ProjectMeta = {\n label: \"New Project\",\n};\n\n//\n// Pl Model\n//\n\nexport const ProjectResourceType: ResourceType = { name: \"UserProject\", version: \"2\" };\n\nexport const SchemaVersionKey = \"SchemaVersion\";\nexport const SchemaVersionV2 = \"2\";\nexport const SchemaVersionV3 = \"3\";\nexport const SchemaVersionCurrent = \"4\";\n\nexport const ProjectCreatedTimestamp = \"ProjectCreated\";\nexport const ProjectLastModifiedTimestamp = \"ProjectLastModified\";\nexport const ProjectMetaKey = \"ProjectMeta\";\nexport const ProjectStructureKey = \"ProjectStructure\";\nexport const BlockRenderingStateKey = \"BlockRenderingState\";\n\nexport const BlockArgsAuthorKeyPrefix = \"BlockArgsAuthor/\";\nexport const BlockArgsAuthorKeyPattern = /^BlockArgsAuthor\\/(?<blockid>.*)$/;\n\nexport function blockArgsAuthorKey(blockId: string): string {\n return `${BlockArgsAuthorKeyPrefix}${blockId}`;\n}\n\nexport const ProjectStructureAuthorKey = \"ProjectStructureAuthor\";\n\nexport const ServiceTemplateCacheFieldPrefix = \"__serviceTemplate_\";\n\nexport function getServiceTemplateField(hash: string): string {\n return `${ServiceTemplateCacheFieldPrefix}${hash}`;\n}\n\nexport interface ProjectField {\n blockId: string;\n fieldName:\n | \"blockPack\"\n | \"blockSettings\"\n | \"blockStorage\" // Persistent storage for v3 blocks (state, plugins data, etc.)\n | \"prodArgs\"\n | \"currentArgs\"\n | \"currentPrerunArgs\" // Derived args for staging/prerun rendering (from prerunArgs() or args())\n | \"inputsValid\" // Model API v2: errors found in currentArgs, none when the block may run, with the fingerprint of those args; present while currentArgs are\n | \"prodChainCtx\" // Pre-built production context chain node (accumulated prodCtx from all blocks above)\n | \"prodCtx\"\n | \"prodUiCtx\"\n | \"prodOutput\"\n | \"prodCtxPrevious\"\n | \"prodUiCtxPrevious\"\n | \"prodOutputPrevious\"\n | \"stagingCtx\"\n | \"stagingUiCtx\"\n | \"stagingOutput\"\n | \"stagingCtxPrevious\"\n | \"stagingUiCtxPrevious\"\n | \"stagingOutputPrevious\"\n // Root action context of the current render. The project holds it so it outlives the render.\n | \"prodActionContext\"\n | \"stagingActionContext\";\n}\n\nexport const FieldsToDuplicate: Set<ProjectField[\"fieldName\"]> = new Set([\n \"blockPack\",\n \"blockSettings\",\n \"blockStorage\",\n \"prodArgs\",\n \"currentArgs\",\n \"currentPrerunArgs\",\n \"inputsValid\",\n \"prodCtx\",\n \"prodUiCtx\",\n \"prodOutput\",\n]);\n\nexport function projectFieldName(blockId: string, fieldName: ProjectField[\"fieldName\"]): string {\n return `${blockId}-${fieldName}`;\n}\n\nconst projectFieldPattern =\n /^(?<blockId>.*)-(?<fieldName>blockPack|blockSettings|blockStorage|inputsValid|prodArgs|currentArgs|currentPrerunArgs|prodChainCtx|prodCtx|prodUiCtx|prodOutput|prodCtxPrevious|prodUiCtxPrevious|prodOutputPrevious|stagingCtx|stagingUiCtx|stagingOutput|stagingCtxPrevious|stagingUiCtxPrevious|stagingOutputPrevious|prodActionContext|stagingActionContext)$/;\n\nexport function parseProjectField(name: string): ProjectField | undefined {\n const match = name.match(projectFieldPattern);\n if (match === null) return undefined;\n const { blockId, fieldName } = match.groups!;\n return { blockId, fieldName } as ProjectField;\n}\n"],"mappings":";AAgDA,MAAa,wBAA0C,EACrD,QAAQ,CAAC;CAAE,IAAI;CAAW,OAAO;CAAW,QAAQ,CAAC;AAAE,CAAC,EAC1D;AAYA,MAAa,+BAAsD;CACjE,yBAAyB;CACzB,eAAe,CAAC;AAClB;AAEA,MAAa,mBAAgC,EAC3C,OAAO,cACT;AAMA,MAAa,sBAAoC;CAAE,MAAM;CAAe,SAAS;AAAI;AAErF,MAAa,mBAAmB;AAGhC,MAAa,uBAAuB;AAEpC,MAAa,0BAA0B;AACvC,MAAa,+BAA+B;AAC5C,MAAa,iBAAiB;AAC9B,MAAa,sBAAsB;AACnC,MAAa,yBAAyB;AAEtC,MAAa,2BAA2B;AAGxC,SAAgB,mBAAmB,SAAyB;CAC1D,OAAO,GAAG,2BAA2B;AACvC;AAEA,MAAa,4BAA4B;AAEzC,MAAa,kCAAkC;AAE/C,SAAgB,wBAAwB,MAAsB;CAC5D,OAAO,GAAG,kCAAkC;AAC9C;AA8BA,MAAa,oCAAoD,IAAI,IAAI;CACvE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgB,iBAAiB,SAAiB,WAA8C;CAC9F,OAAO,GAAG,QAAQ,GAAG;AACvB;AAEA,MAAM,sBACJ;AAEF,SAAgB,kBAAkB,MAAwC;CACxE,MAAM,QAAQ,KAAK,MAAM,mBAAmB;CAC5C,IAAI,UAAU,MAAM,OAAO,KAAA;CAC3B,MAAM,EAAE,SAAS,cAAc,MAAM;CACrC,OAAO;EAAE;EAAS;CAAU;AAC9B"}
@@ -6,6 +6,7 @@ const require_project_model_util = require("../model/project_model_util.cjs");
6
6
  const require_template_serializer = require("../model/template_serializer.cjs");
7
7
  const require_block_pack = require("./block-pack/block_pack.cjs");
8
8
  const require_context_export = require("./context_export.cjs");
9
+ const require_args_derivation = require("../model/args_derivation.cjs");
9
10
  const require_index = require("../debug/index.cjs");
10
11
  let _platforma_sdk_model = require("@platforma-sdk/model");
11
12
  let _milaboratories_pl_model_middle_layer = require("@milaboratories/pl-model-middle-layer");
@@ -117,6 +118,18 @@ var BlockInfo = class {
117
118
  get currentPrerunArgs() {
118
119
  return this.currentPrerunArgsC();
119
120
  }
121
+ argsErrorsC = cached(() => `${this.fields.inputsValid?.modCount}:${this.fields.currentArgs?.modCount}`, () => require_args_derivation.argsErrorsOfBlock({
122
+ modelAPIVersion: this.config.modelAPIVersion,
123
+ inputsValid: this.fields.inputsValid,
124
+ currentArgs: this.currentArgs
125
+ }));
126
+ /**
127
+ * The errors the block's `argsIssues()` found in its current args. A block whose model API
128
+ * version has no args issues, or that has no current args, has none.
129
+ */
130
+ get argsErrors() {
131
+ return this.argsErrorsC();
132
+ }
120
133
  get stagingRendered() {
121
134
  return this.fields.stagingCtx !== void 0;
122
135
  }
@@ -365,6 +378,14 @@ var ProjectMutator = class ProjectMutator {
365
378
  status: "Ready"
366
379
  };
367
380
  }
381
+ /** Baggage of the root action context of a block render. */
382
+ blockActionContextBaggage(blockId, info) {
383
+ return {
384
+ name: this.getBlock(blockId).label,
385
+ blockPack: JSON.stringify(info.source),
386
+ blockId
387
+ };
388
+ }
368
389
  getBlock(blockId) {
369
390
  for (const block of require_project_model_util.allBlocks(this.struct)) if (block.id === blockId) return block;
370
391
  throw new Error("block not found");
@@ -400,6 +421,26 @@ var ProjectMutator = class ProjectMutator {
400
421
  }
401
422
  return deleted;
402
423
  }
424
+ /**
425
+ * Brings the block's `inputsValid` field in line with what its args derivation found: the run
426
+ * errors of its args, none when it may run with them, and no field when it has no args.
427
+ */
428
+ setArgsErrors(blockId, derivedArgs) {
429
+ this.applyArgsErrorsChange(blockId, require_args_derivation.argsErrorsFieldChange(this.getBlockInfo(blockId).fields.inputsValid, derivedArgs));
430
+ }
431
+ applyArgsErrorsChange(blockId, change) {
432
+ switch (change.type) {
433
+ case "keep": return;
434
+ case "delete":
435
+ this.deleteBlockFields(blockId, "inputsValid");
436
+ return;
437
+ case "write": {
438
+ const ref = this.tx.createValue(_milaboratories_pl_client.Pl.JsonObject, change.data);
439
+ this.setBlockField(blockId, "inputsValid", ref, "Ready", change.data);
440
+ return;
441
+ }
442
+ }
443
+ }
403
444
  updateLastModified() {
404
445
  this.lastModified = Date.now();
405
446
  this.lastModifiedChanged = true;
@@ -418,6 +459,7 @@ var ProjectMutator = class ProjectMutator {
418
459
  this.setBlockFieldObj(blockId, "stagingCtxPrevious", fields.stagingCtx);
419
460
  this.setBlockFieldObj(blockId, "stagingUiCtxPrevious", fields.stagingUiCtx);
420
461
  }
462
+ this.deleteBlockFields(blockId, "stagingActionContext");
421
463
  if (this.deleteBlockFields(blockId, "stagingOutput", "stagingCtx", "stagingUiCtx")) this.resetStagingRefreshTimestamp();
422
464
  }
423
465
  resetProduction(blockId) {
@@ -430,7 +472,7 @@ var ProjectMutator = class ProjectMutator {
430
472
  this.setBlockFieldObj(blockId, "prodCtxPrevious", fields.prodCtx);
431
473
  this.setBlockFieldObj(blockId, "prodUiCtxPrevious", fields.prodUiCtx);
432
474
  }
433
- this.deleteBlockFields(blockId, "prodOutput", "prodCtx", "prodUiCtx", "prodArgs");
475
+ this.deleteBlockFields(blockId, "prodOutput", "prodCtx", "prodUiCtx", "prodArgs", "prodActionContext");
434
476
  }
435
477
  /** Running blocks are reset, settled ones (Ready or finished Error) moved to limbo. Returns if
436
478
  * either of the actions were actually performed.
@@ -443,7 +485,10 @@ var ProjectMutator = class ProjectMutator {
443
485
  this.renderingStateChanged = true;
444
486
  this.deleteBlockFields(blockId, "prodOutputPrevious", "prodCtxPrevious", "prodUiCtxPrevious");
445
487
  return true;
446
- } else return this.deleteBlockFields(blockId, "prodOutput", "prodCtx", "prodUiCtx", "prodArgs", "prodOutputPrevious", "prodCtxPrevious", "prodUiCtxPrevious");
488
+ } else {
489
+ this.deleteBlockFields(blockId, "prodActionContext");
490
+ return this.deleteBlockFields(blockId, "prodOutput", "prodCtx", "prodUiCtx", "prodArgs", "prodOutputPrevious", "prodCtxPrevious", "prodUiCtxPrevious");
491
+ }
447
492
  }
448
493
  /**
449
494
  * Gets current block state and merges with partial updates.
@@ -489,9 +534,11 @@ var ProjectMutator = class ProjectMutator {
489
534
  const prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, initialStorageJson);
490
535
  if (prerunArgs !== void 0) this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
491
536
  else this.deleteBlockFields(blockId, "currentPrerunArgs");
492
- const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, initialStorageJson);
493
- if (!deriveArgsResult.error && deriveArgsResult.value !== void 0) this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(deriveArgsResult.value));
537
+ const derivedArgs = this.projectHelper.deriveArgsFromStorage(blockConfig, initialStorageJson);
538
+ const args = require_args_derivation.derivedArgsValue(derivedArgs);
539
+ if (args !== void 0) this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(args));
494
540
  else this.deleteBlockFields(blockId, "currentArgs");
541
+ this.setArgsErrors(blockId, derivedArgs);
495
542
  }
496
543
  /** Optimally sets inputs for multiple blocks in one go */
497
544
  setStates(requests) {
@@ -510,8 +557,9 @@ var ProjectMutator = class ProjectMutator {
510
557
  const updatedStorageJson = this.projectHelper.applyStorageUpdateInVM(blockConfig, currentStorageJson, req.payload);
511
558
  this.setBlockFieldObj(req.blockId, "blockStorage", this.createGzJsonFieldValueFromContent(updatedStorageJson));
512
559
  prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, updatedStorageJson);
513
- const derivedArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, updatedStorageJson);
514
- args = derivedArgsResult.error ? void 0 : derivedArgsResult.value;
560
+ const derivedArgs = this.projectHelper.deriveArgsFromStorage(blockConfig, updatedStorageJson);
561
+ args = require_args_derivation.derivedArgsValue(derivedArgs);
562
+ this.setArgsErrors(req.blockId, derivedArgs);
515
563
  } else {
516
564
  this.setBlockFieldObj(req.blockId, "blockStorage", this.createGzJsonFieldValue(req.state));
517
565
  if (req.state !== null && typeof req.state === "object" && "args" in req.state) args = req.state.args;
@@ -617,15 +665,21 @@ var ProjectMutator = class ProjectMutator {
617
665
  blockId: this.tx.createValue(_milaboratories_pl_client.Pl.JsonString, JSON.stringify(blockId)),
618
666
  isProduction: this.tx.createValue(_milaboratories_pl_client.Pl.JsonBool, JSON.stringify(false)),
619
667
  context: ctx
620
- });
668
+ }, this.blockActionContextBaggage(blockId, info));
621
669
  this.setBlockField(blockId, "stagingCtx", _milaboratories_pl_client.Pl.wrapInEphHolder(this.tx, ctx), "NotReady");
622
670
  this.setBlockField(blockId, "stagingUiCtx", this.exportCtx(results.context), "NotReady");
623
671
  this.setBlockField(blockId, "stagingOutput", results.result, "NotReady");
672
+ if (results.actionContext !== void 0) this.setBlockField(blockId, "stagingActionContext", results.actionContext, "NotReady");
624
673
  }
625
674
  renderProductionFor(blockId) {
626
675
  this.resetProduction(blockId);
627
676
  const info = this.getBlockInfo(blockId);
628
677
  if (info.fields.currentArgs === void 0) throw new Error(`Can't render production for block ${blockId}: currentArgs not set`);
678
+ const argsErrors = info.argsErrors;
679
+ if (argsErrors.length > 0) {
680
+ const messages = argsErrors.map(({ message }) => message).join("; ");
681
+ throw new Error(`Can't render production for block ${blockId}: ${messages}`);
682
+ }
629
683
  const ctx = this.createProdCtx(this.getPendingProductionGraph().nodes.get(blockId).upstream);
630
684
  if (this.getBlock(blockId).renderingMode === "Light") throw new Error("Can't render production for light block.");
631
685
  const tpl = info.getTemplate(this.tx);
@@ -634,10 +688,11 @@ var ProjectMutator = class ProjectMutator {
634
688
  blockId: this.tx.createValue(_milaboratories_pl_client.Pl.JsonString, JSON.stringify(blockId)),
635
689
  isProduction: this.tx.createValue(_milaboratories_pl_client.Pl.JsonBool, JSON.stringify(true)),
636
690
  context: ctx
637
- });
691
+ }, this.blockActionContextBaggage(blockId, info));
638
692
  this.setBlockField(blockId, "prodCtx", _milaboratories_pl_client.Pl.wrapInEphHolder(this.tx, results.context), "NotReady");
639
693
  this.setBlockField(blockId, "prodUiCtx", this.exportCtx(results.context), "NotReady");
640
694
  this.setBlockField(blockId, "prodOutput", results.result, "NotReady");
695
+ if (results.actionContext !== void 0) this.setBlockField(blockId, "prodActionContext", results.actionContext, "NotReady");
641
696
  this.setBlockFieldObj(blockId, "prodArgs", info.fields.currentArgs);
642
697
  if (this.blocksInLimbo.delete(blockId)) this.renderingStateChanged = true;
643
698
  }
@@ -654,8 +709,9 @@ var ProjectMutator = class ProjectMutator {
654
709
  if (spec.storageMode === "fromModel") {
655
710
  storageToWrite = spec.initialStorage ?? this.projectHelper.getInitialStorageInVM(blockConfig);
656
711
  prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, storageToWrite);
657
- const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, storageToWrite);
658
- args = deriveArgsResult.error ? void 0 : deriveArgsResult.value;
712
+ const derivedArgs = this.projectHelper.deriveArgsFromStorage(blockConfig, storageToWrite);
713
+ args = require_args_derivation.derivedArgsValue(derivedArgs);
714
+ this.setArgsErrors(blockId, derivedArgs);
659
715
  } else if (spec.storageMode === "legacy") {
660
716
  args = JSON.parse(spec.legacyState).args;
661
717
  if (args === void 0) throw new Error("args is undefined in legacyState");
@@ -810,9 +866,11 @@ var ProjectMutator = class ProjectMutator {
810
866
  const prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(newConfig, storageJson);
811
867
  if (prerunArgs !== void 0) this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
812
868
  else this.deleteBlockFields(blockId, "currentPrerunArgs");
813
- const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(newConfig, storageJson);
814
- if (!deriveArgsResult.error && deriveArgsResult.value !== void 0) this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(deriveArgsResult.value));
869
+ const derivedArgs = this.projectHelper.deriveArgsFromStorage(newConfig, storageJson);
870
+ const args = require_args_derivation.derivedArgsValue(derivedArgs);
871
+ if (args !== void 0) this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(args));
815
872
  else this.deleteBlockFields(blockId, "currentArgs");
873
+ this.setArgsErrors(blockId, derivedArgs);
816
874
  };
817
875
  if (newClearState !== void 0) {
818
876
  if (newConfig.modelAPIVersion === _platforma_sdk_model.BLOCK_STORAGE_FACADE_VERSION) {
@@ -821,6 +879,7 @@ var ProjectMutator = class ProjectMutator {
821
879
  this.updateLastModified();
822
880
  } else {
823
881
  persistBlockPack();
882
+ this.deleteBlockFields(blockId, "inputsValid");
824
883
  this.setStates([{
825
884
  modelAPIVersion: 1,
826
885
  blockId,
@@ -836,6 +895,7 @@ var ProjectMutator = class ProjectMutator {
836
895
  applyStorageAndDeriveArgs(migrationResult.newStorageJson);
837
896
  } else {
838
897
  persistBlockPack();
898
+ this.deleteBlockFields(blockId, "inputsValid");
839
899
  if (info.fields.currentArgs !== void 0) this.setBlockFieldObj(blockId, "currentPrerunArgs", info.fields.currentArgs);
840
900
  }
841
901
  this.blocksWithChangedInputs.add(blockId);
@@ -902,6 +962,7 @@ var ProjectMutator = class ProjectMutator {
902
962
  const blockId = queue.shift();
903
963
  const fields = this.getBlockInfo(blockId).fields;
904
964
  if (fields.prodOutput?.status === "Ready" && fields.prodCtx?.status === "Ready") continue;
965
+ this.deleteBlockFields(blockId, "prodActionContext");
905
966
  if (this.deleteBlockFields(blockId, "prodOutput", "prodCtx", "prodUiCtx", "prodArgs")) {
906
967
  stopped.push(blockId);
907
968
  for (const downstream of activeProdGraph.traverseIdsExcludingRoots("downstream", blockId)) {