@uipath/maestro-builder-sdk 6.66.12 → 6.67.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.
package/dist/api-index.md CHANGED
@@ -312,10 +312,10 @@ could hand you spans for a version you do not have.
312
312
  | `CaseAppConfig` | interface | `dist/case/case-sdk.d.ts:695-701` | Supporting types | Typed configuration for the generated Case App. |
313
313
  | `CaseAppDetailValue` | type | `dist/case/case-sdk.d.ts:684-685` | Supporting types | A value displayed in one Case App section. |
314
314
  | `CaseAppSection` | interface | `dist/case/case-sdk.d.ts:686-694` | Supporting types | One summary section in the generated Case App. |
315
- | `CaseBuilder` | class | `dist/case/case-sdk.d.ts:1270-1528` | Builders | 18 member(s) |
315
+ | `CaseBuilder` | class | `dist/case/case-sdk.d.ts:1280-1538` | Builders | 18 member(s) |
316
316
  | `CaseLayout` | interface | `dist/case/case-sdk.d.ts:723-734` | Supporting types | Optional Case designer layout, keyed by author-level stage and trigger names. |
317
317
  | `CaseNodeLayout` | interface | `dist/case/case-sdk.d.ts:702-722` | Supporting types | Designer-only fields the shipped Case transformer moves into `layout.nodes[id]`. |
318
- | `casePlan` | function | `dist/case/case-sdk.d.ts:1529-1535` | Case authoring | Start building a case plan with the given id. |
318
+ | `casePlan` | function | `dist/case/case-sdk.d.ts:1539-1545` | Case authoring | Start building a case plan with the given id. |
319
319
  | `CaseRule` | interface | `dist/case/case-sdk.d.ts:86-89` | Supporting types | A single DNF rule. |
320
320
  | `CaseRuleGrid` | type | `dist/case/case-sdk.d.ts:121-122` | Supporting types | One rule, one AND-group, or a complete OR-of-AND condition grid. |
321
321
  | `CaseRuleInput` | type | `dist/case/case-sdk.d.ts:119-120` | Supporting types | A concrete rule or a pure expression gate resolved by its receiving slot. |
@@ -354,9 +354,9 @@ could hand you spans for a version you do not have.
354
354
  | `SelectNextStageSpec` | interface | `dist/case/case-sdk.d.ts:326-344` | Supporting types | Data Fabric entity used by the Case runtime to deliver a person's next-stage selection. |
355
355
  | `SlaOpts` | interface | `dist/case/case-sdk.d.ts:174-193` | Option shapes | 5 field(s) |
356
356
  | `SlaUnit` | type | `dist/case/case-sdk.d.ts:123-124` | Supporting types | SLA deadline unit. |
357
- | `StageBuilder` | class | `dist/case/case-sdk.d.ts:1192-1269` | Builders | 6 member(s) |
357
+ | `StageBuilder` | class | `dist/case/case-sdk.d.ts:1202-1279` | Builders | 6 member(s) |
358
358
  | `StageExitType` | type | `dist/case/case-sdk.d.ts:325` | Supporting types | |
359
- | `TaskBuilder` | class | `dist/case/case-sdk.d.ts:837-1191` | Builders | 25 member(s) |
359
+ | `TaskBuilder` | class | `dist/case/case-sdk.d.ts:837-1201` | Builders | 25 member(s) |
360
360
  | `TaskInputBinding` | interface | `dist/case/case-sdk.d.ts:583-590` | Supporting types | A task input binding: a resource input parameter set to a literal or a `=`-expression. |
361
361
  | `TaskKind` | type | `dist/case/case-sdk.d.ts:383` | Supporting types | |
362
362
  | `TaskOutputBinding` | interface | `dist/case/case-sdk.d.ts:591-608` | Supporting types | A task output extraction: bind a field of the task's result (`source`) into a case variable (`var`) that later… |
@@ -60,7 +60,7 @@ not find it either.
60
60
  | `aliases` | property | `LookupSpec` | `dist/core/lookups.d.ts:31-32` |
61
61
  | `allErrors` | property | `RetrySpec` | `dist/bpmn/bpmn-sdk.d.ts:837-838` |
62
62
  | `allowAdhocOptionalStageTasks` | property | `BuiltCase` | `dist/case/case-sdk.d.ts:773-774` |
63
- | `allowAdhocTasks` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1373-1380` |
63
+ | `allowAdhocTasks` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1383-1390` |
64
64
  | `apiWorkflow` | property | `FlowActionSpecs` | `dist/nodes/process/flow/spec.d.ts:369-372` |
65
65
  | `apiWorkflow` | method | `TaskBuilder` | `dist/case/case-sdk.d.ts:903-912` |
66
66
  | `app` | property | `EscalationRef` | `dist/core/actions.d.ts:729-756` |
@@ -106,9 +106,9 @@ not find it either.
106
106
  | `breakEnabled` | property | `DoWhileOptions` | `dist/flow-sdk.d.ts:575-576` |
107
107
  | `breakEnabled` | property | `LoopOptions` | `dist/flow-sdk.d.ts:562-566` |
108
108
  | `build` | method | `BpmnBuilder` | `dist/bpmn/bpmn-sdk.d.ts:3669-3674` |
109
- | `build` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1522-1527` |
109
+ | `build` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1532-1537` |
110
110
  | `build` | method | `FlowBuilder` | `dist/flow-sdk.d.ts:1782-1788` |
111
- | `businessEvent` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1511-1521` |
111
+ | `businessEvent` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1521-1531` |
112
112
  | `businessEvent` | property | `RuleOpts` | `dist/case/case-sdk.d.ts:75-82` |
113
113
  | `businessEvents` | property | `BuiltCase` | `dist/case/case-sdk.d.ts:779-780` |
114
114
  | `businessRule` | property | `BuiltTask` | `dist/case/case-sdk.d.ts:615-616` |
@@ -120,7 +120,7 @@ not find it either.
120
120
  | `callContext` | property | `EndCallInputs` | `dist/nodes/agent/flow/spec.d.ts:98-103` |
121
121
  | `callContext` | property | `VoiceAgentInputs` | `dist/nodes/agent/flow/spec.d.ts:142-147` |
122
122
  | `cancelActivity` | property | `BoundaryOpts` | `dist/bpmn/bpmn-sdk.d.ts:778-779` |
123
- | `caseApp` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1352-1372` |
123
+ | `caseApp` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1362-1382` |
124
124
  | `caseAppConfig` | property | `BuiltCase` | `dist/case/case-sdk.d.ts:772` |
125
125
  | `caseAppEnabled` | property | `BuiltCase` | `dist/case/case-sdk.d.ts:771` |
126
126
  | `caseExit` | property | `BuiltCase` | `dist/case/case-sdk.d.ts:777` |
@@ -139,7 +139,7 @@ not find it either.
139
139
  | `collection` | property | `TransformInputs` | `dist/nodes/transform/flow/spec.d.ts:85-95` |
140
140
  | `color` | property | `StickyNote` | `dist/flow-sdk.d.ts:817-818` |
