@milaboratories/pl-middle-layer 1.39.4 → 1.39.6

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.
@@ -36,6 +36,19 @@ export declare class Project {
36
36
  * @return returns newly created block id
37
37
  * */
38
38
  addBlock(blockLabel: string, blockPackSpec: BlockPackSpecAny, before?: string, author?: AuthorMarker | undefined, blockId?: string): Promise<string>;
39
+ /**
40
+ * Duplicates an existing block by copying all its fields and state.
41
+ * This method works at the mutator level for efficient block copying.
42
+ *
43
+ * @param originalBlockId id of the block to duplicate
44
+ * @param before id of the block to insert new block before
45
+ * @param author author marker for the duplication operation
46
+ * @param newBlockId internal id to be assigned for the duplicated block,
47
+ * if omitted, a randomly generated UUID will be assigned
48
+ *
49
+ * @return returns newly created block id
50
+ * */
51
+ duplicateBlock(originalBlockId: string, before?: string, author?: AuthorMarker | undefined, newBlockId?: string): Promise<string>;
39
52
  /**
40
53
  * Update block to new block pack, optionally resetting args and ui state to
41
54
  * initial values
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/middle_layer/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/middle_layer/project.ts"],"names":[],"mappings":"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"}
@@ -60,6 +60,7 @@ export interface ProjectField {
60
60
  blockId: string;
61
61
  fieldName: 'blockPack' | 'blockSettings' | 'uiState' | 'prodArgs' | 'currentArgs' | 'prodCtx' | 'prodUiCtx' | 'prodOutput' | 'prodCtxPrevious' | 'prodUiCtxPrevious' | 'prodOutputPrevious' | 'stagingCtx' | 'stagingUiCtx' | 'stagingOutput' | 'stagingCtxPrevious' | 'stagingUiCtxPrevious' | 'stagingOutputPrevious';
62
62
  }
63
+ export declare const FieldsToDuplicate: Set<ProjectField['fieldName']>;
63
64
  export declare function projectFieldName(blockId: string, fieldName: ProjectField['fieldName']): string;
64
65
  export declare function parseProjectField(name: string): ProjectField | undefined;
65
66
  //# sourceMappingURL=project_model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project_model.d.ts","sourceRoot":"","sources":["../../src/model/project_model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EACV,gBAAgB,IAAI,yBAAyB,EAC7C,WAAW,EACZ,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,WAAW,gBAAiB,SAAQ,yBAAyB;IACjE,2BAA2B;IAC3B,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,2DAA2D;AAC3D,MAAM,WAAW,KAAK;IACpB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB;;;SAGK;IACL,KAAK,EAAE,MAAM,CAAC;IAEd,sCAAsC;IACtC,aAAa,EAAE,kBAAkB,CAAC;CACnC;AAED,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IAEd,aAAa;IACb,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;CAC/B;AAED,eAAO,MAAM,qBAAqB,EAAE,gBAEnC,CAAC;AAEF,sCAAsC;AACtC,MAAM,WAAW,qBAAqB;IACpC,gDAAgD;IAChD,uBAAuB,EAAE,MAAM,CAAC;IAEhC;yEACqE;IACrE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,4BAA4B,EAAE,qBAG1C,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,WAE9B,CAAC;AAMF,eAAO,MAAM,mBAAmB,EAAE,YAAoD,CAAC;AAEvF,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAChD,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,eAAO,MAAM,uBAAuB,mBAAmB,CAAC;AACxD,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAClE,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAC5C,eAAO,MAAM,mBAAmB,qBAAqB,CAAC;AACtD,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAE5D,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAC3D,eAAO,MAAM,yBAAyB,QAAsC,CAAC;AAE7E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,eAAO,MAAM,yBAAyB,2BAA2B,CAAC;AAElE,eAAO,MAAM,+BAA+B,uBAAuB,CAAC;AAEpE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EACL,WAAW,GACX,eAAe,GACf,SAAS,GACT,UAAU,GACV,aAAa,GACb,SAAS,GACT,WAAW,GACX,YAAY,GACZ,iBAAiB,GACjB,mBAAmB,GACnB,oBAAoB,GACpB,YAAY,GACZ,cAAc,GACd,eAAe,GACf,oBAAoB,GACpB,sBAAsB,GACtB,uBAAuB,CAAC;CAC7B;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,MAAM,CAE9F;AAKD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAKxE"}
1
+ {"version":3,"file":"project_model.d.ts","sourceRoot":"","sources":["../../src/model/project_model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EACV,gBAAgB,IAAI,yBAAyB,EAC7C,WAAW,EACZ,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,WAAW,gBAAiB,SAAQ,yBAAyB;IACjE,2BAA2B;IAC3B,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,2DAA2D;AAC3D,MAAM,WAAW,KAAK;IACpB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB;;;SAGK;IACL,KAAK,EAAE,MAAM,CAAC;IAEd,sCAAsC;IACtC,aAAa,EAAE,kBAAkB,CAAC;CACnC;AAED,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IAEd,aAAa;IACb,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;CAC/B;AAED,eAAO,MAAM,qBAAqB,EAAE,gBAEnC,CAAC;AAEF,sCAAsC;AACtC,MAAM,WAAW,qBAAqB;IACpC,gDAAgD;IAChD,uBAAuB,EAAE,MAAM,CAAC;IAEhC;yEACqE;IACrE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,4BAA4B,EAAE,qBAG1C,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,WAE9B,CAAC;AAMF,eAAO,MAAM,mBAAmB,EAAE,YAAoD,CAAC;AAEvF,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAChD,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,eAAO,MAAM,uBAAuB,mBAAmB,CAAC;AACxD,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAClE,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAC5C,eAAO,MAAM,mBAAmB,qBAAqB,CAAC;AACtD,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAE5D,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAC3D,eAAO,MAAM,yBAAyB,QAAsC,CAAC;AAE7E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,eAAO,MAAM,yBAAyB,2BAA2B,CAAC;AAElE,eAAO,MAAM,+BAA+B,uBAAuB,CAAC;AAEpE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EACL,WAAW,GACX,eAAe,GACf,SAAS,GACT,UAAU,GACV,aAAa,GACb,SAAS,GACT,WAAW,GACX,YAAY,GACZ,iBAAiB,GACjB,mBAAmB,GACnB,oBAAoB,GACpB,YAAY,GACZ,cAAc,GACd,eAAe,GACf,oBAAoB,GACpB,sBAAsB,GACtB,uBAAuB,CAAC;CAC7B;AAED,eAAO,MAAM,iBAAiB,EAAE,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,CAS3D,CAAC;AAEH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,MAAM,CAE9F;AAKD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAKxE"}
@@ -88,7 +88,8 @@ export declare class ProjectMutator {
88
88
  private resetStaging;
89
89
  private resetProduction;
90
90
  /** Running blocks are reset, already computed moved to limbo. Returns if
91
- * either of the actions were actually performed. */
91
+ * either of the actions were actually performed.
92
+ * This method ensures the block is left in a consistent state that passes check() constraints. */
92
93
  private resetOrLimboProduction;
93
94
  /** Optimally sets inputs for multiple blocks in one go */
94
95
  setStates(requests: SetStatesRequest[]): void;
@@ -98,9 +99,21 @@ export declare class ProjectMutator {
98
99
  private exportCtx;
99
100
  private renderStagingFor;
100
101
  private renderProductionFor;
102
+ private initializeNewBlock;
103
+ private getFieldNamesToDuplicate;
104
+ private initializeBlockDuplicate;
101
105
  /** Very generic method, better check for more specialized case-specific methods first. */
102
- updateStructure(newStructure: ProjectStructure, newBlockSpecProvider?: (blockId: string) => NewBlockSpec): void;
106
+ updateStructure(newStructure: ProjectStructure, newBlockInitializer?: (blockId: string) => void): void;
103
107
  addBlock(block: Block, spec: NewBlockSpec, before?: string): void;
108
+ /**
109
+ * Duplicates an existing block by copying all its fields and structure.
110
+ * This method creates a deep copy of the block at the mutator level.
111
+ *
112
+ * @param originalBlockId id of the block to duplicate
113
+ * @param newBlockId id for the new duplicated block
114
+ * @param after id of the block to insert new block after
115
+ */
116
+ duplicateBlock(originalBlockId: string, newBlockId: string, after?: string): void;
104
117
  deleteBlock(blockId: string): void;
105
118
  migrateBlockPack(blockId: string, spec: BlockPackSpecPrepared, newArgsAndUiState?: ArgsAndUiState): void;
106
119
  renderProduction(blockIds: string[], addUpstreams?: boolean): Set<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/mutator/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/mutator/project.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/pool/driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/pool/driver.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ref_count_pool.d.ts","sourceRoot":"","sources":["../../src/pool/ref_count_pool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;AAEjC,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,sBAAsB;IACtB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAErB,+CAA+C;IAC/C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,8BAAsB,oBAAoB,CAAC,CAAC,EAAE,CAAC;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC;IAClD,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM;IAExD,OAAO,CAAC,KAAK;IAkBN,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAyBnC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC;IAKxB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;CAG/C"}
1
+ {"version":3,"file":"ref_count_pool.d.ts","sourceRoot":"","sources":["../../src/pool/ref_count_pool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;AAEjC,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,sBAAsB;IACtB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAErB,+CAA+C;IAC/C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,8BAAsB,oBAAoB,CAAC,CAAC,EAAE,CAAC;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC;IAClD,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM;IAExD,OAAO,CAAC,KAAK;IAkBN,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAyBnC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC;IAMxB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;CAG/C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/pl-middle-layer",
3
- "version": "1.39.4",
3
+ "version": "1.39.6",
4
4
  "description": "Pl Middle Layer",
5
5
  "engines": {
6
6
  "node": ">=20.16.0"
@@ -22,7 +22,7 @@
22
22
  "keywords": [],
23
23
  "license": "UNLICENSED",
24
24
  "dependencies": {
25
- "@milaboratories/pframes-rs-node": "1.0.51",
25
+ "@milaboratories/pframes-rs-node": "1.0.52",
26
26
  "canonicalize": "~2.1.0",
27
27
  "denque": "^2.1.0",
28
28
  "lru-cache": "^11.1.0",
@@ -33,21 +33,21 @@
33
33
  "zod": "~3.23.8",
34
34
  "remeda": "^2.22.6",
35
35
  "@milaboratories/pl-http": "^1.1.4",
36
- "@milaboratories/computable": "^2.6.0",
37
- "@milaboratories/pl-drivers": "^1.6.2",
38
36
  "@milaboratories/resolve-helper": "^1.1.0",
39
- "@milaboratories/pl-model-common": "~1.16.2",
40
- "@platforma-sdk/block-tools": "^2.5.66",
37
+ "@milaboratories/computable": "^2.6.0",
38
+ "@platforma-sdk/block-tools": "^2.5.67",
41
39
  "@milaboratories/pl-client": "^2.11.2",
42
- "@milaboratories/pl-model-middle-layer": "~1.7.48",
40
+ "@milaboratories/pl-drivers": "^1.6.3",
41
+ "@milaboratories/pl-model-middle-layer": "~1.7.49",
42
+ "@milaboratories/pl-model-common": "~1.16.3",
43
43
  "@milaboratories/pl-model-backend": "~1.1.2",
44
44
  "@milaboratories/pl-tree": "~1.7.0",
45
- "@platforma-sdk/model": "~1.39.7",
45
+ "@platforma-sdk/model": "~1.39.8",
46
46
  "@milaboratories/ts-helpers": "^1.4.1",
47
47
  "@platforma-sdk/workflow-tengo": "4.9.3",
48
- "@milaboratories/pl-errors": "^1.1.9",
49
48
  "@milaboratories/pl-config": "^1.6.1",
50
- "@milaboratories/pl-deployments": "^2.4.3"
49
+ "@milaboratories/pl-deployments": "^2.4.3",
50
+ "@milaboratories/pl-errors": "^1.1.9"
51
51
  },
52
52
  "devDependencies": {
53
53
  "semver": "^7.7.2",
@@ -184,6 +184,32 @@ export class Project {
184
184
  return blockId;
185
185
  }
186
186
 
187
+ /**
188
+ * Duplicates an existing block by copying all its fields and state.
189
+ * This method works at the mutator level for efficient block copying.
190
+ *
191
+ * @param originalBlockId id of the block to duplicate
192
+ * @param before id of the block to insert new block before
193
+ * @param author author marker for the duplication operation
194
+ * @param newBlockId internal id to be assigned for the duplicated block,
195
+ * if omitted, a randomly generated UUID will be assigned
196
+ *
197
+ * @return returns newly created block id
198
+ * */
199
+ public async duplicateBlock(
200
+ originalBlockId: string,
201
+ before?: string,
202
+ author: AuthorMarker | undefined = undefined,
203
+ newBlockId: string = randomUUID(),
204
+ ): Promise<string> {
205
+ await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>
206
+ mut.duplicateBlock(originalBlockId, newBlockId, before),
207
+ );
208
+ await this.projectTree.refreshState();
209
+
210
+ return newBlockId;
211
+ }
212
+
187
213
  /**
188
214
  * Update block to new block pack, optionally resetting args and ui state to
189
215
  * initial values
@@ -118,6 +118,17 @@ export interface ProjectField {
118
118
  | 'stagingOutputPrevious';
119
119
  }
120
120
 
121
+ export const FieldsToDuplicate: Set<ProjectField['fieldName']> = new Set([
122
+ 'blockPack',
123
+ 'blockSettings',
124
+ 'uiState',
125
+ 'prodArgs',
126
+ 'currentArgs',
127
+ 'prodCtx',
128
+ 'prodUiCtx',
129
+ 'prodOutput',
130
+ ]);
131
+
121
132
  export function projectFieldName(blockId: string, fieldName: ProjectField['fieldName']): string {
122
133
  return `${blockId}-${fieldName}`;
123
134
  }
@@ -39,6 +39,7 @@ import {
39
39
  ProjectCreatedTimestamp,
40
40
  ProjectStructureAuthorKey,
41
41
  getServiceTemplateField,
42
+ FieldsToDuplicate,
42
43
  } from '../model/project_model';
43
44
  import { BlockPackTemplateField, createBlockPack } from './block-pack/block_pack';
44
45
  import type {
@@ -472,25 +473,37 @@ export class ProjectMutator {
472
473
  }
473
474
 
474
475
  /** Running blocks are reset, already computed moved to limbo. Returns if
475
- * either of the actions were actually performed. */
476
+ * either of the actions were actually performed.
477
+ * This method ensures the block is left in a consistent state that passes check() constraints. */
476
478
  private resetOrLimboProduction(blockId: string): boolean {
477
479
  const fields = this.getBlockInfo(blockId).fields;
480
+
481
+ // Check if we can safely move to limbo (both core production fields are ready)
478
482
  if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready') {
479
483
  if (this.blocksInLimbo.has(blockId))
480
484
  // we are already in limbo
481
485
  return false;
482
486
 
483
- // limbo
487
+ // limbo - keep the ready production results but clean up cache
484
488
  this.blocksInLimbo.add(blockId);
485
489
  this.renderingStateChanged = true;
486
490
 
487
- // doing some gc
491
+ // doing some gc - clean up previous cache fields
488
492
  this.deleteBlockFields(blockId, 'prodOutputPrevious', 'prodCtxPrevious', 'prodUiCtxPrevious');
489
493
 
490
494
  return true;
491
495
  } else {
492
- // reset
493
- return this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs');
496
+ // reset - clean up any partial/inconsistent production stat
497
+ return this.deleteBlockFields(
498
+ blockId,
499
+ 'prodOutput',
500
+ 'prodCtx',
501
+ 'prodUiCtx',
502
+ 'prodArgs',
503
+ 'prodOutputPrevious',
504
+ 'prodCtxPrevious',
505
+ 'prodUiCtxPrevious',
506
+ );
494
507
  }
495
508
  }
496
509
 
@@ -643,10 +656,92 @@ export class ProjectMutator {
643
656
  // Structure changes
644
657
  //
645
658
 
659
+ private initializeNewBlock(blockId: string, spec: NewBlockSpec): void {
660
+ const info = new BlockInfo(blockId, {}, extractConfig(spec.blockPack.config), spec.blockPack.source);
661
+ this.blockInfos.set(blockId, info);
662
+
663
+ // block pack
664
+ const bp = createBlockPack(this.tx, spec.blockPack);
665
+ this.setBlockField(blockId, 'blockPack', Pl.wrapInHolder(this.tx, bp), 'NotReady');
666
+
667
+ // settings
668
+ this.setBlockFieldObj(
669
+ blockId,
670
+ 'blockSettings',
671
+ this.createJsonFieldValue(InitialBlockSettings),
672
+ );
673
+
674
+ // args
675
+ this.setBlockFieldObj(blockId, 'currentArgs', this.createJsonFieldValueByContent(spec.args));
676
+
677
+ // uiState
678
+ this.setBlockFieldObj(blockId, 'uiState', this.createJsonFieldValueByContent(spec.uiState ?? '{}'));
679
+
680
+ // checking structure
681
+ info.check();
682
+ }
683
+
684
+ private getFieldNamesToDuplicate(blockId: string): Set<ProjectField['fieldName']> {
685
+ const fields = this.getBlockInfo(blockId).fields;
686
+
687
+ const diff = <T>(setA: Set<T>, setB: Set<T>): Set<T> => new Set([...setA].filter((x) => !setB.has(x)));
688
+
689
+ // Check if we can safely move to limbo (both core production fields are ready)
690
+ if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready') {
691
+ if (this.blocksInLimbo.has(blockId))
692
+ // we are already in limbo
693
+ return FieldsToDuplicate;
694
+
695
+ return diff(FieldsToDuplicate, new Set([
696
+ 'prodOutputPrevious',
697
+ 'prodCtxPrevious',
698
+ 'prodUiCtxPrevious',
699
+ ]));
700
+ } else {
701
+ return diff(FieldsToDuplicate, new Set([
702
+ 'prodOutput',
703
+ 'prodCtx',
704
+ 'prodUiCtx',
705
+ 'prodArgs',
706
+ 'prodOutputPrevious',
707
+ 'prodCtxPrevious',
708
+ 'prodUiCtxPrevious',
709
+ ]));
710
+ }
711
+ }
712
+
713
+ private initializeBlockDuplicate(blockId: string, originalBlockInfo: BlockInfo) {
714
+ const info = new BlockInfo(
715
+ blockId,
716
+ {},
717
+ originalBlockInfo.config,
718
+ originalBlockInfo.source,
719
+ );
720
+
721
+ this.blockInfos.set(blockId, info);
722
+
723
+ const fieldNamesToDuplicate = this.getFieldNamesToDuplicate(blockId);
724
+
725
+ // Copy all fields from original block to new block by sharing references
726
+ for (const [fieldName, fieldState] of Object.entries(originalBlockInfo.fields)) {
727
+ if (fieldNamesToDuplicate.has(fieldName as ProjectField['fieldName']) && fieldState && fieldState.ref) {
728
+ this.setBlockFieldObj(blockId, fieldName as keyof BlockFieldStates, {
729
+ ref: fieldState.ref,
730
+ status: fieldState.status,
731
+ value: fieldState.value,
732
+ });
733
+ }
734
+ }
735
+
736
+ this.resetOrLimboProduction(blockId);
737
+
738
+ info.check();
739
+ }
740
+
646
741
  /** Very generic method, better check for more specialized case-specific methods first. */
647
742
  public updateStructure(
648
743
  newStructure: ProjectStructure,
649
- newBlockSpecProvider: (blockId: string) => NewBlockSpec = NoNewBlocks,
744
+ newBlockInitializer: (blockId: string) => void = NoNewBlocks,
650
745
  ): void {
651
746
  const currentStagingGraph = this.getStagingGraph();
652
747
  const currentActualProductionGraph = this.getActualProductionGraph();
@@ -665,31 +760,7 @@ export class ProjectMutator {
665
760
 
666
761
  // creating new blocks
667
762
  for (const blockId of stagingDiff.onlyInB) {
668
- const spec = newBlockSpecProvider(blockId);
669
-
670
- // adding new block info
671
- const info = new BlockInfo(blockId, {}, extractConfig(spec.blockPack.config), spec.blockPack.source);
672
- this.blockInfos.set(blockId, info);
673
-
674
- // block pack
675
- const bp = createBlockPack(this.tx, spec.blockPack);
676
- this.setBlockField(blockId, 'blockPack', Pl.wrapInHolder(this.tx, bp), 'NotReady');
677
-
678
- // settings
679
- this.setBlockFieldObj(
680
- blockId,
681
- 'blockSettings',
682
- this.createJsonFieldValue(InitialBlockSettings),
683
- );
684
-
685
- // args
686
- this.setBlockFieldObj(blockId, 'currentArgs', this.createJsonFieldValueByContent(spec.args));
687
-
688
- // uiState
689
- this.setBlockFieldObj(blockId, 'uiState', this.createJsonFieldValueByContent(spec.uiState ?? '{}'));
690
-
691
- // checking structure
692
- info.check();
763
+ newBlockInitializer(blockId);
693
764
  }
694
765
 
695
766
  // resetting stagings affected by topology change
@@ -747,7 +818,50 @@ export class ProjectMutator {
747
818
  }
748
819
  this.updateStructure(newStruct, (blockId) => {
749
820
  if (blockId !== block.id) throw new Error('Unexpected');
750
- return spec;
821
+ this.initializeNewBlock(blockId, spec);
822
+ });
823
+ }
824
+
825
+ /**
826
+ * Duplicates an existing block by copying all its fields and structure.
827
+ * This method creates a deep copy of the block at the mutator level.
828
+ *
829
+ * @param originalBlockId id of the block to duplicate
830
+ * @param newBlockId id for the new duplicated block
831
+ * @param after id of the block to insert new block after
832
+ */
833
+ public duplicateBlock(originalBlockId: string, newBlockId: string, after?: string): void {
834
+ // Get the original block from structure
835
+ const originalBlock = this.getBlock(originalBlockId);
836
+ const originalBlockInfo = this.getBlockInfo(originalBlockId);
837
+
838
+ // Create new block in structure
839
+ const newBlock: Block = {
840
+ id: newBlockId,
841
+ label: originalBlock.label,
842
+ renderingMode: originalBlock.renderingMode,
843
+ };
844
+
845
+ // Add the new block to structure
846
+ const newStruct = this.structure; // copy current structure
847
+ if (after === undefined) {
848
+ // adding as a very last block
849
+ newStruct.groups[newStruct.groups.length - 1].blocks.push(newBlock);
850
+ } else {
851
+ let done = false;
852
+ for (const group of newStruct.groups) {
853
+ const idx = group.blocks.findIndex((b) => b.id === after);
854
+ if (idx < 0) continue;
855
+ group.blocks.splice(idx + 1, 0, newBlock);
856
+ done = true;
857
+ break;
858
+ }
859
+ if (!done) throw new Error(`Can't find element with id: ${after}`);
860
+ }
861
+
862
+ this.updateStructure(newStruct, (blockId) => {
863
+ if (blockId !== newBlockId) throw new Error('Unexpected');
864
+ this.initializeBlockDuplicate(blockId, originalBlockInfo);
751
865
  });
752
866
  }
753
867
 
@@ -39,6 +39,9 @@ import {
39
39
  mapDataInfo,
40
40
  isDataInfo,
41
41
  ensureError,
42
+ PFrameDriverError,
43
+ isAbortError,
44
+ isPFrameDriverError,
42
45
  } from '@platforma-sdk/model';
43
46
  import { LRUCache } from 'lru-cache';
44
47
  import type { PollResource } from './ref_count_pool';
@@ -209,8 +212,8 @@ class PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {
209
212
  }
210
213
  this.pFrame = pFrame;
211
214
  } catch (err: unknown) {
212
- throw new Error(
213
- `Rust PFrame creation failed, columns: ${JSON.stringify(distinctСolumns)}, error: ${err as Error}`,
215
+ throw new PFrameDriverError(
216
+ `PFrame creation failed, columns: ${JSON.stringify(distinctСolumns)}, error: ${ensureError(err)}`,
214
217
  );
215
218
  }
216
219
  }
@@ -220,7 +223,7 @@ class PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {
220
223
  if (computable !== undefined) return computable;
221
224
 
222
225
  const blobResource = this.blobIdToResource.get(blobId);
223
- if (blobResource === undefined) throw new Error(`Blob with id ${blobId} not found.`);
226
+ if (blobResource === undefined) throw new PFrameDriverError(`Blob with id ${blobId} not found.`);
224
227
 
225
228
  // precalculation of value tree will trigger the download proecess right away
226
229
  computable = this.blobDriver.getDownloadedBlob(blobResource).withPreCalculatedValueTree();
@@ -232,7 +235,16 @@ class PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {
232
235
 
233
236
  public readonly preloadBlob = async (blobIds: string[]): Promise<void> => {
234
237
  const computables = blobIds.map((blobId) => this.getOrCreateComputableForBlob(blobId));
235
- for (const computable of computables) await computable.awaitStableFullValue(this.disposeSignal);
238
+ for (const computable of computables) {
239
+ try {
240
+ await computable.awaitStableFullValue(this.disposeSignal);
241
+ } catch (err: unknown) {
242
+ if (isAbortError(err)) {
243
+ break; // silence abort errors
244
+ }
245
+ throw err;
246
+ }
247
+ }
236
248
  };
237
249
 
238
250
  public readonly resolveBlobContent = async (blobId: string): Promise<Uint8Array> => {
@@ -400,6 +412,16 @@ export class PFrameDriver implements InternalPFrameDriver {
400
412
  super();
401
413
  }
402
414
 
415
+ public acquire(params: InternalPFrameData): PollResource<PFrameHolder> {
416
+ return super.acquire(params);
417
+ }
418
+
419
+ public getByKey(key: PFrameHandle): PFrameHolder {
420
+ const resource = super.tryGetByKey(key);
421
+ if (!resource) throw new PFrameDriverError(`PFrame not found, handle = ${key}`);
422
+ return resource;
423
+ }
424
+
403
425
  protected createNewResource(params: InternalPFrameData): PFrameHolder {
404
426
  if (getDebugFlags().logPFrameRequests)
405
427
  logger.info(
@@ -409,7 +431,12 @@ export class PFrameDriver implements InternalPFrameDriver {
409
431
  }
410
432
 
411
433
  protected calculateParamsKey(params: InternalPFrameData): string {
412
- return stableKeyFromPFrameData(params);
434
+ try {
435
+ return stableKeyFromPFrameData(params);
436
+ } catch (err: unknown) {
437
+ if (isPFrameDriverError(err)) throw err;
438
+ throw new PFrameDriverError(`PFrame handle calculation failed, request: ${JSON.stringify(params, bigintReplacer)}, error: ${ensureError(err)}`);
439
+ }
413
440
  }
414
441
  })(this.blobDriver, this.logger, this.spillPath);
415
442
 
@@ -423,6 +450,12 @@ export class PFrameDriver implements InternalPFrameDriver {
423
450
  super();
424
451
  }
425
452
 
453
+ public getByKey(key: PTableHandle): PTableHolder {
454
+ const resource = super.tryGetByKey(key);
455
+ if (!resource) throw new PFrameDriverError(`PTable not found, handle = ${key}`);
456
+ return resource;
457
+ }
458
+
426
459
  protected createNewResource(params: FullPTableDef): PTableHolder {
427
460
  if (getDebugFlags().logPFrameRequests) {
428
461
  logger.info(
@@ -470,7 +503,11 @@ export class PFrameDriver implements InternalPFrameDriver {
470
503
  }
471
504
 
472
505
  protected calculateParamsKey(params: FullPTableDef): string {
473
- return stableKeyFromFullPTableDef(params);
506
+ try {
507
+ return stableKeyFromFullPTableDef(params);
508
+ } catch (err: unknown) {
509
+ throw new PFrameDriverError(`PTable handle calculation failed, request: ${JSON.stringify(params)}, error: ${ensureError(err)}`);
510
+ }
474
511
  }
475
512
  })(this.pFrames);
476
513
  }
@@ -769,7 +806,7 @@ function stableKeyFromPFrameData(data: PColumn<DataInfo<ResourceInfo>>[]): strin
769
806
  };
770
807
  break;
771
808
  default:
772
- throw Error(`unsupported resource type: ${JSON.stringify(type satisfies never)}`);
809
+ throw new PFrameDriverError(`unsupported resource type: ${JSON.stringify(type satisfies never)}`);
773
810
  }
774
811
  result.payload.sort((lhs, rhs) => lhs.key.localeCompare(rhs.key));
775
812
  return result;
@@ -66,8 +66,9 @@ export abstract class RefCountResourcePool<P, R> {
66
66
  }
67
67
 
68
68
  public getByKey(key: string): R {
69
- if (!this.resources.has(key)) throw new Error(`resource not found, key = ${key}`);
70
- return this.resources.get(key)!.resource;
69
+ const envelop = this.resources.get(key);
70
+ if (envelop === undefined) throw new Error(`resource not found, key = ${key}`);
71
+ return envelop.resource;
71
72
  }
72
73
 
73
74
  public tryGetByKey(key: string): R | undefined {