@uipath/maestro-builder-sdk 6.16.11 → 6.16.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.
package/dist/api-index.md CHANGED
@@ -70,8 +70,8 @@ could hand you spans for a version you do not have.
70
70
  | `CaseValue` | type | `dist/flow-sdk.d.ts:327-328` | Supporting types | A value a `.switch` case compares the discriminant against. |
71
71
  | `ChildFlow` | type | `dist/flow-sdk.d.ts:43-46` | Supporting types | Anything `subflow()` accepts as the child: a builder, or an already-built flow. |
72
72
  | `ClientSideToolRef` | interface | `dist/core/actions.d.ts:1717-1732` | Supporting types | A CLIENT-side tool: the agent asks the CALLING application to run it and hand the answer back… |
73
- | `connector` | function | `dist/core/actions.d.ts:3327-3350` | Actions | Declare an Integration Service connector action — the typed form, where a generated descriptor supplies the nodeType and… |
74
- | `connector` | function | `dist/core/actions.d.ts:3351-3367` | Actions | Stringly form, for a connector with no prepared module — `connector('uipath-salesforce-slack',… |
73
+ | `connector` | function | `dist/core/actions.d.ts:3341-3364` | Actions | Declare an Integration Service connector action — the typed form, where a generated descriptor supplies the nodeType and… |
74
+ | `connector` | function | `dist/core/actions.d.ts:3365-3381` | Actions | Stringly form, for a connector with no prepared module — `connector('uipath-salesforce-slack',… |
75
75
  | `ConnectorDescriptor` | type | `dist/core/connectors.d.ts:89-97` | Generated descriptors | A generated, typed connector descriptor: ConnectorMeta branded with phantom input/output types. |
76
76
  | `ConnectorLookupValue` | type | `dist/core/connectors.d.ts:50-59` | Generated descriptors | ConnectorValue for a field that also accepts an unresolved lookup. |
77
77
  | `ConnectorMeta` | interface | `dist/core/connectors.d.ts:60-88` | Generated descriptors | Runtime metadata a generated descriptor carries. |
@@ -90,17 +90,17 @@ could hand you spans for a version you do not have.
90
90
  | `createOutgoingCall` | function | `dist/core/actions.d.ts:2943-2959` | Actions | Place an outgoing phone call (`uipath.conversational.voice.create-outgoing-call`) and get back the `callContext` every… |
91
91
  | `CreateOutgoingCallInputs` | interface | `dist/core/actions.d.ts:732-740` | Option shapes | 2 field(s) |
92
92
  | `CustomGuardrail` | interface | `dist/core/actions.d.ts:1338-1350` | Supporting types | A rule-based guardrail you author in place. |
93
- | `dataFabricCreate` | function | `dist/core/actions.d.ts:3229-3246` | Actions | Create an entity record in Data Fabric (`core.datafabric.create`). |
93
+ | `dataFabricCreate` | function | `dist/core/actions.d.ts:3237-3260` | Actions | Create an entity record in Data Fabric (`core.datafabric.create`). |
94
94
  | `DataFabricCreateInputs` | interface | `dist/core/actions.d.ts:2223-2253` | Option shapes | 4 field(s) |
95
- | `dataFabricDelete` | function | `dist/core/actions.d.ts:3263-3280` | Actions | Delete an entity record from Data Fabric (`core.datafabric.delete`). |
95
+ | `dataFabricDelete` | function | `dist/core/actions.d.ts:3277-3294` | Actions | Delete an entity record from Data Fabric (`core.datafabric.delete`). |
96
96
  | `DataFabricDeleteInputs` | interface | `dist/core/actions.d.ts:2286-2312` | Option shapes | 4 field(s) |
97
97
  | `DataFabricFilter` | interface | `dist/core/actions.d.ts:2114-2145` | Supporting types | One filter row on a Data Fabric query — rows AND together unless `or` is set. |
98
98
  | `DataFabricOperator` | type | `dist/core/actions.d.ts:2103-2113` | Supporting types | The comparison operators the Data Fabric query serializer can emit, spelled exactly as the file carries them. |
99
- | `dataFabricRead` | function | `dist/core/actions.d.ts:3190-3228` | Actions | Query entity records from Data Fabric (`core.datafabric.read`). |
99
+ | `dataFabricRead` | function | `dist/core/actions.d.ts:3190-3236` | Actions | Query entity records from Data Fabric (`core.datafabric.read`). |
100
100
  | `DataFabricReadInputs` | interface | `dist/core/actions.d.ts:2170-2222` | Option shapes | 9 field(s) |
101
101
  | `DataFabricRecordRef` | type | `dist/core/actions.d.ts:2153-2169` | Supporting types | Which record a Data Fabric write targets — exactly ONE of the two forms. |
102
102
  | `DataFabricSort` | interface | `dist/core/actions.d.ts:2146-2152` | Supporting types | How a multi-record query orders its rows before the limit is applied. |
103
- | `dataFabricUpdate` | function | `dist/core/actions.d.ts:3247-3262` | Actions | Update an entity record in Data Fabric (`core.datafabric.update`). |
103
+ | `dataFabricUpdate` | function | `dist/core/actions.d.ts:3261-3276` | Actions | Update an entity record in Data Fabric (`core.datafabric.update`). |
104
104
  | `DataFabricUpdateInputs` | interface | `dist/core/actions.d.ts:2254-2285` | Option shapes | 5 field(s) |
105
105
  | `DEFAULT_TRIGGER_ID` | const | `dist/core/expr.d.ts:42-43` | Expressions and types | The manual trigger node's default id. |
106
106
  | `DefinitionReference` | type | `dist/core/node-classes.d.ts:30-63` | Supporting types | An exact reference to the node definition a contribution compiles against. |
@@ -121,8 +121,8 @@ could hand you spans for a version you do not have.
121
121
  | `err` | function | `dist/core/expr.d.ts:153-240` | Expressions and types | Reference a FAILED step's error → `$vars.<step>.error[.<field>]`. |
122
122
  | `ErrorEnvelopeField` | type | `dist/core/expr.d.ts:142-152` | Supporting types | The fields a failure envelope carries. |
123
123
  | `EscalationRef` | interface | `dist/core/actions.d.ts:1930-1991` | Supporting types | One escalation an inline agent may raise — an Action Center app task a human completes (the `coded-action-app` variant,… |
124
- | `EventFilter` | type | `dist/core/actions.d.ts:3368-3409` | Supporting types | One filter condition on the event payload. |
125
- | `EventSubscription` | interface | `dist/core/actions.d.ts:3458-3499` | Option shapes | What a connector event subscribes to. |
124
+ | `EventFilter` | type | `dist/core/actions.d.ts:3382-3423` | Supporting types | One filter condition on the event payload. |
125
+ | `EventSubscription` | interface | `dist/core/actions.d.ts:3472-3513` | Option shapes | What a connector event subscribes to. |
126
126
  | `Expr` | class | `dist/core/expr.d.ts:11-21` | Supporting types | A Flow expression. |
127
127
  | `FieldMapping` | interface | `dist/core/actions.d.ts:250-257` | Supporting types | 3 field(s) |
128
128
  | `FilterCondition` | type | `dist/core/actions.d.ts:233-234` | Supporting types | Comparison a filter rule applies to a field. |
@@ -197,7 +197,7 @@ could hand you spans for a version you do not have.
197
197
  | `ProcessToolRef` | interface | `dist/core/actions.d.ts:1861-1890` | Supporting types | A deployed tenant resource the agent may invoke. |
198
198
  | `publishedFunction` | function | `dist/core/actions.d.ts:2867-2891` | Actions | Invoke a published Orchestrator **Function** — a deployed unit of code run as one step (`uipath.core.function.<key>`,… |
199
199
  | `PublishedFunctionInputs` | interface | `dist/core/actions.d.ts:1054-1088` | Option shapes | A published Orchestrator **Function** — a small, single-purpose unit of code deployed as its own resource and invoked as… |
200
- | `queueItem` | function | `dist/core/actions.d.ts:3281-3326` | Actions | Declare an Orchestrator QUEUE ITEM step. |
200
+ | `queueItem` | function | `dist/core/actions.d.ts:3295-3340` | Actions | Declare an Orchestrator QUEUE ITEM step. |
201
201
  | `QueueItemInputs` | interface | `dist/core/actions.d.ts:2029-2102` | Option shapes | 10 field(s) |
202
202
  | `QueuePriority` | type | `dist/core/actions.d.ts:2027-2028` | Supporting types | The three priorities an Orchestrator queue item can carry. |
203
203
  | `ran` | function | `dist/core/expr.d.ts:95-141` | Expressions and types | Did this step run? |
@@ -242,7 +242,7 @@ could hand you spans for a version you do not have.
242
242
  | `triggerDescriptor` | function | `dist/core/connectors.d.ts:139-151` | Generated descriptors | Brand a trigger descriptor literal with its where/output types. |
243
243
  | `TriggerDescriptor` | type | `dist/core/connectors.d.ts:130-138` | Generated descriptors | A generated, typed connector-trigger descriptor: TriggerMeta branded with phantom `where`/output types. |
244
244
  | `TriggerMeta` | interface | `dist/core/connectors.d.ts:120-129` | Generated descriptors | Runtime metadata a generated trigger descriptor carries. |
245
- | `TriggerOptions` | interface | `dist/core/actions.d.ts:3410-3457` | Option shapes | The typed `onEvent`/`waitForEvent` options — everything an EventSubscription carries except `connector`/`event`, which… |
245
+ | `TriggerOptions` | interface | `dist/core/actions.d.ts:3424-3471` | Option shapes | The typed `onEvent`/`waitForEvent` options — everything an EventSubscription carries except `connector`/`event`, which… |
246
246
  | `TriggerSpec` | type | `dist/flow-sdk.d.ts:150-168` | Supporting types | What starts the flow. |
247
247
  | `TypeDesc` | type | `dist/core/expr.d.ts:379` | Supporting types | |
248
248
  | `types` | const | `dist/core/expr.d.ts:363-378` | Expressions and types | Variable type descriptors (map to Flow variable `type` values). |
@@ -254,8 +254,8 @@ could hand you spans for a version you do not have.
254
254
  | `VoiceAgentInputs` | interface | `dist/core/actions.d.ts:772-805` | Option shapes | 6 field(s) |
255
255
  | `VoiceSettings` | interface | `dist/core/actions.d.ts:749-771` | Supporting types | The audio settings a voice agent speaks with. |
256
256
  | `voiceTrigger` | function | `dist/flow-sdk.d.ts:302-326` | Flow construction | Start the flow when a phone call comes IN (`core.trigger.voice`). |
257
- | `waitForEvent` | function | `dist/core/actions.d.ts:3509-3544` | Actions | Wait mid-flow until a connector event fires, then continue with its payload — the typed form, where a generated trigger… |
258
- | `waitForEvent` | function | `dist/core/actions.d.ts:3545-3552` | Actions | Stringly form, for an event with no prepared module. |
257
+ | `waitForEvent` | function | `dist/core/actions.d.ts:3523-3558` | Actions | Wait mid-flow until a connector event fires, then continue with its payload — the typed form, where a generated trigger… |
258
+ | `waitForEvent` | function | `dist/core/actions.d.ts:3559-3566` | Actions | Stringly form, for an event with no prepared module. |
259
259
  | `waitForMessage` | function | `dist/core/actions.d.ts:2911-2927` | Actions | PAUSE until the person sends their next message (`uipath.conversational.wait-for-message`) — a catch event, like… |
260
260
  | `WaitForMessageInputs` | interface | `dist/core/actions.d.ts:644-652` | Option shapes | 2 field(s) |
261
261
 
@@ -299,8 +299,8 @@ could hand you spans for a version you do not have.
299
299
  | `EscalationOpts` | interface | `dist/case/case-sdk.d.ts:127-139` | Option shapes | 4 field(s) |
300
300
  | `EscalationRecipient` | interface | `dist/case/case-sdk.d.ts:119-126` | Supporting types | Who an escalation notifies. |
301
301
  | `EscalationTrigger` | type | `dist/case/case-sdk.d.ts:117-118` | Supporting types | When an escalation fires: as the deadline approaches (`at-risk`) or once it passes (`sla-breached`). |
302
- | `EventFilter` | type | `dist/core/actions.d.ts:3368-3409` | Supporting types | One filter condition on the event payload. |
303
- | `EventSubscription` | interface | `dist/core/actions.d.ts:3458-3499` | Option shapes | What a connector event subscribes to. |
302
+ | `EventFilter` | type | `dist/core/actions.d.ts:3382-3423` | Supporting types | One filter condition on the event payload. |
303
+ | `EventSubscription` | interface | `dist/core/actions.d.ts:3472-3513` | Option shapes | What a connector event subscribes to. |
304
304
  | `eventTrigger` | function | `dist/case/case-sdk.d.ts:276-286` | Case authoring | An Integration Service **event** trigger — an external event (a new row, an email, a webhook) starts the case. |
305
305
  | `eventTrigger` | function | `dist/case/case-sdk.d.ts:287-293` | Case authoring | An Integration Service event trigger in placeholder or stringly-resolved form. |
306
306
  | `EventTriggerOpts` | interface | `dist/case/case-sdk.d.ts:239-263` | Option shapes | 4 field(s) |
@@ -336,7 +336,7 @@ could hand you spans for a version you do not have.
336
336
  | `toUser` | function | `dist/case/case-sdk.d.ts:150-157` | Case authoring | An escalation recipient that is a single user. |
337
337
  | `TriggerDescriptor` | type | `dist/core/connectors.d.ts:130-138` | Supporting types | A generated, typed connector-trigger descriptor: TriggerMeta branded with phantom `where`/output types. |
338
338
  | `TriggerMeta` | interface | `dist/core/connectors.d.ts:120-129` | Supporting types | Runtime metadata a generated trigger descriptor carries. |
339
- | `TriggerOptions` | interface | `dist/core/actions.d.ts:3410-3457` | Option shapes | The typed `onEvent`/`waitForEvent` options — everything an EventSubscription carries except `connector`/`event`, which… |
339
+ | `TriggerOptions` | interface | `dist/core/actions.d.ts:3424-3471` | Option shapes | The typed `onEvent`/`waitForEvent` options — everything an EventSubscription carries except `connector`/`event`, which… |
340
340
  | `TypeDesc` | type | `dist/core/expr.d.ts:379` | Supporting types | |
341
341
  | `UnresolvedReferenceTaskKind` | type | `dist/case/case-sdk.d.ts:358-359` | Supporting types | Published-resource task kinds that the Case schema permits as unresolved skeletons. |
342
342
  | `WaitConnectorPlaceholderSpec` | interface | `dist/case/case-sdk.d.ts:360-370` | Supporting types | A `wait-for-connector` subscription: suspend on an Integration Service event. |
@@ -387,7 +387,7 @@ could hand you spans for a version you do not have.
387
387
  | `errorSchema` | const | `dist/bpmn/bpmn-sdk.d.ts:3490-3531` | BPMN authoring | The `Error` variable's shape — the platform's own error envelope. |
388
388
  | `errorSchemaWithResponse` | const | `dist/bpmn/bpmn-sdk.d.ts:3532-3564` | BPMN authoring | The same envelope plus `response` — what a node whose failure carries a payload writes, and what the same source calls… |
389
389
  | `EventDef` | type | `dist/bpmn/bpmn-sdk.d.ts:54-72` | Supporting types | The resolved event definition attached to an event node. |
390
- | `EventFilter` | type | `dist/core/actions.d.ts:3368-3409` | Supporting types | One filter condition on the event payload. |
390
+ | `EventFilter` | type | `dist/core/actions.d.ts:3382-3423` | Supporting types | One filter condition on the event payload. |
391
391
  | `EventKind` | type | `dist/bpmn/bpmn-sdk.d.ts:75-76` | Supporting types | The four non-boundary event element kinds a BpmnNode can be. |
392
392
  | `EventSubProcessOpts` | interface | `dist/bpmn/bpmn-sdk.d.ts:1835-1895` | Option shapes | Options for ScopeBuilder.eventSubProcess. |
393
393
  | `ExtensionPayload` | interface | `dist/bpmn/bpmn-sdk.d.ts:557-593` | Supporting types | An extension payload carried by an element the payload does not describe. |
@@ -139,15 +139,15 @@ not find it either.
139
139
  | `connection` | property | `ConnectorOpts` | `dist/core/actions.d.ts:190-194` |
140
140
  | `connection` | property | `ConnectorToolRef` | `dist/core/actions.d.ts:1832-1839` |
141
141
  | `connection` | property | `DataServiceOpts` | `dist/bpmn/bpmn-sdk.d.ts:1092-1098` |
142
- | `connection` | property | `EventSubscription` | `dist/core/actions.d.ts:3491-3495` |
142
+ | `connection` | property | `EventSubscription` | `dist/core/actions.d.ts:3505-3509` |
143
143
  | `connection` | property | `ExternalTaskOptions` | `dist/case/case-sdk.d.ts:393-394` |
144
144
  | `connection` | property | `ExternalTaskOpts` | `dist/bpmn/bpmn-sdk.d.ts:1503-1504` |
145
145
  | `connection` | property | `HttpOpts` | `dist/bpmn/bpmn-sdk.d.ts:1156-1181` |
146
- | `connection` | property | `TriggerOptions` | `dist/core/actions.d.ts:3448-3452` |
146
+ | `connection` | property | `TriggerOptions` | `dist/core/actions.d.ts:3462-3466` |
147
147
  | `connections` | property | `HitlRecipient` | `dist/core/actions.d.ts:438-442` |
148
148
  | `connector` | property | `BuiltTask` | `dist/case/case-sdk.d.ts:506` |
149
149
  | `connector` | property | `ConnectorToolRef` | `dist/core/actions.d.ts:1817-1818` |
150
- | `connector` | property | `EventSubscription` | `dist/core/actions.d.ts:3460-3461` |
150
+ | `connector` | property | `EventSubscription` | `dist/core/actions.d.ts:3474-3475` |
151
151
  | `connector` | property | `ExternalTaskSpecData` | `dist/case/case-sdk.d.ts:406-407` |
152
152
  | `connector` | property | `RuleOpts` | `dist/case/case-sdk.d.ts:56-62` |
153
153
  | `connector` | method | `ScopeBuilder` | `dist/bpmn/bpmn-sdk.d.ts:2332-2352` |
@@ -293,7 +293,7 @@ not find it either.
293
293
  | `escalation` | property | `RuleOpts` | `dist/case/case-sdk.d.ts:69-74` |
294
294
  | `escalations` | property | `BuiltSla` | `dist/case/case-sdk.d.ts:193` |
295
295
  | `escalations` | property | `SlaOpts` | `dist/case/case-sdk.d.ts:183-184` |
296
- | `event` | property | `EventSubscription` | `dist/core/actions.d.ts:3462-3463` |
296
+ | `event` | property | `EventSubscription` | `dist/core/actions.d.ts:3476-3477` |
297
297
  | `event` | property | `TriggerMeta` | `dist/core/connectors.d.ts:124-125` |
298
298
  | `eventBasedGateway` | method | `ScopeBuilder` | `dist/bpmn/bpmn-sdk.d.ts:2274-2283` |
299
299
  | `eventDefinition` | property | `RegistryTypeSpec` | `dist/bpmn/typed-node.d.ts:91-92` |
@@ -343,8 +343,8 @@ not find it either.
343
343
  | `filter` | property | `ConnectorEventOpts` | `dist/bpmn/bpmn-sdk.d.ts:1447-1462` |
344
344
  | `filters` | property | `ConnectorEventOpts` | `dist/bpmn/bpmn-sdk.d.ts:1463-1478` |
345
345
  | `filters` | property | `DataFabricReadInputs` | `dist/core/actions.d.ts:2173-2174` |
346
- | `filters` | property | `EventSubscription` | `dist/core/actions.d.ts:3489-3490` |
347
- | `filters` | property | `TriggerOptions` | `dist/core/actions.d.ts:3446-3447` |
346
+ | `filters` | property | `EventSubscription` | `dist/core/actions.d.ts:3503-3504` |
347
+ | `filters` | property | `TriggerOptions` | `dist/core/actions.d.ts:3460-3461` |
348
348
  | `flavour` | property | `AgentInputs` | `dist/core/actions.d.ts:1250-1264` |
349
349
  | `flowIds` | method | `ScopeBuilder` | `dist/bpmn/bpmn-sdk.d.ts:3006-3049` |
350
350
  | `flowMode` | method | `ScopeBuilder` | `dist/bpmn/bpmn-sdk.d.ts:2078-2117` |
@@ -355,13 +355,13 @@ not find it either.
355
355
  | `folder` | property | `ConnectorOpts` | `dist/core/actions.d.ts:195-196` |
356
356
  | `folder` | property | `ConnectorToolRef` | `dist/core/actions.d.ts:1840-1845` |
357
357
  | `folder` | property | `DataServiceOpts` | `dist/bpmn/bpmn-sdk.d.ts:1099-1111` |
358
- | `folder` | property | `EventSubscription` | `dist/core/actions.d.ts:3496-3497` |
358
+ | `folder` | property | `EventSubscription` | `dist/core/actions.d.ts:3510-3511` |
359
359
  | `folder` | property | `ExternalTaskOptions` | `dist/case/case-sdk.d.ts:395-396` |
360
360
  | `folder` | property | `ExternalTaskOpts` | `dist/bpmn/bpmn-sdk.d.ts:1505-1506` |
361
361
  | `folder` | property | `HttpOpts` | `dist/bpmn/bpmn-sdk.d.ts:1182-1183` |
362
362
  | `folder` | property | `OrchestratorOpts` | `dist/bpmn/bpmn-sdk.d.ts:1239-1240` |
363
363
  | `folder` | property | `QueueItemOpts` | `dist/bpmn/bpmn-sdk.d.ts:1300-1301` |
364
- | `folder` | property | `TriggerOptions` | `dist/core/actions.d.ts:3453-3454` |
364
+ | `folder` | property | `TriggerOptions` | `dist/core/actions.d.ts:3467-3468` |
365
365
  | `folderKey` | property | `AgentMemoryRef` | `dist/core/actions.d.ts:1777-1778` |
366
366
  | `folderKey` | property | `ContextIndexRef` | `dist/core/actions.d.ts:2010-2011` |
367
367
  | `folderKey` | property | `DataFabricCreateInputs` | `dist/core/actions.d.ts:2232-2240` |
@@ -674,8 +674,8 @@ not find it either.
674
674
  | `object` | property | `ConnectorEventOpts` | `dist/bpmn/bpmn-sdk.d.ts:1437-1446` |
675
675
  | `object` | property | `ConnectorOpts` | `dist/core/actions.d.ts:197-229` |
676
676
  | `object` | property | `ConnectorToolRef` | `dist/core/actions.d.ts:1823-1824` |
677
- | `object` | property | `EventSubscription` | `dist/core/actions.d.ts:3483-3488` |
678
- | `object` | property | `TriggerOptions` | `dist/core/actions.d.ts:3435-3445` |
677
+ | `object` | property | `EventSubscription` | `dist/core/actions.d.ts:3497-3502` |
678
+ | `object` | property | `TriggerOptions` | `dist/core/actions.d.ts:3449-3459` |
679
679
  | `objectName` | property | `ConnectorMeta` | `dist/core/connectors.d.ts:66-75` |
680
680
  | `objectName` | property | `LookupSpec` | `dist/core/lookups.d.ts:23-24` |
681
681
  | `objectName` | property | `SelectNextStageSpec` | `dist/case/case-sdk.d.ts:302-303` |
@@ -1091,12 +1091,12 @@ not find it either.
1091
1091
  | `version` | property | `ConnectorMeta` | `dist/core/connectors.d.ts:63` |
1092
1092
  | `version` | property | `ConnectorOpts` | `dist/core/actions.d.ts:188-189` |
1093
1093
  | `version` | property | `ConnectorToolRef` | `dist/core/actions.d.ts:1821-1822` |
1094
- | `version` | property | `EventSubscription` | `dist/core/actions.d.ts:3498` |
1094
+ | `version` | property | `EventSubscription` | `dist/core/actions.d.ts:3512` |
1095
1095
  | `version` | property | `ExternalTaskOpts` | `dist/bpmn/bpmn-sdk.d.ts:1507-1508` |
1096
1096
  | `version` | method | `FlowBuilder` | `dist/flow-sdk.d.ts:1313-1326` |
1097
1097
  | `version` | property | `NodeOptions` | `dist/flow-sdk.d.ts:354-361` |
1098
1098
  | `version` | property | `TriggerMeta` | `dist/core/connectors.d.ts:126` |
1099
- | `version` | property | `TriggerOptions` | `dist/core/actions.d.ts:3455-3456` |
1099
+ | `version` | property | `TriggerOptions` | `dist/core/actions.d.ts:3469-3470` |
1100
1100
  | `versionTag` | property | `IxpExtractInputs` | `dist/core/actions.d.ts:936-937` |
1101
1101
  | `versionTag` | property | `IxpToolRef` | `dist/core/actions.d.ts:1918-1919` |
1102
1102
  | `voice` | property | `VoiceAgentInputs` | `dist/core/actions.d.ts:791-792` |
@@ -1109,8 +1109,8 @@ not find it either.
1109
1109
  | `waitForTimer` | method | `TaskBuilder` | `dist/case/case-sdk.d.ts:877-883` |
1110
1110
  | `waypoints` | property | `EdgeRoute` | `dist/flow-sdk.d.ts:586-591` |
1111
1111
  | `when` | property | `SlaOpts` | `dist/case/case-sdk.d.ts:176-182` |
1112
- | `where` | property | `EventSubscription` | `dist/core/actions.d.ts:3464-3482` |
1113
- | `where` | property | `TriggerOptions` | `dist/core/actions.d.ts:3417-3434` |
1112
+ | `where` | property | `EventSubscription` | `dist/core/actions.d.ts:3478-3496` |
1113
+ | `where` | property | `TriggerOptions` | `dist/core/actions.d.ts:3431-3448` |
1114
1114
  | `width` | property | `CaseNodeLayout` | `dist/case/case-sdk.d.ts:604-605` |
1115
1115
  | `width` | property | `StickyNote` | `dist/flow-sdk.d.ts:641-642` |
1116
1116
  | `x` | property | `StickyNote` | `dist/flow-sdk.d.ts:637-638` |
package/dist/config.d.ts CHANGED
@@ -1,14 +1,43 @@
1
1
  /**
2
2
  * config — build a connector node's `inputs.detail.configuration` envelope.
3
3
  *
4
- * `uip maestro flow validate` requires connector configuration to be a
5
- * `=jsonString:`-wrapped `{ essentialConfiguration, optionalConfiguration }`
6
- * envelope. This mirrors the platform's own rehydrateConfiguration (Tier-A defaults
7
- * + library-derived per-connector statics), minus the fieldsContainer sidecar.
4
+ * The node stores Studio Web's ESSENTIAL-ONLY form,
5
+ * `=jsonString:{ "essentialConfiguration": { … } }`, with no
6
+ * `optionalConfiguration` section. That is the form Studio Web itself writes for
7
+ * an activity whose field metadata is not loaded, and the one `uip maestro flow`
8
+ * node configuration, the managed HTTP node, triggers, Case and BPMN connector
9
+ * nodes already store. See {@link buildConfiguration} for why the split form
10
+ * broke the designer (flow-builder-sdk#936).
8
11
  */
9
12
  /**
10
13
  * Compose the `=jsonString:`-wrapped configuration for a connector library entry.
11
14
  *
15
+ * ## Essential-only, because the split form needs a fieldsContainer
16
+ *
17
+ * Studio Web reads this string with `normalizeConfiguration`
18
+ * (StudioWeb `connector-activity/is-activities/runtime/models/configuration-classification.ts`
19
+ * @ 8724d739). It knows two stored forms:
20
+ *
21
+ * - **Split** — `{ essentialConfiguration, optionalConfiguration }` with a
22
+ * non-empty optional half. Studio Web treats the activity as fully configured
23
+ * and renders its fields from `optionalConfiguration.fieldsContainer`.
24
+ * - **Essential-only** — no `optionalConfiguration` (or an empty one). Studio
25
+ * Web sets `isEssentialOnly`, re-fetches the field metadata from the
26
+ * connection, and applies the node's `bodyParameters` / `queryParameters` /
27
+ * `pathParameters` to the rebuilt fields.
28
+ *
29
+ * This builder used to write the split form with Tier-A defaults in the
30
+ * optional half and no `fieldsContainer`. Studio Web then took the "fully
31
+ * configured" path, found no fields, showed every value empty (required ones
32
+ * flagged), and a designer save wrote the node back without its
33
+ * `bodyParameters`. The run was unaffected: the runtime reads the node's
34
+ * parameter buckets, not this string (flow-builder-sdk#936).
35
+ *
36
+ * The essential keys are Studio Web's `CONNECTOR_ACTIVITY_ESSENTIAL_PROPERTIES`
37
+ * plus the transient `savedFilterTrees` it keeps on the essential-only path.
38
+ * `uip maestro flow validate` and `pack` accept this form; the CLI's own
39
+ * connector configure writes it (`activityClient.getEssentialConfiguration()`).
40
+ *
12
41
  * ## Two things here are measured, not chosen
13
42
  *
14
43
  * Census over **every** connector node in the deployed corpus — 4,026 `.flow`
package/dist/config.js CHANGED
@@ -1,32 +1,25 @@
1
1
  /**
2
2
  * config — build a connector node's `inputs.detail.configuration` envelope.
3
3
  *
4
- * `uip maestro flow validate` requires connector configuration to be a
5
- * `=jsonString:`-wrapped `{ essentialConfiguration, optionalConfiguration }`
6
- * envelope. This mirrors the platform's own rehydrateConfiguration (Tier-A defaults
7
- * + library-derived per-connector statics), minus the fieldsContainer sidecar.
4
+ * The node stores Studio Web's ESSENTIAL-ONLY form,
5
+ * `=jsonString:{ "essentialConfiguration": { … } }`, with no
6
+ * `optionalConfiguration` section. That is the form Studio Web itself writes for
7
+ * an activity whose field metadata is not loaded, and the one `uip maestro flow`
8
+ * node configuration, the managed HTTP node, triggers, Case and BPMN connector
9
+ * nodes already store. See {@link buildConfiguration} for why the split form
10
+ * broke the designer (flow-builder-sdk#936).
8
11
  */
9
12
  import { parseCeql } from './core/ceql.js';
10
13
  import { transportHttpMethod } from './core/connector-inputs.js';
11
- const TIER_A_DEFAULTS = {
12
- additionalHeaders: null,
13
- baseObject: null,
14
- cachedBrowserItems: [],
15
- cachedLookupValues: [],
16
- cachedPropertyMappings: [],
14
+ /**
15
+ * Defaults for the essential keys a library entry does not set. These are the
16
+ * values Studio Web's own constructors give a new connector activity.
17
+ */
18
+ const ESSENTIAL_DEFAULTS = {
17
19
  customFieldsRequestDetails: null,
18
- eventMode: null,
19
- eventOperation: null,
20
20
  executionType: null,
21
- hasBreakingChanges: false,
22
- isAutopilotInvalidConfig: false,
23
- jobArguments: null,
24
- language: 'en-US',
25
- maxPageSize: 1000,
26
- objectActions: [],
27
21
  operation: 'create',
28
22
  packageVersion: '1.0.0',
29
- primaryKeys: [],
30
23
  };
31
24
  /**
32
25
  * Which of an operation's parameters carries a CEQL filter.
@@ -105,20 +98,44 @@ function schemaReplayDetails(operation, inputValues) {
105
98
  }
106
99
  return { objectActionName: action.name, parameterValues };
107
100
  }
101
+ /** Keep the essential keys; everything else is re-derived by Studio Web on open. */
108
102
  function envelope(flat) {
109
103
  const essential = {};
110
- const optional = {};
111
104
  for (const [k, v] of Object.entries(flat)) {
112
105
  if (ESSENTIAL_KEYS.has(k))
113
106
  essential[k] = v;
114
- else
115
- optional[k] = v;
116
107
  }
117
- return { essentialConfiguration: essential, optionalConfiguration: optional };
108
+ return { essentialConfiguration: essential };
118
109
  }
119
110
  /**
120
111
  * Compose the `=jsonString:`-wrapped configuration for a connector library entry.
121
112
  *
113
+ * ## Essential-only, because the split form needs a fieldsContainer
114
+ *
115
+ * Studio Web reads this string with `normalizeConfiguration`
116
+ * (StudioWeb `connector-activity/is-activities/runtime/models/configuration-classification.ts`
117
+ * @ 8724d739). It knows two stored forms:
118
+ *
119
+ * - **Split** — `{ essentialConfiguration, optionalConfiguration }` with a
120
+ * non-empty optional half. Studio Web treats the activity as fully configured
121
+ * and renders its fields from `optionalConfiguration.fieldsContainer`.
122
+ * - **Essential-only** — no `optionalConfiguration` (or an empty one). Studio
123
+ * Web sets `isEssentialOnly`, re-fetches the field metadata from the
124
+ * connection, and applies the node's `bodyParameters` / `queryParameters` /
125
+ * `pathParameters` to the rebuilt fields.
126
+ *
127
+ * This builder used to write the split form with Tier-A defaults in the
128
+ * optional half and no `fieldsContainer`. Studio Web then took the "fully
129
+ * configured" path, found no fields, showed every value empty (required ones
130
+ * flagged), and a designer save wrote the node back without its
131
+ * `bodyParameters`. The run was unaffected: the runtime reads the node's
132
+ * parameter buckets, not this string (flow-builder-sdk#936).
133
+ *
134
+ * The essential keys are Studio Web's `CONNECTOR_ACTIVITY_ESSENTIAL_PROPERTIES`
135
+ * plus the transient `savedFilterTrees` it keeps on the essential-only path.
136
+ * `uip maestro flow validate` and `pack` accept this form; the CLI's own
137
+ * connector configure writes it (`activityClient.getEssentialConfiguration()`).
138
+ *
122
139
  * ## Two things here are measured, not chosen
123
140
  *
124
141
  * Census over **every** connector node in the deployed corpus — 4,026 `.flow`
@@ -153,17 +170,16 @@ export function buildConfiguration(entry, version, inputValues, seed = 'node') {
153
170
  const isGeneric = at === 'Generic' || at === 'GenericExpanded';
154
171
  const v1ActivityType = isGeneric ? 'Generic' : 'Curated';
155
172
  // `operation.name` is the verb (`List`, `Create`, …); the platform stores it
156
- // lower-cased. Falls back to the Tier-A default for an entry that declares no
173
+ // lower-cased. Falls back to the default `create` for an entry that declares no
157
174
  // name, which keeps such an entry's emission exactly as it was.
158
175
  const verb = typeof op.name === 'string' && op.name
159
176
  ? op.name.toLowerCase()
160
- : TIER_A_DEFAULTS.operation;
177
+ : ESSENTIAL_DEFAULTS.operation;
161
178
  const composed = {
162
- ...TIER_A_DEFAULTS,
179
+ ...ESSENTIAL_DEFAULTS,
163
180
  operation: verb,
164
181
  customFieldsRequestDetails: schemaReplayDetails(op, inputValues),
165
182
  savedFilterTrees: savedFilterTrees(op, inputValues, seed),
166
- connectorKey: conn.key,
167
183
  objectName: op.objectName,
168
184
  httpMethod: transportHttpMethod(op.httpMethod),
169
185
  instanceParameters: isGeneric
@@ -184,8 +200,6 @@ export function buildConfiguration(entry, version, inputValues, seed = 'node') {
184
200
  supportsStreaming: op.supportsStreaming,
185
201
  subType: op.subType,
186
202
  },
187
- ...(conn.name ? { connectorName: conn.name } : {}),
188
- ...(op.objectDisplayName ? { objectDisplayName: op.objectDisplayName } : {}),
189
203
  ...(op.pathTemplate || op.path ? { path: op.pathTemplate || op.path } : {}),
190
204
  };
191
205
  return '=jsonString:' + JSON.stringify(envelope(composed));
@@ -3213,6 +3213,14 @@ export declare function dynamicExtract(inputs: DynamicExtractInputs): ActionSpec
3213
3213
  * { entityName: 'Contracts', recordId: input('id') }, { connection: 'df' }))
3214
3214
  * ```
3215
3215
  *
3216
+ * Get-by-id matters for long text. This node is a query even when it reads one
3217
+ * record by an `Id` filter, and a Data Service query returns a PREVIEW of a
3218
+ * long-text (`MULTILINE_MAX`) field: the first 10,000 characters plus
3219
+ * `...[Truncated]`, with no flag in the output. A 15,551-character value comes
3220
+ * back as 10,014 characters. When a field may exceed 10,000 characters, read
3221
+ * it with `get-entity-record-by-id`, which returns the whole value
3222
+ * (flow-builder-sdk#954).
3223
+ *
3216
3224
  * A connector operation's body fields come from the entity, so the library
3217
3225
  * cannot carry them: run `uip maestro registry prepare uipath-uipath-dataservice
3218
3226
  * get-entity-record-by-id -f entityName=<Entity>` first.
@@ -3237,6 +3245,12 @@ export declare function dataFabricRead(inputs: DataFabricReadInputs): ActionSpec
3237
3245
  * platform does. Field names are the ENTITY's, so copy them from the scenario
3238
3246
  * or the tenant; nothing offline can tell a real column from a typo.
3239
3247
  *
3248
+ * The published `output` is the record as a query returns it, so a long-text
3249
+ * (`MULTILINE_MAX`) field longer than 10,000 characters comes back cut, with
3250
+ * `...[Truncated]` appended, even though the whole value was stored. Use the
3251
+ * value you passed in, or re-read the record with the connector's
3252
+ * `get-entity-record-by-id`, when the whole text is needed (flow-builder-sdk#954).
3253
+ *
3240
3254
  * See {@link dataFabricRead} for what the native family still does not cover
3241
3255
  * and which connector operation covers it.
3242
3256
  *
@@ -916,6 +916,14 @@ export function dynamicExtract(inputs) {
916
916
  * { entityName: 'Contracts', recordId: input('id') }, { connection: 'df' }))
917
917
  * ```
918
918
  *
919
+ * Get-by-id matters for long text. This node is a query even when it reads one
920
+ * record by an `Id` filter, and a Data Service query returns a PREVIEW of a
921
+ * long-text (`MULTILINE_MAX`) field: the first 10,000 characters plus
922
+ * `...[Truncated]`, with no flag in the output. A 15,551-character value comes
923
+ * back as 10,014 characters. When a field may exceed 10,000 characters, read
924
+ * it with `get-entity-record-by-id`, which returns the whole value
925
+ * (flow-builder-sdk#954).
926
+ *
919
927
  * A connector operation's body fields come from the entity, so the library
920
928
  * cannot carry them: run `uip maestro registry prepare uipath-uipath-dataservice
921
929
  * get-entity-record-by-id -f entityName=<Entity>` first.
@@ -942,6 +950,12 @@ export function dataFabricRead(inputs) {
942
950
  * platform does. Field names are the ENTITY's, so copy them from the scenario
943
951
  * or the tenant; nothing offline can tell a real column from a typo.
944
952
  *
953
+ * The published `output` is the record as a query returns it, so a long-text
954
+ * (`MULTILINE_MAX`) field longer than 10,000 characters comes back cut, with
955
+ * `...[Truncated]` appended, even though the whole value was stored. Use the
956
+ * value you passed in, or re-read the record with the connector's
957
+ * `get-entity-record-by-id`, when the whole text is needed (flow-builder-sdk#954).
958
+ *
945
959
  * See {@link dataFabricRead} for what the native family still does not cover
946
960
  * and which connector operation covers it.
947
961
  *
@@ -88,6 +88,34 @@ export declare function serializeWithSidecars(built: BuiltFlow, opts?: Serialize
88
88
  }>;
89
89
  };
90
90
  export declare function serialize(built: BuiltFlow, opts?: SerializeOpts): any;
91
+ /**
92
+ * Every node `configuration` that carries Studio Web's split envelope must be
93
+ * one Studio Web can restore: either essential-only (no, or an empty,
94
+ * `optionalConfiguration`), or a full form whose optional half holds a
95
+ * `fieldsContainer`.
96
+ *
97
+ * Studio Web's `normalizeConfiguration` treats a non-empty optional half as
98
+ * "fully configured" and renders the fields from its `fieldsContainer`. With no
99
+ * container, every field shows empty and a designer save drops the node's
100
+ * `bodyParameters`; validate, pack and the run all pass
101
+ * (flow-builder-sdk#936). `buildConfiguration` writes essential-only; this
102
+ * check covers every emitter, root and subflows, so a new one cannot bring the
103
+ * broken shape back unnoticed.
104
+ *
105
+ * @throws Error naming each node whose configuration Studio Web would show empty.
106
+ */
107
+ export declare function assertConnectorConfigurationRestorable(flow: any): void;
108
+ /**
109
+ * Node ids and edge ids are each one namespace over the WHOLE file: the root
110
+ * and every `subflows` entry. Pack flattens subflows into one BPMN document, so
111
+ * two scopes sharing an id make it drop one element or crash in layout
112
+ * (`Cannot read properties of undefined (reading 'get')`), while `check` and
113
+ * `uip maestro flow validate` both pass. #938 shipped that way for `.stepToRef`
114
+ * edges; this check stops the next id scheme that forgets the file is shared.
115
+ *
116
+ * @throws Error naming each duplicated id and the scopes that carry it.
117
+ */
118
+ export declare function assertFileWideIdsUnique(flow: any): void;
91
119
  /**
92
120
  * Every `<bindings.NAME>` placeholder a node's definition carries in its
93
121
  * `model.context` must resolve to a `bindings[]` entry for THAT node.
package/dist/serialize.js CHANGED
@@ -3633,14 +3633,15 @@ const STICKY_NOTE_TYPE_VERSION = '1.0.0';
3633
3633
  * — a note colliding with a step would be silently dropped by the id-keyed
3634
3634
  * layout and merge paths downstream.
3635
3635
  */
3636
- function emitStickyNotes(built, scope) {
3636
+ function emitStickyNotes(built, scope, claimNoteId) {
3637
3637
  const notes = built.stickyNotes;
3638
3638
  if (!notes?.length)
3639
3639
  return;
3640
3640
  const taken = new Set(scope.nodes.map((n) => n.id));
3641
3641
  const seen = new Set();
3642
3642
  notes.forEach((note, i) => {
3643
- const id = note.id ?? `stickyNote_${i + 1}`;
3643
+ const authorId = note.id ?? `stickyNote_${i + 1}`;
3644
+ const id = authorId;
3644
3645
  if (taken.has(id)) {
3645
3646
  throw new Error(`.stickyNotes(): id "${id}" is already a node in this flow. A sticky note is a real node, `
3646
3647
  + `so its id has to be unique — name it something else.`);
@@ -3657,12 +3658,18 @@ function emitStickyNotes(built, scope) {
3657
3658
  if ((note.width === undefined) !== (note.height === undefined)) {
3658
3659
  throw new Error(`.stickyNotes(): note "${id}" needs both width and height, or neither.`);
3659
3660
  }
3661
+ // Node ids are one namespace over the whole file (#938): pack merges every
3662
+ // subflow into one BPMN document. The author's id is kept unless another
3663
+ // scope already holds it — a child with notes, called from two steps — and
3664
+ // `.layout()` finds a renamed note through `noteNodeId`.
3665
+ const emittedId = claimNoteId(authorId);
3666
+ (scope.noteNodeId ??= new Map()).set(authorId, emittedId);
3660
3667
  // The envelope Studio Web writes for a note (flow-v1 canvas: the add path
3661
3668
  // sets `typeVersion: '1.0.0'` and no display, and `nodeToInstance` persists
3662
3669
  // `display` as `{}`). Both fields are required on every node by
3663
3670
  // `flow validate`, manifest or not (#869).
3664
3671
  scope.nodes.push({
3665
- id,
3672
+ id: emittedId,
3666
3673
  type: 'stickyNote',
3667
3674
  typeVersion: STICKY_NOTE_TYPE_VERSION,
3668
3675
  ui: {
@@ -3685,7 +3692,9 @@ function applyAuthorLayout(layout, scope, where) {
3685
3692
  if (!layout)
3686
3693
  return undefined;
3687
3694
  const resolveId = (key) => {
3688
- const id = scope.stepNodeId.get(key) ?? (scope.nodes.some((n) => n.id === key) ? key : undefined);
3695
+ const id = scope.stepNodeId.get(key)
3696
+ ?? scope.noteNodeId?.get(key)
3697
+ ?? (scope.nodes.some((n) => n.id === key) ? key : undefined);
3689
3698
  if (!id) {
3690
3699
  throw new Error(`${where}.layout: "${key}" names no step or node in this flow. Layout keys are the flow's own step names (plus the trigger id and "end").`);
3691
3700
  }
@@ -4366,20 +4375,18 @@ function newScope(outputs, vars = []) {
4366
4375
  * exact class of failure `.onError` used to have (an error path that vanishes in
4367
4376
  * conversion with every rung green). So it throws instead.
4368
4377
  */
4369
- function resolveRejoins(scope) {
4378
+ function resolveRejoins(scope, addEdge) {
4370
4379
  for (const { from, target } of scope.pendingEdges) {
4371
4380
  const id = scope.stepNodeId.get(target);
4372
4381
  if (!id) {
4373
4382
  throw new Error(`.stepToRef('${target}') names a step this flow does not have. Known steps: `
4374
4383
  + `${[...scope.stepNodeId.keys()].join(', ') || '(none)'}.`);
4375
4384
  }
4376
- scope.edges.push({
4377
- id: `edge_ref_${scope.edges.length}`,
4378
- sourceNodeId: from.node,
4379
- sourcePort: from.port,
4380
- targetNodeId: id,
4381
- targetPort: 'input',
4382
- });
4385
+ // Through the serializer's own `addEdge`, so the id comes from the one
4386
+ // file-wide counter. A per-scope count (`edge_ref_${scope.edges.length}`)
4387
+ // gave two subflow copies of one child the same edge id; pack then dropped
4388
+ // one copy's edge or crashed in layout (flow-builder-sdk#938).
4389
+ addEdge(scope, from, id);
4383
4390
  }
4384
4391
  scope.pendingEdges.length = 0;
4385
4392
  }
@@ -4653,6 +4660,18 @@ export function serialize(built, opts = {}) {
4653
4660
  takenIds.add(id);
4654
4661
  return id;
4655
4662
  }
4663
+ /**
4664
+ * A sticky note's id: the author's id as written when nothing in the file
4665
+ * holds it yet, else `claimId`'s de-duplicated form. Not sanitized first, so
4666
+ * an explicit note id the file does not collide on is emitted unchanged.
4667
+ */
4668
+ function claimNoteId(base) {
4669
+ if (!takenIds.has(base)) {
4670
+ takenIds.add(base);
4671
+ return base;
4672
+ }
4673
+ return claimId(base);
4674
+ }
4656
4675
  /**
4657
4676
  * `uid` for a node that IS an author's step, recording which id that step got.
4658
4677
  *
@@ -4672,8 +4691,9 @@ export function serialize(built, opts = {}) {
4672
4691
  * Base and quick-form human tasks emitted so far, by node id. `addEdge` holds
4673
4692
  * every edge out of one to the product's handle rule (`hitlExitViolation`), so
4674
4693
  * `completed` on a task with outcomes fails at the edge that would write it;
4675
- * `assertHitlExitInvariant` repeats the check over each finished scope for the
4676
- * edges that do not come through here (parked `.stepToRef` rejoins).
4694
+ * `assertHitlExitInvariant` repeats the check over each finished scope, as a
4695
+ * guard for any future edge that is pushed without coming through here (parked
4696
+ * `.stepToRef` rejoins now do come through here, #938).
4677
4697
  */
4678
4698
  const hitlNodes = new Map();
4679
4699
  /**
@@ -4796,10 +4816,10 @@ export function serialize(built, opts = {}) {
4796
4816
  globals.push({ id: o.name, name: o.name, direction: 'out', type: o.type, ...varMeta(o) });
4797
4817
  for (const vd of childGlobals.vars)
4798
4818
  globals.push({ id: vd.name, name: vd.name, direction: 'inout', type: vd.type, ...varMeta(vd) });
4799
- resolveRejoins(scope);
4819
+ resolveRejoins(scope, addEdge);
4800
4820
  assertHitlExitInvariant(scope.nodes, scope.edges);
4801
4821
  typeAgentInputSchemas(scope, globals);
4802
- emitStickyNotes(child, scope);
4822
+ emitStickyNotes(child, scope, claimNoteId);
4803
4823
  const layoutEdges = applyAuthorLayout(child.layout, scope, `subflow "${nodeId}"`);
4804
4824
  assertNodeEnvelope(scope.nodes, `subflow "${nodeId}"`);
4805
4825
  return {
@@ -6964,10 +6984,10 @@ export function serialize(built, opts = {}) {
6964
6984
  globals.push({ id: inp.name, name: inp.name, direction: 'in', type: inp.type, triggerNodeId: ep.id, ...varMeta(inp) });
6965
6985
  }
6966
6986
  }
6967
- resolveRejoins(root);
6987
+ resolveRejoins(root, addEdge);
6968
6988
  assertHitlExitInvariant(root.nodes, root.edges);
6969
6989
  typeAgentInputSchemas(root, globals);
6970
- emitStickyNotes(built, root);
6990
+ emitStickyNotes(built, root, claimNoteId);
6971
6991
  const rootLayoutEdges = applyAuthorLayout(built.layout, root, `flow "${built.id}"`);
6972
6992
  assertNodeEnvelope(root.nodes, `flow "${built.id}"`);
6973
6993
  // The FILE-FORMAT version this document declares: the author's
@@ -7002,9 +7022,91 @@ export function serialize(built, opts = {}) {
7002
7022
  // so every family and every emission order is covered by one rule, not by
7003
7023
  // each call site remembering it (flow-builder-sdk#865/#866).
7004
7024
  assertBindingPlaceholdersResolve(flow);
7025
+ assertFileWideIdsUnique(flow);
7026
+ assertConnectorConfigurationRestorable(flow);
7005
7027
  connectionConnectors(flow);
7006
7028
  return flow;
7007
7029
  }
7030
+ /**
7031
+ * Every node `configuration` that carries Studio Web's split envelope must be
7032
+ * one Studio Web can restore: either essential-only (no, or an empty,
7033
+ * `optionalConfiguration`), or a full form whose optional half holds a
7034
+ * `fieldsContainer`.
7035
+ *
7036
+ * Studio Web's `normalizeConfiguration` treats a non-empty optional half as
7037
+ * "fully configured" and renders the fields from its `fieldsContainer`. With no
7038
+ * container, every field shows empty and a designer save drops the node's
7039
+ * `bodyParameters`; validate, pack and the run all pass
7040
+ * (flow-builder-sdk#936). `buildConfiguration` writes essential-only; this
7041
+ * check covers every emitter, root and subflows, so a new one cannot bring the
7042
+ * broken shape back unnoticed.
7043
+ *
7044
+ * @throws Error naming each node whose configuration Studio Web would show empty.
7045
+ */
7046
+ export function assertConnectorConfigurationRestorable(flow) {
7047
+ const nodes = [...(Array.isArray(flow?.nodes) ? flow.nodes : [])];
7048
+ for (const sub of Object.values(flow?.subflows ?? {})) {
7049
+ if (Array.isArray(sub?.nodes))
7050
+ nodes.push(...sub.nodes);
7051
+ }
7052
+ const broken = [];
7053
+ for (const node of nodes) {
7054
+ const raw = node?.inputs?.detail?.configuration;
7055
+ if (typeof raw !== 'string' || !raw.startsWith('=jsonString:'))
7056
+ continue;
7057
+ let envelope;
7058
+ try {
7059
+ envelope = JSON.parse(raw.slice('=jsonString:'.length));
7060
+ }
7061
+ catch {
7062
+ continue;
7063
+ }
7064
+ const optional = envelope?.optionalConfiguration;
7065
+ if (!envelope?.essentialConfiguration || !optional || typeof optional !== 'object')
7066
+ continue;
7067
+ if (Object.keys(optional).length > 0 && optional.fieldsContainer === undefined)
7068
+ broken.push(node.id);
7069
+ }
7070
+ if (broken.length) {
7071
+ throw new Error(`serialize: connector configuration on ${broken.map((id) => `"${id}"`).join(', ')} has a non-empty `
7072
+ + `optionalConfiguration without a fieldsContainer. Studio Web shows such a node's fields empty and a `
7073
+ + `save drops its bodyParameters (flow-builder-sdk#936). Emit { essentialConfiguration } only.`);
7074
+ }
7075
+ }
7076
+ /**
7077
+ * Node ids and edge ids are each one namespace over the WHOLE file: the root
7078
+ * and every `subflows` entry. Pack flattens subflows into one BPMN document, so
7079
+ * two scopes sharing an id make it drop one element or crash in layout
7080
+ * (`Cannot read properties of undefined (reading 'get')`), while `check` and
7081
+ * `uip maestro flow validate` both pass. #938 shipped that way for `.stepToRef`
7082
+ * edges; this check stops the next id scheme that forgets the file is shared.
7083
+ *
7084
+ * @throws Error naming each duplicated id and the scopes that carry it.
7085
+ */
7086
+ export function assertFileWideIdsUnique(flow) {
7087
+ const scopes = [['root', flow]];
7088
+ for (const [name, sub] of Object.entries(flow?.subflows ?? {}))
7089
+ scopes.push([`subflows.${name}`, sub]);
7090
+ const dupes = [];
7091
+ for (const kind of ['nodes', 'edges']) {
7092
+ const seen = new Map();
7093
+ for (const [where, scope] of scopes) {
7094
+ for (const el of Array.isArray(scope?.[kind]) ? scope[kind] : []) {
7095
+ const id = el?.id;
7096
+ if (typeof id !== 'string')
7097
+ continue;
7098
+ const first = seen.get(id);
7099
+ if (first !== undefined)
7100
+ dupes.push(`${kind.slice(0, -1)} id "${id}" in ${first} and ${where}`);
7101
+ else
7102
+ seen.set(id, where);
7103
+ }
7104
+ }
7105
+ }
7106
+ if (dupes.length) {
7107
+ throw new Error(`serialize: ids must be unique across the root and all subflows; duplicated: ${dupes.join('; ')}.`);
7108
+ }
7109
+ }
7008
7110
  /**
7009
7111
  * Every `<bindings.NAME>` placeholder a node's definition carries in its
7010
7112
  * `model.context` must resolve to a `bindings[]` entry for THAT node.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uipath/maestro-builder-sdk",
3
- "version": "6.16.11",
3
+ "version": "6.16.13",
4
4
  "description": "Build UiPath Flow, Case, and BPMN artifacts by writing TypeScript.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://docs.uipath.com/maestro",
@@ -92,5 +92,5 @@
92
92
  "@types/node": "^22.7.0",
93
93
  "esbuild": "^0.28.1"
94
94
  },
95
- "gitref": "aa02ee7f33c547e57d862b3ad18c1983cb291ba3"
95
+ "gitref": "fdace5d45a9d598a8e452bbf9f48bc50943b6688"
96
96
  }