141
141
  | `colSpan` | property | `FormFieldSettings` | `dist/core/actions.d.ts:185-186` |
142
- | `completeWhen` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1491-1501` |
142
+ | `completeWhen` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1501-1511` |
143
143
  | `completion` | property | `LoopSpec` | `dist/bpmn/bpmn-sdk.d.ts:87-88` |
144
144
  | `completionCondition` | property | `LoopOptions` | `dist/flow-sdk.d.ts:557-561` |
145
145
  | `condition` | property | `BpmnFlow` | `dist/bpmn/bpmn-sdk.d.ts:368-369` |
@@ -236,7 +236,7 @@ not find it either.
236
236
  | `description` | property | `BuiltTask` | `dist/case/case-sdk.d.ts:626` |
237
237
  | `description` | property | `BuiltTrigger` | `dist/case/case-sdk.d.ts:208` |
238
238
  | `description` | property | `BusinessEventOpts` | `dist/case/case-sdk.d.ts:737-738` |
239
- | `description` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1337-1343` |
239
+ | `description` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1347-1353` |
240
240
  | `description` | property | `ClientSideToolRef` | `dist/core/actions.d.ts:501-502` |
241
241
  | `description` | property | `ConnectorToolRef` | `dist/core/actions.d.ts:602-606` |
242
242
  | `description` | property | `CustomGuardrail` | `dist/core/actions.d.ts:344` |
@@ -253,7 +253,7 @@ not find it either.
253
253
  | `description` | property | `ProcessToolRef` | `dist/core/actions.d.ts:655-660` |
254
254
  | `description` | property | `RemoteA2aToolRef` | `dist/core/actions.d.ts:484` |
255
255
  | `description` | property | `ResolvedEventTriggerOpts` | `dist/case/case-sdk.d.ts:294-295` |
256
- | `description` | method | `StageBuilder` | `dist/case/case-sdk.d.ts:1202-1208` |
256
+ | `description` | method | `StageBuilder` | `dist/case/case-sdk.d.ts:1212-1218` |
257
257
  | `description` | method | `TaskBuilder` | `dist/case/case-sdk.d.ts:1098-1104` |
258
258
  | `description` | property | `TimerTriggerOpts` | `dist/case/case-sdk.d.ts:233` |
259
259
  | `description` | property | `TypedOutputRow` | `dist/bpmn/typed-node.d.ts:322-323` |
@@ -320,8 +320,8 @@ not find it either.
320
320
  | `entryPointId` | property | `ProcessMetadata` | `dist/bpmn/bpmn-sdk.d.ts:552-564` |
321
321
  | `entryPointId` | property | `StartOpts` | `dist/bpmn/bpmn-sdk.d.ts:709-717` |
322
322
  | `entryPoints` | property | `BuiltFlow` | `dist/flow-sdk.d.ts:887-888` |
323
- | `entryWhen` | method | `StageBuilder` | `dist/case/case-sdk.d.ts:1242-1249` |
324
- | `entryWhen` | method | `TaskBuilder` | `dist/case/case-sdk.d.ts:1179-1188` |
323
+ | `entryWhen` | method | `StageBuilder` | `dist/case/case-sdk.d.ts:1252-1259` |
324
+ | `entryWhen` | method | `TaskBuilder` | `dist/case/case-sdk.d.ts:1189-1198` |
325
325
  | `err` | method | `StepList` | `dist/flow-sdk.d.ts:911-936` |
326
326
  | `error` | property | `BoundaryOpts` | `dist/bpmn/bpmn-sdk.d.ts:784-788` |
327
327
  | `error` | property | `EndOpts` | `dist/bpmn/bpmn-sdk.d.ts:730-740` |
@@ -350,7 +350,7 @@ not find it either.
350
350
  | `every` | property | `ScheduledInputs` | `dist/flow-sdk.d.ts:152-162` |
351
351
  | `every` | property | `TimerTriggerOpts` | `dist/case/case-sdk.d.ts:223-231` |
352
352
  | `exception` | property | `BuiltStage` | `dist/case/case-sdk.d.ts:636` |
353
- | `exceptionStage` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1483-1490` |
353
+ | `exceptionStage` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1493-1500` |
354
354
  | `exchangeId` | property | `ConversationalAgentSettings` | `dist/nodes/agent/flow/spec.d.ts:31-32` |
355
355
  | `exchangeId` | property | `SendMessageInputs` | `dist/nodes/conversation/flow/spec.d.ts:14-19` |
356
356
  | `exchangeLimit` | property | `ConversationContextInputs` | `dist/nodes/conversation/flow/spec.d.ts:40-43` |
@@ -360,7 +360,7 @@ not find it either.
360
360
  | `exit` | property | `BuiltStage` | `dist/case/case-sdk.d.ts:641` |
361
361
  | `exitToStage` | property | `BuiltExitCondition` | `dist/case/case-sdk.d.ts:355-369` |
362
362
  | `exitToStage` | property | `ExitOpts` | `dist/case/case-sdk.d.ts:816-830` |
363
- | `exitWhen` | method | `StageBuilder` | `dist/case/case-sdk.d.ts:1250-1257` |
363
+ | `exitWhen` | method | `StageBuilder` | `dist/case/case-sdk.d.ts:1260-1267` |
364
364
  | `exponentialBase` | property | `RetrySpec` | `dist/bpmn/bpmn-sdk.d.ts:835-836` |
365
365
  | `exposeError` | property | `HitlInputs` | `dist/nodes/hitl/flow/spec.d.ts:379-385` |
366
366
  | `expression` | property | `BuiltSla` | `dist/case/case-sdk.d.ts:199-200` |
@@ -493,7 +493,7 @@ not find it either.
493
493
  | `id` | property | `SwitchArm` | `dist/flow-sdk.d.ts:371-377` |
494
494
  | `id` | property | `VarEntry` | `dist/bpmn/bpmn-sdk.d.ts:1026-1027` |
495
495
  | `identifier` | property | `BuiltCase` | `dist/case/case-sdk.d.ts:769` |
496
- | `identifier` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1344-1351` |
496
+ | `identifier` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1354-1361` |
497
497
  | `identifierType` | property | `BuiltCase` | `dist/case/case-sdk.d.ts:770` |
498
498
  | `implied` | property | `BpmnFlow` | `dist/bpmn/bpmn-sdk.d.ts:370-377` |
499
499
  | `impliedFlowIds` | property | `SugarRegistry` | `dist/bpmn/bpmn-sdk.d.ts:2037-2038` |
@@ -503,7 +503,7 @@ not find it either.
503
503
  | `inlineAgent` | property | `FlowActionSpecs` | `dist/nodes/agent/flow/spec.d.ts:443-446` |
504
504
  | `inOuts` | property | `ActionSchemaFile` | `dist/nodes/hitl/flow/spec.d.ts:287-288` |
505
505
  | `inOuts` | property | `PlatformActionSchema` | `dist/nodes/hitl/flow/spec.d.ts:311-312` |
506
- | `input` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1402-1427` |
506
+ | `input` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1412-1437` |
507
507
  | `input` | method | `FlowBuilder` | `dist/flow-sdk.d.ts:1723-1735` |
508
508
  | `input` | property | `HumanTaskAppOpts` | `dist/bpmn/bpmn-sdk.d.ts:1415-1416` |
509
509
  | `input` | property | `OrchestratorOpts` | `dist/bpmn/bpmn-sdk.d.ts:1281-1282` |
@@ -604,7 +604,7 @@ not find it either.
604
604
  | `lanes` | property | `BuiltStage` | `dist/case/case-sdk.d.ts:639` |
605
605
  | `layout` | property | `BuiltCase` | `dist/case/case-sdk.d.ts:783-784` |
606
606
  | `layout` | property | `BuiltFlow` | `dist/flow-sdk.d.ts:877-878` |
607
- | `layout` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1381-1401` |
607
+ | `layout` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1391-1411` |
608
608
  | `layout` | method | `FlowBuilder` | `dist/flow-sdk.d.ts:1443-1469` |
609
609
  | `legacyCompleted` | property | `HitlInputs` | `dist/nodes/hitl/flow/spec.d.ts:386-418` |
610
610
  | `limit` | property | `DataFabricReadInputs` | `dist/nodes/data-fabric/flow/spec.d.ts:95-100` |
@@ -694,7 +694,7 @@ not find it either.
694
694
  | `name` | property | `BuiltInValidatorGuardrail` | `dist/core/actions.d.ts:356` |
695
695
  | `name` | property | `BuiltTask` | `dist/case/case-sdk.d.ts:610-611` |
696
696
  | `name` | property | `BuiltTrigger` | `dist/case/case-sdk.d.ts:206-207` |
697
- | `name` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1289-1295` |
697
+ | `name` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1299-1305` |
698
698
  | `name` | property | `CaseVarDecl` | `dist/case/case-sdk.d.ts:670` |
699
699
  | `name` | property | `CatchOpts` | `dist/bpmn/bpmn-sdk.d.ts:749-750` |
700
700
  | `name` | property | `ChooseOpts` | `dist/bpmn/bpmn-sdk.d.ts:1904-1905` |
@@ -801,7 +801,7 @@ not find it either.
801
801
  | `outcomes` | property | `HitlInputs` | `dist/nodes/hitl/flow/spec.d.ts:345-359` |
802
802
  | `outcomes` | property | `HumanTaskForm` | `dist/bpmn/human-task-form.d.ts:87-91` |
803
803
  | `outcomes` | property | `PlatformActionSchema` | `dist/nodes/hitl/flow/spec.d.ts:313-314` |
804
- | `output` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1428-1440` |
804
+ | `output` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1438-1450` |
805
805
  | `output` | method | `FlowBuilder` | `dist/flow-sdk.d.ts:1736-1771` |
806
806
  | `output` | property | `RegistryTypeSpec` | `dist/bpmn/typed-node.d.ts:97` |
807
807
  | `output` | method | `ScopeBuilder` | `dist/bpmn/bpmn-sdk.d.ts:3234-3242` |
@@ -826,7 +826,7 @@ not find it either.
826
826
  | `outputs` | property | `ReceiveMessageOpts` | `dist/bpmn/bpmn-sdk.d.ts:1475-1490` |
827
827
  | `outputs` | property | `ResolvedEventTriggerOpts` | `dist/case/case-sdk.d.ts:296-300` |
828
828
  | `outputs` | property | `ScriptTaskOpts` | `dist/bpmn/bpmn-sdk.d.ts:928-942` |
829
- | `outputs` | method | `TaskBuilder` | `dist/case/case-sdk.d.ts:1125-1178` |
829
+ | `outputs` | method | `TaskBuilder` | `dist/case/case-sdk.d.ts:1125-1188` |
830
830
  | `outputVar` | property | `ActivityNodeOpts` | `dist/bpmn/bpmn-sdk.d.ts:1642-1643` |
831
831
  | `outputVar` | property | `ConnectorEventOpts` | `dist/bpmn/bpmn-sdk.d.ts:1556-1557` |
832
832
  | `outputVar` | property | `DataServiceOpts` | `dist/bpmn/bpmn-sdk.d.ts:1146-1147` |
@@ -921,7 +921,7 @@ not find it either.
921
921
  | `required` | property | `PlatformActionSchemaArg` | `dist/nodes/hitl/flow/spec.d.ts:298-299` |
922
922
  | `required` | property | `RegistryContextField` | `dist/bpmn/typed-node.d.ts:26` |
923
923
  | `required` | property | `RegistryInputField` | `dist/bpmn/typed-node.d.ts:67` |
924
- | `required` | method | `StageBuilder` | `dist/case/case-sdk.d.ts:1209-1215` |
924
+ | `required` | method | `StageBuilder` | `dist/case/case-sdk.d.ts:1219-1225` |
925
925
  | `required` | method | `TaskBuilder` | `dist/case/case-sdk.d.ts:1076-1082` |
926
926
  | `required` | property | `TypedContextRow` | `dist/bpmn/typed-node.d.ts:229-230` |
927
927
  | `required` | property | `VarOpts` | `dist/bpmn/bpmn-sdk.d.ts:1772-1773` |
@@ -995,7 +995,7 @@ not find it either.
995
995
  | `schemas` | property | `BuiltBpmn` | `dist/bpmn/bpmn-sdk.d.ts:527-528` |
996
996
  | `schemaVersion` | method | `BpmnBuilder` | `dist/bpmn/bpmn-sdk.d.ts:3561-3590` |
997
997
  | `schemaVersion` | property | `BuiltFlow` | `dist/flow-sdk.d.ts:861-867` |
998
- | `schemaVersion` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1307-1336` |
998
+ | `schemaVersion` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1317-1346` |
999
999
  | `schemaVersion` | method | `FlowBuilder` | `dist/flow-sdk.d.ts:1602-1641` |
1000
1000
  | `scope` | property | `EscalationRecipient` | `dist/case/case-sdk.d.ts:129` |
1001
1001
  | `scopes` | property | `GuardrailSelector` | `dist/core/actions.d.ts:290` |
@@ -1035,9 +1035,9 @@ not find it either.
1035
1035
  | `skipCondition` | property | `QueueItemOpts` | `dist/bpmn/bpmn-sdk.d.ts:1363-1364` |
1036
1036
  | `skipCondition` | property | `ReceiveMessageOpts` | `dist/bpmn/bpmn-sdk.d.ts:1473-1474` |
1037
1037
  | `skipWhen` | method | `TaskBuilder` | `dist/case/case-sdk.d.ts:1105-1111` |
1038
- | `sla` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1502-1510` |
1038
+ | `sla` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1512-1520` |
1039
1039
  | `sla` | property | `RuleOpts` | `dist/case/case-sdk.d.ts:63-68` |
1040
- | `sla` | method | `StageBuilder` | `dist/case/case-sdk.d.ts:1258-1266` |
1040
+ | `sla` | method | `StageBuilder` | `dist/case/case-sdk.d.ts:1268-1276` |
1041
1041
  | `slaRules` | property | `BuiltCase` | `dist/case/case-sdk.d.ts:778` |
1042
1042
  | `slaRules` | property | `BuiltStage` | `dist/case/case-sdk.d.ts:642` |
1043
1043
  | `slug` | property | `McpToolRef` | `dist/core/actions.d.ts:462-463` |
@@ -1058,7 +1058,7 @@ not find it either.
1058
1058
  | `sourceTrigger` | property | `CaseVarDecl` | `dist/case/case-sdk.d.ts:676-682` |
1059
1059
  | `spec` | property | `ActivityNodeOpts` | `dist/bpmn/bpmn-sdk.d.ts:1627-1641` |
1060
1060
  | `splitPages` | property | `DocumentClassifyInputs` | `dist/nodes/document/flow/spec.d.ts:16-17` |
1061
- | `stage` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1475-1482` |
1061
+ | `stage` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1485-1492` |
1062
1062
  | `stage` | property | `RuleOpts` | `dist/case/case-sdk.d.ts:29-39` |
1063
1063
  | `stages` | property | `BuiltCase` | `dist/case/case-sdk.d.ts:776` |
1064
1064
  | `stages` | property | `CaseLayout` | `dist/case/case-sdk.d.ts:730-731` |
@@ -1110,7 +1110,7 @@ not find it either.
1110
1110
  | `target` | property | `TypedInputRow` | `dist/bpmn/typed-node.d.ts:248-249` |
1111
1111
  | `target` | property | `TypedOutputRow` | `dist/bpmn/typed-node.d.ts:324-329` |
1112
1112
  | `task` | method | `ScopeBuilder` | `dist/bpmn/bpmn-sdk.d.ts:2389-2397` |
1113
- | `task` | method | `StageBuilder` | `dist/case/case-sdk.d.ts:1216-1241` |
1113
+ | `task` | method | `StageBuilder` | `dist/case/case-sdk.d.ts:1226-1251` |
1114
1114
  | `tasks` | property | `RuleOpts` | `dist/case/case-sdk.d.ts:40-55` |
1115
1115
  | `taskTitle` | property | `EscalationRef` | `dist/core/actions.d.ts:765-766` |
1116
1116
  | `taxonomy` | property | `DocValidationInputs` | `dist/nodes/hitl/flow/spec.d.ts:97-98` |
@@ -1140,7 +1140,7 @@ not find it either.
1140
1140
  | `transformation` | property | `FieldMapping` | `dist/nodes/transform/flow/spec.d.ts:30-31` |
1141
1141
  | `trigger` | property | `BuiltEntryPoint` | `dist/flow-sdk.d.ts:846-847` |
1142
1142
  | `trigger` | property | `BuiltFlow` | `dist/flow-sdk.d.ts:872-874` |
1143
- | `trigger` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1466-1474` |
1143
+ | `trigger` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1476-1484` |
1144
1144
  | `trigger` | property | `EscalationOpts` | `dist/case/case-sdk.d.ts:136-137` |
1145
1145
  | `trigger` | method | `FlowBuilder` | `dist/flow-sdk.d.ts:1496-1516` |
1146
1146
  | `trigger` | property | `StartOpts` | `dist/bpmn/bpmn-sdk.d.ts:649-696` |
@@ -1211,7 +1211,7 @@ not find it either.
1211
1211
  | `value` | property | `TypedContextRow` | `dist/bpmn/typed-node.d.ts:219-220` |
1212
1212
  | `value` | property | `TypedInputRow` | `dist/bpmn/typed-node.d.ts:250-251` |
1213
1213
  | `values` | property | `DataFabricCreateInputs` | `dist/nodes/data-fabric/flow/spec.d.ts:132-137` |
1214
- | `var` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1441-1465` |
1214
+ | `var` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1451-1475` |
1215
1215
  | `var` | method | `FlowBuilder` | `dist/flow-sdk.d.ts:1772-1781` |
1216
1216
  | `var` | method | `ScopeBuilder` | `dist/bpmn/bpmn-sdk.d.ts:3216-3224` |
1217
1217
  | `var` | property | `TaskOutputBinding` | `dist/case/case-sdk.d.ts:596-597` |
@@ -1231,7 +1231,7 @@ not find it either.
1231
1231
  | `varSchema` | property | `TypedOutputRow` | `dist/bpmn/typed-node.d.ts:302-316` |
1232
1232
  | `version` | property | `BuiltCase` | `dist/case/case-sdk.d.ts:761-767` |
1233
1233
  | `version` | property | `BuiltFlow` | `dist/flow-sdk.d.ts:860` |
1234
- | `version` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1296-1306` |
1234
+ | `version` | method | `CaseBuilder` | `dist/case/case-sdk.d.ts:1306-1316` |
1235
1235
  | `version` | property | `ConnectorEventOpts` | `dist/bpmn/bpmn-sdk.d.ts:1510-1511` |
1236
1236
  | `version` | property | `ConnectorMeta` | `dist/core/connectors.d.ts:63` |
1237
1237
  | `version` | property | `ConnectorOpts` | `dist/core/actions.d.ts:14-15` |
@@ -1150,6 +1150,16 @@ declare class TaskBuilder {
1150
1150
  * later output's (`check` reports `OUTPUT_SELF_REFERENCE` /
1151
1151
  * `OUTPUT_FORWARD_READ`).
1152
1152
  *
1153
+ * A custom output reads no result field, so it works on **every** task kind,
1154
+ * not only the ones with a result to extract from. On an action task it is how
1155
+ * a reviewer's decision moves into case state:
1156
+ * `.action({ outputs: [{ name: 'approved', type: 'boolean' }] })` then
1157
+ * `.outputs({ decision: { assign: "=js:vars.approved ? 'yes' : 'no'" } })`.
1158
+ * It is written after the task's own rows (an action task's form fields, a
1159
+ * connector task's `response` / `Error`), so it can read them. A result-field
1160
+ * extract (`source`) is refused on a task kind with no result to read
1161
+ * (`TASK_OUTPUTS_UNSUPPORTED`).
1162
+ *
1153
1163
  * On a connector or wait-for-connector task, a field is read from the
1154
1164
  * operation's (or event's) `response`: an SDD row `app_id -> postAppId` is
1155
1165
  * `.outputs({ postAppId: '=response.app_id' })`. Each extract is written after
@@ -502,6 +502,16 @@ class TaskBuilder {
502
502
  * later output's (`check` reports `OUTPUT_SELF_REFERENCE` /
503
503
  * `OUTPUT_FORWARD_READ`).
504
504
  *
505
+ * A custom output reads no result field, so it works on **every** task kind,
506
+ * not only the ones with a result to extract from. On an action task it is how
507
+ * a reviewer's decision moves into case state:
508
+ * `.action({ outputs: [{ name: 'approved', type: 'boolean' }] })` then
509
+ * `.outputs({ decision: { assign: "=js:vars.approved ? 'yes' : 'no'" } })`.
510
+ * It is written after the task's own rows (an action task's form fields, a
511
+ * connector task's `response` / `Error`), so it can read them. A result-field
512
+ * extract (`source`) is refused on a task kind with no result to read
513
+ * (`TASK_OUTPUTS_UNSUPPORTED`).
514
+ *
505
515
  * On a connector or wait-for-connector task, a field is read from the
506
516
  * operation's (or event's) `response`: an SDD row `app_id -> postAppId` is
507
517
  * `.outputs({ postAppId: '=response.app_id' })`. Each extract is written after
@@ -564,12 +574,18 @@ class TaskBuilder {
564
574
  const REF_IO = new Set(['process', 'agent', 'rpa', 'api-workflow', 'case-management', 'flow-process', 'function', 'business-rule']);
565
575
  const CONNECTOR_OUTPUTS = new Set(['connector', 'wait-for-connector']);
566
576
  if (this._inputs && !REF_IO.has(this._kind))
567
- throw new CompileRefusal('TASK_INPUTS_UNSUPPORTED', `task "${this._name}": .inputs()/.outputs() are only supported on reference-mode tasks (process/agent/rpa/api-workflow/case-management/flow-process/function/business-rule), not "${this._kind}". A connector task takes its inputs in .connector() / .waitForConnector().`);
568
- if (this._outputs && !REF_IO.has(this._kind) && !CONNECTOR_OUTPUTS.has(this._kind))
569
- throw new CompileRefusal('TASK_OUTPUTS_UNSUPPORTED', `task "${this._name}": .outputs() is only supported on reference-mode tasks (process/agent/rpa/api-workflow/case-management/flow-process/function/business-rule) and on connector / wait-for-connector tasks, not "${this._kind}".`);
577
+ throw new CompileRefusal('TASK_INPUTS_UNSUPPORTED', `task "${this._name}": .inputs() is only supported on reference-mode tasks (process/agent/rpa/api-workflow/case-management/flow-process/function/business-rule), not "${this._kind}". A connector task takes its inputs in .connector() / .waitForConnector().`);
578
+ // Which rows a kind accepts depends on the row: an extract reads the task's
579
+ // result, so only a kind with one takes it; a custom `{ assign }` row reads
580
+ // none, so every kind takes it (#1451).
581
+ const extract = this._outputs?.find((o) => !o.custom);
582
+ if (extract && !REF_IO.has(this._kind) && !CONNECTOR_OUTPUTS.has(this._kind))
583
+ throw new CompileRefusal('TASK_OUTPUTS_UNSUPPORTED', `task "${this._name}": output "${extract.var}" extracts a result field, which only reference-mode tasks (process/agent/rpa/api-workflow/case-management/flow-process/function/business-rule) and connector / wait-for-connector tasks have, not "${this._kind}". A custom output ({ assign }) works on every task kind.`);
570
584
  if (REF_IO.has(this._kind) && !this._ref && (this._inputs || this._outputs))
571
585
  throw new CompileRefusal('TASK_IO_UNRESOLVED_REFERENCE', `task "${this._name}": an unresolved reference task cannot declare inputs or outputs.`);
572
- if (this._kind === 'wait-for-connector' && this._outputs
586
+ if (!this._action && !this._ref && this._kind === 'action' && this._outputs)
587
+ throw new CompileRefusal('TASK_IO_UNRESOLVED_REFERENCE', `task "${this._name}": an unresolved action task cannot declare outputs.`);
588
+ if (this._kind === 'wait-for-connector' && extract
573
589
  && !(this._waitConnector && 'connector' in this._waitConnector && 'event' in this._waitConnector))
574
590
  throw new CompileRefusal('TASK_OUTPUTS_PLACEHOLDER_EVENT', `task "${this._name}": a placeholder wait-for-connector task has no event response to extract outputs from — name the event (.waitForConnector(<trigger descriptor>) or { connector, event }).`);
575
591
  return {
@@ -378,6 +378,14 @@ function actionFields(rows) {
378
378
  ['options', row.options !== undefined ? tsLiteral(row.options) : undefined],
379
379
  ])).join(', ')}]`;
380
380
  }
381
+ /**
382
+ * An action task's form outputs: every output row but its custom `{ assign }`
383
+ * ones, which `emitTask` lifts to `.outputs()` (#1451).
384
+ */
385
+ function actionFormOutputs(task) {
386
+ const rows = Array.isArray(task.data?.outputs) ? task.data.outputs : [];
387
+ return rows.filter((row) => row.custom !== true);
388
+ }
381
389
  function bindingName(value, refs) {
382
390
  if (typeof value !== 'string' || !value.startsWith('=bindings.'))
383
391
  return undefined;
@@ -730,7 +738,7 @@ function emitTaskKind(task, refs, library) {
730
738
  ['app', actionApp(data, refs, task)],
731
739
  ['actionCatalogName', data.actionCatalogName !== undefined ? tsLiteral(data.actionCatalogName) : undefined],
732
740
  ['inputs', actionFields(data.inputs)],
733
- ['outputs', actionFields(data.outputs)],
741
+ ['outputs', actionFields(actionFormOutputs(task))],
734
742
  ]);
735
743
  return `.action(${spec})`;
736
744
  }
@@ -784,15 +792,6 @@ function isAuthorableBusinessRule(task) {
784
792
  }
785
793
  /** Task kinds whose own `response` / `Error` rows can be followed by `.outputs()` extracts. */
786
794
  const CONNECTOR_EXTRACT_KINDS = new Set(['execute-connector-activity', 'wait-for-connector']);
787
- /**
788
- * A connector or wait-for-connector task's extract rows: every output but the
789
- * `response` and `Error` rows `.connector()` / `.waitForConnector()` re-emit
790
- * themselves. Dropping them lost every SDD extract on a round trip.
791
- */
792
- function connectorExtracts(task) {
793
- const rows = Array.isArray(task.data?.outputs) ? task.data.outputs : [];
794
- return rows.filter((row) => !isConnectorOwnOutput(row));
795
- }
796
795
  /**
797
796
  * A connector's own `response` / `Error` row, which the builder re-emits
798
797
  * itself. Its id and source may carry a plan-wide suffix (`=response2`,
@@ -801,11 +800,16 @@ function connectorExtracts(task) {
801
800
  * extract, which `check` then refused (CONNECTOR_OUTPUT_SOURCE).
802
801
  */
803
802
  function isConnectorOwnOutput(row) {
803
+ // A custom row is never the task's own, even one named `Error` that assigns `=Error`.
804
+ if (row.custom === true)
805
+ return false;
804
806
  return (row.name === 'response' && /^=response\d*$/.test(String(row.source ?? '')))
805
807
  || (row.name === 'Error' && /^=Error\d*$/.test(String(row.source ?? '')));
806
808
  }
807
809
  /** The two outputs every business-rule task carries, which `.businessRule()` re-emits itself. */
808
810
  function isBusinessRuleOwnOutput(row) {
811
+ if (row.custom === true)
812
+ return false;
809
813
  return (row.name === 'output' && row.source === '=result') || (row.name === 'Error' && row.source === '=Error');
810
814
  }
811
815
  function businessRuleCall(task, refs) {
@@ -844,26 +848,16 @@ function emitTask(out, depth, task, lane, refs, library) {
844
848
  out.line(depth, `.task(${tsLiteral(task.displayName ?? '')}, t => t`);
845
849
  const inner = depth + 1;
846
850
  out.line(inner, emitTaskKind(task, refs, library));
847
- if (ownEntry(TASK_KIND_METHOD, task.type)) {
848
- const data = task.data ?? {};
849
- if (Array.isArray(data.inputs) && data.inputs.length)
850
- out.line(inner, `.inputs(${ioArg(data.inputs, 'inputs')})`);
851
- if (Array.isArray(data.outputs) && data.outputs.length)
852
- out.line(inner, `.outputs(${ioArg(data.outputs, 'outputs')})`);
853
- }
854
- if (isAuthorableBusinessRule(task)) {
851
+ if (ownEntry(TASK_KIND_METHOD, task.type) || isAuthorableBusinessRule(task)) {
855
852
  const data = task.data ?? {};
856
- const extracts = (Array.isArray(data.outputs) ? data.outputs : []).filter((row) => !isBusinessRuleOwnOutput(row));
857
853
  if (Array.isArray(data.inputs) && data.inputs.length)
858
854
  out.line(inner, `.inputs(${ioArg(data.inputs, 'inputs')})`);
859
- if (extracts.length)
860
- out.line(inner, `.outputs(${ioArg(extracts, 'outputs')})`);
861
- }
862
- if (CONNECTOR_EXTRACT_KINDS.has(String(task.type))) {
863
- const extracts = connectorExtracts(task);
864
- if (extracts.length)
865
- out.line(inner, `.outputs(${ioArg(extracts, 'outputs')})`);
866
855
  }
856
+ const outputs = taskOutputRows(task);
857
+ if (outputs)
858
+ refuseUnwrittenOutputs(task, outputs);
859
+ if (outputs?.lifted.length)
860
+ out.line(inner, `.outputs(${ioArg(outputs.lifted, 'outputs')})`);
867
861
  if (task.isRequired !== undefined)
868
862
  out.line(inner, task.isRequired ? '.required()' : '.required(false)');
869
863
  if (task.shouldRunOnlyOnce !== undefined)
@@ -876,6 +870,63 @@ function emitTask(out, depth, task, lane, refs, library) {
876
870
  emitEntryWhen(out, inner, condition, refs, false);
877
871
  out.line(depth, lane > 0 ? `, ${opts([['lane', String(lane)]])})` : ')');
878
872
  }
873
+ /**
874
+ * How a task's `data.outputs` rows come back on recompile: each `lifted` row
875
+ * becomes an entry of its `.outputs()`, and each `rebuilt` row is one its kind
876
+ * call writes itself (a connector's `response` / `Error`, an action's form
877
+ * fields). Undefined for a kind kept as a data literal, whose rows all survive.
878
+ *
879
+ * A row in neither list is not written back; `refuseUnwrittenOutputs` refuses it.
880
+ */
881
+ function taskOutputRows(task) {
882
+ const rows = Array.isArray(task.data?.outputs) ? task.data.outputs : [];
883
+ const kind = String(task.type);
884
+ const split = (rebuilt) => ({ lifted: rows.filter((row) => !rebuilt(row)), rebuilt: rows.filter(rebuilt) });
885
+ // On a kind with no result to extract from, `.outputs()` takes only custom
886
+ // rows, which read none (#1451).
887
+ const customOnly = (rebuilt) => ({ lifted: rows.filter((row) => row.custom === true), rebuilt });
888
+ let plan;
889
+ if (ownEntry(TASK_KIND_METHOD, kind))
890
+ plan = split(() => false);
891
+ else if (isAuthorableBusinessRule(task))
892
+ plan = split(isBusinessRuleOwnOutput);
893
+ else if (CONNECTOR_EXTRACT_KINDS.has(kind))
894
+ plan = split(isConnectorOwnOutput);
895
+ else if (kind === 'action')
896
+ plan = customOnly(actionFormOutputs(task));
897
+ else if (kind === 'wait-for-timer')
898
+ plan = customOnly([]);
899
+ else if (kind === 'external-agent' || kind === 'external-workflow')
900
+ plan = customOnly(rows.filter(isConnectorOwnOutput));
901
+ else
902
+ return undefined;
903
+ return plan;
904
+ }
905
+ /**
906
+ * Refuse, naming the task and the row, a plan whose output rows a recompile
907
+ * would not write back as they are (`docs/CASE_DECOMPILE_DESIGN.md`, refusal
908
+ * boundary; #1457):
909
+ *
910
+ * - a row in neither `taskOutputRows` list would vanish with no message. For
911
+ * instance a result-field extract `{ var: 'route', source: '=approved' }` on a
912
+ * wait-for-timer task, which has no result to read and no SDK form for it;
913
+ * - a custom row listed before one of the task's own rows (ahead of a
914
+ * connector's `response`) would come back after it. A custom row reads only
915
+ * the rows before it, so its value could change. An extract reads the task's
916
+ * result, so where it is listed does not matter.
917
+ */
918
+ function refuseUnwrittenOutputs(task, plan) {
919
+ const rows = Array.isArray(task.data?.outputs) ? task.data.outputs : [];
920
+ const kind = String(task.type);
921
+ const owner = `${kind} task "${task.displayName ?? task.id ?? '?'}"`;
922
+ const lost = rows.find((row) => !plan.lifted.includes(row) && !plan.rebuilt.includes(row));
923
+ if (lost)
924
+ throw new Error(`${owner} has output row "${lost.name ?? lost.var ?? '?'}" (source ${JSON.stringify(lost.source ?? null)}), which the SDK cannot write on a ${kind} task: only a custom { assign } output reads no task result. Decompile refuses it rather than drop it on recompile.`);
925
+ const firstCustom = rows.findIndex((row) => row.custom === true && plan.lifted.includes(row));
926
+ const lateOwn = firstCustom < 0 ? undefined : rows.slice(firstCustom).find((row) => plan.rebuilt.includes(row));
927
+ if (lateOwn)
928
+ throw new Error(`${owner} lists custom output "${rows[firstCustom].var ?? rows[firstCustom].name ?? '?'}" before its own row "${lateOwn.name ?? '?'}"; the SDK writes the task's own rows first, so a recompile would move the custom row after it and change what it reads.`);
929
+ }
879
930
  function escalationSource(escalation, slaName, index) {
880
931
  if (escalation.action?.type !== 'notification')
881
932
  throw new Error(`SLA escalation "${escalation.displayName ?? escalation.id ?? index}" has unsupported action "${escalation.action?.type}".`);
@@ -966,27 +1017,16 @@ function producedVariableNames(plan) {
966
1017
  continue;
967
1018
  for (const lane of node.data?.tasks ?? [])
968
1019
  for (const task of lane) {
969
- if (ownEntry(TASK_KIND_METHOD, task.type) || task.type === 'action') {
970
- // An action form output (`{ name, value }`) produces its variable as a
971
- // reference-task output does, so an older plan's root companion for it
972
- // is not re-declared as a `.var()` (the recompile writes none).
973
- for (const row of task.data?.outputs ?? [])
974
- if (row.var)
975
- produced.add(row.var);
976
- }
977
- else if (isAuthorableBusinessRule(task)) {
978
- // A business-rule extract registers its case variable on recompile, as
979
- // a reference-task output does; the task's own rows do not.
980
- for (const row of task.data?.outputs ?? [])
981
- if (row.var && !isBusinessRuleOwnOutput(row))
982
- produced.add(row.var);
983
- }
984
- else if (CONNECTOR_EXTRACT_KINDS.has(String(task.type))) {
985
- // A connector extract registers its case variable on recompile too.
986
- for (const row of connectorExtracts(task))
987
- if (row.var)
988
- produced.add(row.var);
989
- }
1020
+ // Every `.outputs()` row registers its case variable on recompile, and
1021
+ // so does an action form output (`{ name, value }`), so an older plan's
1022
+ // root companion for it is not re-declared as a `.var()`. A connector's
1023
+ // or business rule's own rows do not.
1024
+ const rows = taskOutputRows(task);
1025
+ if (!rows)
1026
+ continue;
1027
+ for (const row of [...rows.lifted, ...(task.type === 'action' ? rows.rebuilt : [])])
1028
+ if (row.var)
1029
+ produced.add(row.var);
990
1030
  }
991
1031
  }
992
1032
  // An own-name row that carries `originalVar` (`{ id: 'estimatedAge', var:
@@ -48,3 +48,10 @@ export declare function applyPreservation(result: Record<string, unknown>, prese
48
48
  * the payload does not.
49
49
  */
50
50
  export declare function followRenames(result: Record<string, unknown>, preservation: CaseJsonPreservation): CaseJsonPreservation;
51
+ /**
52
+ * Rename ids in one string: the whole value, or a whole id inside it, bounded
53
+ * by characters that cannot be part of an id (`"Stage_A-tB"`, `"=vars.vSlot"`).
54
+ * `trigger_1` does not match inside `trigger_10` or `trigger_1_x`. One pass, so
55
+ * a replacement is never replaced again.
56
+ */
57
+ export declare function idRenamer(renames: ReadonlyMap<string, string>): (value: string) => string;
@@ -711,6 +711,15 @@ function applyPreservedIdentities(result, preservation) {
711
711
  const identities = preservation.identities;
712
712
  if (!identities)
713
713
  return;
714
+ // Two kinds of id are restored:
715
+ // - an ELEMENT id (case, trigger, stage, task, condition, rule, SLA,
716
+ // escalation, root variable) is unique in the plan and other elements point
717
+ // at it (`elementId: "<stageId>-<taskId>"`, `exitToStageId`). `take` records
718
+ // the rename and `rewrite` follows it through the plan.
719
+ // - an io ROW id (a task's or a rule's `inputs[]` / `outputs[]` row) is only
720
+ // spelled by its own row, and the generated value repeats across owners:
721
+ // every subscription body row is `vbody`. `takeRow` renames inside that one
722
+ // row and never adds to the plan-wide map.
714
723
  const replacements = new Map();
715
724
  const take = (current, wanted) => {
716
725
  if (!current || !wanted || typeof current.id !== 'string')
@@ -718,6 +727,25 @@ function applyPreservedIdentities(result, preservation) {
718
727
  replacements.set(current.id, wanted);
719
728
  current.id = wanted;
720
729
  };
730
+ // Applied after `rewrite`, so a preserved row id is never itself rewritten.
731
+ const rowRenames = [];
732
+ const takeRow = (row, wanted, output) => {
733
+ if (!row || !wanted || typeof row.id !== 'string' || row.id === wanted)
734
+ return;
735
+ const was = row.id;
736
+ row.id = wanted;
737
+ rowRenames.push(() => {
738
+ if (row.var === was)
739
+ row.var = wanted;
740
+ if (row.originalVar === was)
741
+ row.originalVar = wanted;
742
+ if (row.target === `=${was}`)
743
+ row.target = `=${wanted}`;
744
+ // An input row's `value` is the value passed in, never its own id.
745
+ if (output && row.value === was)
746
+ row.value = wanted;
747
+ });
748
+ };
721
749
  const nodes = result.nodes;
722
750
  const stages = nodes.filter((node) => String(node.type).endsWith('Stage'));
723
751
  const bagField = CASE_FORMAT_PROFILE.waitConnectorRuleBagField;
@@ -762,14 +790,11 @@ function applyPreservedIdentities(result, preservation) {
762
790
  return;
763
791
  if (target && typeof row.id === 'string' && row.id !== currentId && heldOutputIds.has(row.id))
764
792
  return;
765
- take(target, row.id);
793
+ takeRow(target, row.id, true);
766
794
  if (target && typeof row.id === 'string' && typeof currentId === 'string') {
767
795
  heldOutputIds.delete(currentId);
768
796
  heldOutputIds.add(row.id);
769
797
  }
770
- if (typeof currentId === 'string' && typeof row.id === 'string' && target?.value === currentId) {
771
- target.value = row.id;
772
- }
773
798
  });
774
799
  };
775
800
  const takeConditions = (current, wanted) => {
@@ -804,7 +829,7 @@ function applyPreservedIdentities(result, preservation) {
804
829
  const task = stageTask(stage, taskIdentity.name);
805
830
  take(task, taskIdentity.id);
806
831
  takeConditions(task?.entryConditions, taskIdentity.entryConditions);
807
- (taskIdentity.inputs ?? []).forEach((row, index) => take(task?.data?.inputs?.[index], row.id));
832
+ (taskIdentity.inputs ?? []).forEach((row, index) => takeRow(task?.data?.inputs?.[index], row.id, false));
808
833
  takeOutputRows(task?.data?.outputs ?? [], taskIdentity.outputs ?? []);
809
834
  }));
810
835
  }
@@ -818,15 +843,7 @@ function applyPreservedIdentities(result, preservation) {
818
843
  return;
819
844
  take(variables[lane]?.find((candidate) => candidate.name === row.name), row.id);
820
845
  });
821
- const longestFirst = [...replacements].sort((a, b) => b[0].length - a[0].length);
822
- const replace = (value) => {
823
- if (replacements.has(value))
824
- return replacements.get(value);
825
- let replaced = value;
826
- for (const [current, wanted] of longestFirst)
827
- replaced = replaced.replaceAll(current, wanted);
828
- return replaced;
829
- };
846
+ const replace = idRenamer(replacements);
830
847
  // Every field that carries an id GENERATED by this serialize pass has to be
831
848
  // rewritten when preservation renames the node that id belongs to. Missing one
832
849
  // leaves a reference pointing at an id nothing has any more.
@@ -888,6 +905,8 @@ function applyPreservedIdentities(result, preservation) {
888
905
  rewrite(result);
889
906
  for (const { row, source } of preservedOutputSources)
890
907
  row.source = source;
908
+ for (const rename of rowRenames)
909
+ rename();
891
910
  // An id hashed from a generated element id is re-minted from the preserved one,
892
911
  // wherever it is spelled, including inside a `=jsonString:` configuration.
893
912
  const reseeded = new Map();
@@ -899,6 +918,25 @@ function applyPreservedIdentities(result, preservation) {
899
918
  if (reseeded.size)
900
919
  reseed(result, reseeded);
901
920
  }
921
+ /**
922
+ * Rename ids in one string: the whole value, or a whole id inside it, bounded
923
+ * by characters that cannot be part of an id (`"Stage_A-tB"`, `"=vars.vSlot"`).
924
+ * `trigger_1` does not match inside `trigger_10` or `trigger_1_x`. One pass, so
925
+ * a replacement is never replaced again.
926
+ */
927
+ export function idRenamer(renames) {
928
+ const longestFirst = [...renames.keys()].sort((a, b) => b.length - a.length);
929
+ const asPattern = (id) => id.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
930
+ const token = longestFirst.length
931
+ ? new RegExp(`(?<![\\w$])(?:${longestFirst.map(asPattern).join('|')})(?![\\w$])`, 'g')
932
+ : undefined;
933
+ return (value) => {
934
+ const whole = renames.get(value);
935
+ if (whole !== undefined)
936
+ return whole;
937
+ return token ? value.replace(token, (id) => renames.get(id)) : value;
938
+ };
939
+ }
902
940
  function reseed(value, ids) {
903
941
  if (!value || typeof value !== 'object')
904
942
  return;
@@ -1220,7 +1258,7 @@ function taskData(task, resolver, taskId, stageId, ids) {
1220
1258
  if (a.outputs?.length) {
1221
1259
  data.outputs = a.outputs.map((field) => emitActionField(field, `${stageId}-${taskId}`, resolver));
1222
1260
  }
1223
- return data;
1261
+ return withCustomOutputs(data, task, resolver);
1224
1262
  }
1225
1263
  // The io rows carry the task's own `elementId` ("<stageId>-<taskId>"), as
1226
1264
  // every other kind's do. They once got the bare task id, so the converter's
@@ -1230,15 +1268,13 @@ function taskData(task, resolver, taskId, stageId, ids) {
1230
1268
  return withOutputExtracts(connectorTaskData(task.connector, resolver, `${stageId}-${taskId}`, `Connector task "${task.name}"`), task, ids, resolver);
1231
1269
  case 'external-agent':
1232
1270
  case 'external-workflow':
1233
- return externalTaskData(task.kind, task.external, resolver, `${stageId}-${taskId}`, `${task.kind === 'external-agent' ? 'External Agent' : 'External Workflow'} task "${task.name}"`);
1271
+ return withCustomOutputs(externalTaskData(task.kind, task.external, resolver, `${stageId}-${taskId}`, `${task.kind === 'external-agent' ? 'External Agent' : 'External Workflow'} task "${task.name}"`), task, resolver);
1234
1272
  case 'wait-for-timer': {
1235
- if (task.timer?.duration)
1236
- return { timerType: 'timeDuration', timeDuration: task.timer.duration };
1237
- if (task.timer?.date)
1238
- return { timerType: 'timeDate', timeDate: task.timer.date };
1239
- if (task.timer?.cycle)
1240
- return { timerType: 'timeCycle', timeCycle: task.timer.cycle };
1241
- return {};
1273
+ const data = task.timer?.duration ? { timerType: 'timeDuration', timeDuration: task.timer.duration }
1274
+ : task.timer?.date ? { timerType: 'timeDate', timeDate: task.timer.date }
1275
+ : task.timer?.cycle ? { timerType: 'timeCycle', timeCycle: task.timer.cycle }
1276
+ : {};
1277
+ return withCustomOutputs(data, task, resolver);
1242
1278
  }
1243
1279
  case 'wait-for-connector':
1244
1280
  // Floor placeholder (no connector named) = `serviceType` only; naming the
@@ -1261,8 +1297,9 @@ function withOutputExtracts(data, task, ids, resolver) {
1261
1297
  if (!task.outputs?.length)
1262
1298
  return data;
1263
1299
  const own = Array.isArray(data.outputs) ? data.outputs : [];
1264
- const elementId = own.find((row) => typeof row.elementId === 'string')?.elementId;
1265
- if (!elementId)
1300
+ // A custom row carries `elementId: 'root'`; only an extract needs the task's.
1301
+ const elementId = own.find((row) => typeof row.elementId === 'string')?.elementId ?? '';
1302
+ if (!elementId && task.outputs.some((o) => !o.custom))
1266
1303
  throw new CompileRefusal('TASK_OUTPUTS_NO_RESPONSE', `task "${task.name}": output extracts need the task's resolved response output.`);
1267
1304
  data.outputs = [
1268
1305
  ...own,
@@ -1270,6 +1307,22 @@ function withOutputExtracts(data, task, ids, resolver) {
1270
1307
  ];
1271
1308
  return data;
1272
1309
  }
1310
+ /**
1311
+ * A task's custom `{ assign }` outputs, appended to the rows its own kind writes,
1312
+ * for a kind with no result-field extracts (action, wait-for-timer, external).
1313
+ * The builder lets only custom rows reach these kinds (#1451), and each is the
1314
+ * row Studio Web saves (`emitCustomOutput`). After an action task's form
1315
+ * fields, e.g. `.outputs({ decision: { assign: "=js:vars.approved ? 'yes' : 'no'" } })`:
1316
+ * [{ name: 'approved', …, source: '=approved' },
1317
+ * { name: 'decision', custom: true, var: 'decision', source: "=js:vars.approved ? 'yes' : 'no'", elementId: 'root', … }]
1318
+ */
1319
+ function withCustomOutputs(data, task, resolver) {
1320
+ if (!task.outputs?.length)
1321
+ return data;
1322
+ const own = Array.isArray(data.outputs) ? data.outputs : [];
1323
+ data.outputs = [...own, ...task.outputs.map((o) => emitCustomOutput(o, resolver))];
1324
+ return data;
1325
+ }
1273
1326
  /**
1274
1327
  * The `wait-for-connector` subscription bag (`data` on the task, `uipath` on the
1275
1328
  * rule). Verified against a real `uip maestro case` caseplan: a placeholder
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uipath/maestro-builder-sdk",
3
- "version": "6.66.12",
3
+ "version": "6.67.0",
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",
@@ -100,5 +100,5 @@
100
100
  "@types/node": "^22.7.0",
101
101
  "esbuild": "^0.28.1"
102
102
  },
103
- "gitref": "09e14700793a9cacefa30495f49e5a5753995226"
103
+ "gitref": "1b789661502b5fd528bc26a700665ecdea4821f5"
104
104
  }