@aranzatech/diagrams-bpmn 0.2.9 → 0.2.11

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/CHANGELOG.md CHANGED
@@ -2,6 +2,31 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.3.0
6
+
7
+ ### Batch process simulation
8
+
9
+ New public API for running synthetic batch simulations directly on a BPMN diagram
10
+ without an external engine. Enables bottleneck detection, heatmap overlays, and
11
+ operational capacity projections from inside the modeler.
12
+
13
+ **New exports (root `@aranzatech/diagrams-bpmn`)**
14
+
15
+ - `runBatchSimulation(diagram, config)` — runs `N` process instances synchronously
16
+ and aggregates per-node statistics. Designed to be called from a Web Worker for
17
+ large `N` to keep the main thread unblocked.
18
+
19
+ **New types**
20
+
21
+ - `BatchSimConfig` — `instances`, `gatewayWeights`, `nodeDurations`, `maxSteps`
22
+ - `BatchSimResult` — `total`, `completed`, `deadlocked`, `avgSteps`, `nodeStats`
23
+ - `NodeSimStats` — `visits`, `totalDurationMs`, `peakConcurrency` per node
24
+ - `GatewayWeights` — edge-id → relative weight map for exclusive / inclusive gateways
25
+
26
+ Gateway weights are normalised internally; edges absent from the map default to
27
+ weight `1`. `nodeDurations` drive `totalDurationMs` (visits × duration), enabling
28
+ duration-based heatmaps and daily workload projections.
29
+
5
30
  ## 0.2.7
6
31
 
7
32
  ### XML round-trip improvements
@@ -1,4 +1,4 @@
1
- import { f as BpmnElementType, d as BpmnElementMeta, e as BpmnElementSize } from './types-wFn_tJLY.js';
1
+ import { f as BpmnElementType, d as BpmnElementMeta, e as BpmnElementSize } from './types-BTuiBv7p.js';
2
2
 
3
3
  declare const BPMN_ELEMENT_CATALOG: Record<BpmnElementType, BpmnElementMeta>;
4
4
  declare function getElementMeta(type: BpmnElementType): BpmnElementMeta;
@@ -1,4 +1,4 @@
1
- import { f as BpmnElementType, d as BpmnElementMeta, e as BpmnElementSize } from './types-wFn_tJLY.cjs';
1
+ import { f as BpmnElementType, d as BpmnElementMeta, e as BpmnElementSize } from './types-BTuiBv7p.cjs';
2
2
 
3
3
  declare const BPMN_ELEMENT_CATALOG: Record<BpmnElementType, BpmnElementMeta>;
4
4
  declare function getElementMeta(type: BpmnElementType): BpmnElementMeta;
@@ -23,7 +23,10 @@ var ARANZA_DESCRIPTOR = {
23
23
  // BusinessRuleTask: reference to a DMN decision table id
24
24
  { name: "decisionRef", isAttr: true, type: "String" },
25
25
  // UserTask: form key resolved to a FormDefinition name at runtime
26
- { name: "formKey", isAttr: true, type: "String" }
26
+ { name: "formKey", isAttr: true, type: "String" },
27
+ // UserTask: Flowable task assignment — comma-separated ids
28
+ { name: "candidateUsers", isAttr: true, type: "String" },
29
+ { name: "candidateGroups", isAttr: true, type: "String" }
27
30
  ]
28
31
  }
29
32
  ],
@@ -307,6 +310,10 @@ function extractAranzaExtensions(el) {
307
310
  if (fde) result.flowableDelegateExpression = fde;
308
311
  const fk = asString(elAttrs["flowable:formKey"]);
309
312
  if (fk) result.formKey = fk;
313
+ const cu = asString(elAttrs["flowable:candidateUsers"]);
314
+ if (cu) result.candidateUsers = cu;
315
+ const cg = asString(elAttrs["flowable:candidateGroups"]);
316
+ if (cg) result.candidateGroups = cg;
310
317
  }
311
318
  const ext = el.extensionElements;
312
319
  if (!ext) return result;
@@ -332,6 +339,10 @@ function extractAranzaExtensions(el) {
332
339
  if (decisionRef) result.decisionRef = decisionRef;
333
340
  const formKey = asString(taskConfig.formKey);
334
341
  if (formKey) result.formKey = formKey;
342
+ const candidateUsers = asString(taskConfig.candidateUsers);
343
+ if (candidateUsers) result.candidateUsers = candidateUsers;
344
+ const candidateGroups = asString(taskConfig.candidateGroups);
345
+ if (candidateGroups) result.candidateGroups = candidateGroups;
335
346
  return result;
336
347
  }
337
348
  function extractCompletionCondition(el) {
@@ -701,7 +712,9 @@ function buildAranzaExtensionElements(moddle, node) {
701
712
  const flowableDelegateExpression = typeof node.data.flowableDelegateExpression === "string" ? node.data.flowableDelegateExpression : void 0;
702
713
  const decisionRef = typeof node.data.decisionRef === "string" ? node.data.decisionRef : void 0;
703
714
  const formKey = typeof node.data.formKey === "string" ? node.data.formKey : void 0;
704
- if (!priority && !owner && !sla && !connector && !action && !flowableType && !flowableDelegateExpression && !decisionRef && !formKey) {
715
+ const candidateUsers = typeof node.data.candidateUsers === "string" ? node.data.candidateUsers : void 0;
716
+ const candidateGroups = typeof node.data.candidateGroups === "string" ? node.data.candidateGroups : void 0;
717
+ if (!priority && !owner && !sla && !connector && !action && !flowableType && !flowableDelegateExpression && !decisionRef && !formKey && !candidateUsers && !candidateGroups) {
705
718
  return null;
706
719
  }
707
720
  const configAttrs = {};
@@ -714,6 +727,8 @@ function buildAranzaExtensionElements(moddle, node) {
714
727
  if (flowableDelegateExpression) configAttrs.flowableDelegateExpression = flowableDelegateExpression;
715
728
  if (decisionRef) configAttrs.decisionRef = decisionRef;
716
729
  if (formKey) configAttrs.formKey = formKey;
730
+ if (candidateUsers) configAttrs.candidateUsers = candidateUsers;
731
+ if (candidateGroups) configAttrs.candidateGroups = candidateGroups;
717
732
  const taskConfig = moddle.create("aranza:TaskConfig", configAttrs);
718
733
  return moddle.create("bpmn:ExtensionElements", { values: [taskConfig] });
719
734
  }
@@ -896,8 +911,14 @@ function buildFlowElement(moddle, node, allNodes, allEdges) {
896
911
  if (script) attrs.script = script;
897
912
  }
898
913
  if (elementType === "UserTask") {
914
+ const flowableAttrs = {};
899
915
  const fk = typeof node.data.formKey === "string" ? node.data.formKey : void 0;
900
- if (fk) attrs.$attrs = { "flowable:formKey": fk };
916
+ const cu = typeof node.data.candidateUsers === "string" ? node.data.candidateUsers : void 0;
917
+ const cg = typeof node.data.candidateGroups === "string" ? node.data.candidateGroups : void 0;
918
+ if (fk) flowableAttrs["flowable:formKey"] = fk;
919
+ if (cu) flowableAttrs["flowable:candidateUsers"] = cu;
920
+ if (cg) flowableAttrs["flowable:candidateGroups"] = cg;
921
+ if (Object.keys(flowableAttrs).length > 0) attrs.$attrs = flowableAttrs;
901
922
  }
902
923
  if (elementType === "ServiceTask") {
903
924
  const flowableAttrs = {};
@@ -1066,5 +1087,5 @@ async function serializeBpmnXml(nodes, edges, opts = {}) {
1066
1087
  }
1067
1088
 
1068
1089
  export { parseBpmnXml, serializeBpmnXml };
1069
- //# sourceMappingURL=chunk-KW2QVBOB.js.map
1070
- //# sourceMappingURL=chunk-KW2QVBOB.js.map
1090
+ //# sourceMappingURL=chunk-HLCUGTEK.js.map
1091
+ //# sourceMappingURL=chunk-HLCUGTEK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/xml/aranza-descriptor.ts","../src/xml/mapper.ts","../src/xml/importer.ts","../src/xml/exporter.ts"],"names":["laneSet","def","parseVariableType"],"mappings":"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","file":"chunk-HLCUGTEK.js","sourcesContent":["/**\n * bpmn-moddle package descriptor for the AranzaFlows extension namespace.\n *\n * Registered as { aranza: ARANZA_DESCRIPTOR } when constructing BpmnModdle so\n * that aranza:TaskConfig elements can be created and parsed via extensionElements.\n *\n * XML shape:\n * <bpmn:userTask id=\"Task_1\" name=\"Review\">\n * <bpmn:extensionElements>\n * <aranza:taskConfig priority=\"critical\" owner=\"ops-team\" sla=\"PT4H\" />\n * </bpmn:extensionElements>\n * </bpmn:userTask>\n */\nexport const ARANZA_DESCRIPTOR = {\n name: \"Aranza\",\n uri: \"http://aranzatech.io/schema/bpmn-extension/1.0\",\n prefix: \"aranza\",\n xml: { tagAlias: \"lowerCase\" },\n types: [\n {\n name: \"TaskConfig\",\n superClass: [\"Element\"],\n properties: [\n { name: \"priority\", isAttr: true, type: \"String\" },\n { name: \"owner\", isAttr: true, type: \"String\" },\n { name: \"sla\", isAttr: true, type: \"String\" },\n // Aranza connector execution config (resolved at runtime by the Flowable delegate)\n { name: \"connector\", isAttr: true, type: \"String\" },\n { name: \"action\", isAttr: true, type: \"String\" },\n // Flowable implementation hints stored for round-trip fidelity\n { name: \"flowableType\", isAttr: true, type: \"String\" },\n { name: \"flowableDelegateExpression\", isAttr: true, type: \"String\" },\n // BusinessRuleTask: reference to a DMN decision table id\n { name: \"decisionRef\", isAttr: true, type: \"String\" },\n // UserTask: form key resolved to a FormDefinition name at runtime\n { name: \"formKey\", isAttr: true, type: \"String\" },\n // UserTask: Flowable task assignment — comma-separated ids\n { name: \"candidateUsers\", isAttr: true, type: \"String\" },\n { name: \"candidateGroups\", isAttr: true, type: \"String\" },\n ],\n },\n ],\n enumerations: [],\n associations: [],\n} as const;\n","import type { BpmnElementType, BpmnEdgeType, EventTrigger } from \"../elements/types\";\n\n// ─── BPMN moddle $type → our BpmnElementType ─────────────────────────────────\n\nexport const MODDLE_TO_ELEMENT_TYPE: Record<string, BpmnElementType | undefined> = {\n \"bpmn:StartEvent\": \"StartEvent\",\n \"bpmn:EndEvent\": \"EndEvent\",\n \"bpmn:IntermediateCatchEvent\": \"IntermediateCatchEvent\",\n \"bpmn:IntermediateThrowEvent\": \"IntermediateThrowEvent\",\n \"bpmn:BoundaryEvent\": \"BoundaryEvent\",\n \"bpmn:Task\": \"Task\",\n \"bpmn:UserTask\": \"UserTask\",\n \"bpmn:ServiceTask\": \"ServiceTask\",\n \"bpmn:ScriptTask\": \"ScriptTask\",\n \"bpmn:ManualTask\": \"ManualTask\",\n \"bpmn:BusinessRuleTask\": \"BusinessRuleTask\",\n \"bpmn:ReceiveTask\": \"ReceiveTask\",\n \"bpmn:SendTask\": \"SendTask\",\n \"bpmn:CallActivity\": \"CallActivity\",\n \"bpmn:ExclusiveGateway\": \"ExclusiveGateway\",\n \"bpmn:InclusiveGateway\": \"InclusiveGateway\",\n \"bpmn:ParallelGateway\": \"ParallelGateway\",\n \"bpmn:EventBasedGateway\": \"EventBasedGateway\",\n \"bpmn:ComplexGateway\": \"ComplexGateway\",\n \"bpmn:SubProcess\": \"SubProcess\",\n \"bpmn:AdHocSubProcess\": \"AdHocSubProcess\",\n \"bpmn:Transaction\": \"Transaction\",\n \"bpmn:TextAnnotation\": \"Annotation\",\n \"bpmn:Group\": \"Group\",\n \"bpmn:DataObject\": \"DataObject\",\n \"bpmn:DataObjectReference\": \"DataObjectReference\",\n \"bpmn:DataInput\": \"DataInput\",\n \"bpmn:DataOutput\": \"DataOutput\",\n \"bpmn:DataStore\": \"DataStore\",\n \"bpmn:DataStoreReference\": \"DataStoreReference\",\n \"bpmn:Conversation\": \"Conversation\",\n \"bpmn:SubConversation\": \"SubConversation\",\n \"bpmn:CallConversation\": \"CallConversation\",\n \"bpmn:ChoreographyTask\": \"ChoreographyTask\",\n \"bpmn:SubChoreography\": \"SubChoreography\",\n \"bpmn:CallChoreography\": \"CallChoreography\",\n \"bpmn:Lane\": \"Lane\",\n};\n\n// ─── Our BpmnElementType → canonical bpmn: type ──────────────────────────────\n\nexport const ELEMENT_TYPE_TO_MODDLE: Partial<Record<BpmnElementType, string>> = {\n StartEvent: \"bpmn:StartEvent\",\n EndEvent: \"bpmn:EndEvent\",\n IntermediateCatchEvent: \"bpmn:IntermediateCatchEvent\",\n IntermediateThrowEvent: \"bpmn:IntermediateThrowEvent\",\n BoundaryEvent: \"bpmn:BoundaryEvent\",\n Task: \"bpmn:Task\",\n UserTask: \"bpmn:UserTask\",\n ServiceTask: \"bpmn:ServiceTask\",\n ScriptTask: \"bpmn:ScriptTask\",\n ManualTask: \"bpmn:ManualTask\",\n BusinessRuleTask: \"bpmn:BusinessRuleTask\",\n ReceiveTask: \"bpmn:ReceiveTask\",\n SendTask: \"bpmn:SendTask\",\n CallActivity: \"bpmn:CallActivity\",\n ExclusiveGateway: \"bpmn:ExclusiveGateway\",\n InclusiveGateway: \"bpmn:InclusiveGateway\",\n ParallelGateway: \"bpmn:ParallelGateway\",\n EventBasedGateway: \"bpmn:EventBasedGateway\",\n ComplexGateway: \"bpmn:ComplexGateway\",\n SubProcess: \"bpmn:SubProcess\",\n Transaction: \"bpmn:Transaction\",\n EventSubProcess: \"bpmn:SubProcess\",\n AdHocSubProcess: \"bpmn:AdHocSubProcess\",\n Pool: \"bpmn:Participant\",\n Lane: \"bpmn:Lane\",\n Annotation: \"bpmn:TextAnnotation\",\n Group: \"bpmn:Group\",\n DataObject: \"bpmn:DataObject\",\n DataObjectReference: \"bpmn:DataObjectReference\",\n DataInput: \"bpmn:DataInput\",\n DataOutput: \"bpmn:DataOutput\",\n DataStore: \"bpmn:DataStore\",\n DataStoreReference: \"bpmn:DataStoreReference\",\n Conversation: \"bpmn:Conversation\",\n SubConversation: \"bpmn:SubConversation\",\n CallConversation: \"bpmn:CallConversation\",\n ChoreographyTask: \"bpmn:ChoreographyTask\",\n SubChoreography: \"bpmn:SubChoreography\",\n CallChoreography: \"bpmn:CallChoreography\",\n};\n\n// ─── Edge type mappings ───────────────────────────────────────────────────────\n\nexport const MODDLE_TO_EDGE_TYPE: Record<string, BpmnEdgeType | undefined> = {\n \"bpmn:SequenceFlow\": \"sequenceFlow\",\n \"bpmn:MessageFlow\": \"messageFlow\",\n \"bpmn:Association\": \"association\",\n \"bpmn:DataInputAssociation\": \"dataAssociation\",\n \"bpmn:DataOutputAssociation\": \"dataAssociation\",\n \"bpmn:ConversationLink\": \"conversationLink\",\n};\n\nexport const EDGE_TYPE_TO_MODDLE: Record<BpmnEdgeType, string> = {\n sequenceFlow: \"bpmn:SequenceFlow\",\n messageFlow: \"bpmn:MessageFlow\",\n association: \"bpmn:Association\",\n dataAssociation: \"bpmn:DataInputAssociation\",\n conversationLink:\"bpmn:ConversationLink\",\n};\n\n// ─── Event definition type → trigger ─────────────────────────────────────────\n\nexport const EVENT_DEF_TO_TRIGGER: Record<string, EventTrigger> = {\n \"bpmn:MessageEventDefinition\": \"message\",\n \"bpmn:TimerEventDefinition\": \"timer\",\n \"bpmn:EscalationEventDefinition\": \"escalation\",\n \"bpmn:ConditionalEventDefinition\": \"conditional\",\n \"bpmn:ErrorEventDefinition\": \"error\",\n \"bpmn:CancelEventDefinition\": \"cancel\",\n \"bpmn:CompensateEventDefinition\": \"compensation\",\n \"bpmn:SignalEventDefinition\": \"signal\",\n \"bpmn:LinkEventDefinition\": \"link\",\n \"bpmn:TerminateEventDefinition\": \"terminate\",\n};\n\nexport const TRIGGER_TO_EVENT_DEF: Partial<Record<EventTrigger, string>> = {\n message: \"bpmn:MessageEventDefinition\",\n timer: \"bpmn:TimerEventDefinition\",\n escalation: \"bpmn:EscalationEventDefinition\",\n conditional: \"bpmn:ConditionalEventDefinition\",\n error: \"bpmn:ErrorEventDefinition\",\n cancel: \"bpmn:CancelEventDefinition\",\n compensation: \"bpmn:CompensateEventDefinition\",\n signal: \"bpmn:SignalEventDefinition\",\n link: \"bpmn:LinkEventDefinition\",\n terminate: \"bpmn:TerminateEventDefinition\",\n};\n","import type { ModdleElement } from \"bpmn-moddle\";\nimport { ARANZA_DESCRIPTOR } from \"./aranza-descriptor\";\nimport { BPMN_ELEMENT_CATALOG } from \"../elements/catalog\";\nimport type {\n BpmnElementType,\n BpmnEdgeType,\n BpmnNodeData,\n BpmnEdgeData,\n EventTrigger,\n SubProcessVariant,\n BpmnDefinitionsSet,\n BpmnEventDefinition,\n BpmnProcessVariable,\n} from \"../elements/types\";\nimport type { BpmnRFNode, BpmnRFEdge, BpmnImportResult } from \"./types\";\nimport {\n MODDLE_TO_ELEMENT_TYPE,\n MODDLE_TO_EDGE_TYPE,\n EVENT_DEF_TO_TRIGGER,\n} from \"./mapper\";\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\ninterface ShapeInfo {\n x: number;\n y: number;\n width: number;\n height: number;\n isExpanded?: boolean;\n}\n\ntype ShapeMap = Map<string, ShapeInfo>;\ntype WaypointMap = Map<string, Array<{ x: number; y: number }>>;\n\nfunction asElements(v: unknown): ModdleElement[] {\n return Array.isArray(v) ? (v as ModdleElement[]) : [];\n}\n\nfunction asString(v: unknown): string | undefined {\n return typeof v === \"string\" && v.trim() ? v.trim() : undefined;\n}\n\nfunction extractDocumentation(el: ModdleElement): string | undefined {\n const [doc] = asElements(el.documentation);\n return asString(doc?.text);\n}\n\n// ─── Extract BPMNDI shape/edge positions ─────────────────────────────────────\n\nfunction extractDiagramInfo(definitions: ModdleElement): {\n shapes: ShapeMap;\n waypoints: WaypointMap;\n} {\n const shapes: ShapeMap = new Map();\n const waypoints: WaypointMap = new Map();\n\n for (const diagram of asElements(definitions.diagrams)) {\n const plane = diagram.plane as ModdleElement | undefined;\n if (!plane) continue;\n\n for (const el of asElements(plane.planeElement)) {\n const bpmnEl = el.bpmnElement as ModdleElement | undefined;\n if (!bpmnEl?.id) continue;\n const id = bpmnEl.id as string;\n\n if (el.$type === \"bpmndi:BPMNShape\") {\n const b = el.bounds as { x: number; y: number; width: number; height: number } | undefined;\n if (b) {\n shapes.set(id, {\n x: b.x,\n y: b.y,\n width: b.width,\n height: b.height,\n ...(typeof el.isExpanded === \"boolean\" ? { isExpanded: el.isExpanded as boolean } : {}),\n });\n }\n } else if (el.$type === \"bpmndi:BPMNEdge\") {\n const pts = (el.waypoint ?? []) as Array<{ x: number; y: number }>;\n if (pts.length) waypoints.set(id, pts);\n }\n }\n }\n\n return { shapes, waypoints };\n}\n\n// ─── Lane membership (flowNodeId → laneId) ───────────────────────────────────\n\nfunction extractLaneMembership(process: ModdleElement): Map<string, string> {\n const map = new Map<string, string>();\n\n function walkLaneSet(laneSet: ModdleElement) {\n for (const lane of asElements(laneSet.lanes)) {\n const laneId = lane.id as string | undefined;\n if (!laneId) continue;\n for (const ref of asElements(lane.flowNodeRef)) {\n if (ref.id) map.set(ref.id as string, laneId);\n }\n const child = lane.childLaneSet as ModdleElement | undefined;\n if (child) walkLaneSet(child);\n }\n }\n\n const laneSet = process.laneSet as ModdleElement | undefined;\n if (laneSet) walkLaneSet(laneSet);\n return map;\n}\n\n// ─── Event trigger from eventDefinitions ─────────────────────────────────────\n\nfunction extractTrigger(el: ModdleElement): EventTrigger | undefined {\n const defs = asElements(el.eventDefinitions);\n if (defs.length === 0) return undefined;\n if (defs.length > 1) {\n return defs.some((def) => def.$type === \"bpmn:ParallelMultipleEventDefinition\")\n ? \"parallelMultiple\"\n : \"multiple\";\n }\n return EVENT_DEF_TO_TRIGGER[defs[0].$type];\n}\n\nfunction parseVariableType(value: unknown): BpmnProcessVariable[\"type\"] {\n const text = asString(value) ?? \"\";\n if (text.includes(\"int\")) return \"integer\";\n if (text.includes(\"boolean\")) return \"boolean\";\n if (text.includes(\"date\")) return \"date\";\n if (text.includes(\"array\")) return \"array\";\n if (text.includes(\"anyType\")) return \"object\";\n return \"string\";\n}\n\nfunction extractEventDefinition(el: ModdleElement): BpmnEventDefinition | undefined {\n const defs = asElements(el.eventDefinitions);\n if (defs.length === 0) return undefined;\n if (defs.length > 1) {\n return {\n type: defs.some((def) => def.$type === \"bpmn:ParallelMultipleEventDefinition\")\n ? \"parallelMultiple\"\n : \"multiple\",\n };\n }\n\n const [def] = defs;\n const type = EVENT_DEF_TO_TRIGGER[def.$type];\n if (!type) return undefined;\n\n const eventDefinition: BpmnEventDefinition = {\n type,\n ...(asString((def.messageRef as ModdleElement | undefined)?.id) ? { messageRef: (def.messageRef as ModdleElement).id as string } : {}),\n ...(asString((def.signalRef as ModdleElement | undefined)?.id) ? { signalRef: (def.signalRef as ModdleElement).id as string } : {}),\n ...(asString((def.errorRef as ModdleElement | undefined)?.id) ? { errorRef: (def.errorRef as ModdleElement).id as string } : {}),\n ...(asString((def.escalationRef as ModdleElement | undefined)?.id) ? { escalationRef: (def.escalationRef as ModdleElement).id as string } : {}),\n ...(asString((def.condition as ModdleElement | undefined)?.body) ? { conditionExpression: (def.condition as ModdleElement).body as string } : {}),\n };\n\n const timeDate = asString((def.timeDate as ModdleElement | undefined)?.body);\n const timeDuration = asString((def.timeDuration as ModdleElement | undefined)?.body);\n const timeCycle = asString((def.timeCycle as ModdleElement | undefined)?.body);\n if (timeDate) eventDefinition.timer = { kind: \"date\", value: timeDate };\n else if (timeCycle) eventDefinition.timer = { kind: \"cycle\", value: timeCycle };\n else if (timeDuration) eventDefinition.timer = { kind: \"duration\", value: timeDuration };\n\n if (type === \"link\") {\n const linkName = asString(el.name) ?? asString(def.name);\n if (linkName) eventDefinition.linkName = linkName;\n }\n\n return eventDefinition;\n}\n\nfunction extractDefinitions(rootElement: ModdleElement): BpmnDefinitionsSet | undefined {\n const definitions: BpmnDefinitionsSet = {};\n const rootElements = asElements(rootElement.rootElements);\n\n const messages = rootElements\n .filter((element) => element.$type === \"bpmn:Message\" && asString(element.id))\n .map((message) => ({\n id: message.id as string,\n name: asString(message.name) ?? message.id as string,\n }));\n if (messages.length > 0) definitions.messages = messages;\n\n const signals = rootElements\n .filter((element) => element.$type === \"bpmn:Signal\" && asString(element.id))\n .map((signal) => ({\n id: signal.id as string,\n name: asString(signal.name) ?? signal.id as string,\n }));\n if (signals.length > 0) definitions.signals = signals;\n\n const errors = rootElements\n .filter((element) => element.$type === \"bpmn:Error\" && asString(element.id))\n .map((error) => ({\n id: error.id as string,\n name: asString(error.name) ?? error.id as string,\n ...(asString(error.errorCode) ? { errorCode: error.errorCode as string } : {}),\n }));\n if (errors.length > 0) definitions.errors = errors;\n\n const escalations = rootElements\n .filter((element) => element.$type === \"bpmn:Escalation\" && asString(element.id))\n .map((escalation) => ({\n id: escalation.id as string,\n name: asString(escalation.name) ?? escalation.id as string,\n ...(asString(escalation.escalationCode) ? { escalationCode: escalation.escalationCode as string } : {}),\n }));\n if (escalations.length > 0) definitions.escalations = escalations;\n\n const itemDefinitions = asElements(rootElement.itemDefinitions)\n .filter((item) => asString(item.id))\n .map((item) => ({\n id: String(item.id).replace(/_item$/, \"\"),\n name: String(item.id).replace(/_item$/, \"\"),\n type: parseVariableType(item.structureRef),\n }));\n if (itemDefinitions.length > 0) definitions.variables = itemDefinitions;\n\n return Object.keys(definitions).length > 0 ? definitions : undefined;\n}\n\n// ─── SubProcessVariant from moddle type / properties ─────────────────────────\n\nfunction extractSubProcessVariant(el: ModdleElement): SubProcessVariant | undefined {\n if (el.$type === \"bpmn:Transaction\") return \"transaction\";\n if (el.$type === \"bpmn:AdHocSubProcess\") return \"adhoc\";\n if (el.$type === \"bpmn:SubProcess\" && el.triggeredByEvent === true) return \"event\";\n if (el.triggeredByEvent === true) return \"event\";\n return \"embedded\";\n}\n\n// ─── AranzaFlows extensionElements extractor ─────────────────────────────────\n\nfunction extractAranzaExtensions(el: ModdleElement): Partial<BpmnNodeData> {\n const result: Partial<BpmnNodeData> = {};\n\n // Read Flowable $attrs directly on the element\n const elAttrs = (el as Record<string, unknown>).$attrs as Record<string, unknown> | undefined;\n if (elAttrs) {\n const ft = asString(elAttrs[\"flowable:type\"]);\n if (ft) result.flowableType = ft;\n const fde = asString(elAttrs[\"flowable:delegateExpression\"]);\n if (fde) result.flowableDelegateExpression = fde;\n const fk = asString(elAttrs[\"flowable:formKey\"]);\n if (fk) result.formKey = fk;\n const cu = asString(elAttrs[\"flowable:candidateUsers\"]);\n if (cu) result.candidateUsers = cu;\n const cg = asString(elAttrs[\"flowable:candidateGroups\"]);\n if (cg) result.candidateGroups = cg;\n }\n\n const ext = el.extensionElements as ModdleElement | undefined;\n if (!ext) return result;\n const taskConfig = asElements(ext.values).find((v) => v.$type === \"aranza:TaskConfig\");\n if (!taskConfig) return result;\n\n const priority = asString(taskConfig.priority);\n if (priority === \"critical\" || priority === \"high\" || priority === \"medium\" || priority === \"low\") {\n result.priority = priority;\n }\n const owner = asString(taskConfig.owner);\n if (owner) result.owner = owner;\n const sla = asString(taskConfig.sla);\n if (sla) result.sla = sla;\n const connector = asString(taskConfig.connector);\n if (connector) result.connector = connector;\n const action = asString(taskConfig.action);\n if (action) result.action = action;\n // aranza:TaskConfig stores flowableType/flowableDelegateExpression for round-trip fidelity;\n // prefer these over $attrs when both are present.\n const flowableType = asString(taskConfig.flowableType);\n if (flowableType) result.flowableType = flowableType;\n const flowableDelegateExpression = asString(taskConfig.flowableDelegateExpression);\n if (flowableDelegateExpression) result.flowableDelegateExpression = flowableDelegateExpression;\n const decisionRef = asString(taskConfig.decisionRef);\n if (decisionRef) result.decisionRef = decisionRef;\n const formKey = asString(taskConfig.formKey);\n if (formKey) result.formKey = formKey;\n const candidateUsers = asString(taskConfig.candidateUsers);\n if (candidateUsers) result.candidateUsers = candidateUsers;\n const candidateGroups = asString(taskConfig.candidateGroups);\n if (candidateGroups) result.candidateGroups = candidateGroups;\n\n return result;\n}\n\nfunction extractCompletionCondition(el: ModdleElement): string | undefined {\n const cc = el.completionCondition as { body?: string } | string | undefined;\n if (!cc) return undefined;\n if (typeof cc === \"string\") return cc.trim() || undefined;\n return asString(cc.body);\n}\n\n// ─── Walk a flowElements list, producing nodes and edges ─────────────────────\n\ninterface WalkContext {\n shapes: ShapeMap;\n waypoints: WaypointMap;\n laneMembership: Map<string, string>;\n warnings: string[];\n autoX: { value: number };\n}\n\nfunction walkFlowElements(\n elements: ModdleElement[],\n parentId: string | undefined,\n ctx: WalkContext,\n nodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n) {\n for (const el of elements) {\n const { $type, id } = el;\n if (!id) continue;\n\n const edgeType = MODDLE_TO_EDGE_TYPE[$type];\n if (edgeType !== undefined) {\n buildEdge(el, edgeType, ctx, edges);\n continue;\n }\n\n // Lane nodes are handled separately via laneMembership\n if ($type === \"bpmn:LaneSet\") continue;\n\n const elementType =\n $type === \"bpmn:SubProcess\" && el.triggeredByEvent === true\n ? \"EventSubProcess\"\n : MODDLE_TO_ELEMENT_TYPE[$type];\n if (!elementType) {\n ctx.warnings.push(`Unknown element type \"${$type}\" (id=${id as string}) — skipped.`);\n continue;\n }\n\n buildNode(el, elementType, parentId, ctx, nodes);\n\n // Recurse into subprocess children\n if ($type === \"bpmn:SubProcess\" || $type === \"bpmn:Transaction\" || $type === \"bpmn:AdHocSubProcess\") {\n const children = asElements(el.flowElements);\n const laneMembership = extractLaneMembership(el);\n walkFlowElements(children, id as string, { ...ctx, laneMembership }, nodes, edges);\n }\n }\n}\n\nfunction buildNode(\n el: ModdleElement,\n elementType: BpmnElementType,\n parentId: string | undefined,\n ctx: WalkContext,\n nodes: BpmnRFNode[],\n) {\n const id = el.id as string;\n const meta = BPMN_ELEMENT_CATALOG[elementType];\n const shape = ctx.shapes.get(id);\n\n // Position: use BPMNDI if available, otherwise auto-grid\n const x = shape?.x ?? ctx.autoX.value;\n const y = shape?.y ?? 100;\n if (!shape) ctx.autoX.value += (meta?.defaultWidth ?? 120) + 20;\n\n const label = asString(el.name);\n const documentation = extractDocumentation(el);\n const trigger = extractTrigger(el);\n const eventDefinition = extractEventDefinition(el);\n const isNonInterrupting = el.cancelActivity === false;\n const attachedToRef = (el.attachedToRef as ModdleElement | undefined)?.id as string | undefined;\n const calledElement = elementType === \"CallActivity\" ? asString(el.calledElement) : undefined;\n const aranzaExt = extractAranzaExtensions(el);\n\n const scriptFormat = elementType === \"ScriptTask\" ? asString(el.scriptFormat) : undefined;\n const script = elementType === \"ScriptTask\" ? asString(el.script) : undefined;\n const completionCondition = elementType === \"AdHocSubProcess\" ? extractCompletionCondition(el) : undefined;\n\n const data: BpmnNodeData = {\n elementType,\n ...(label ? { label } : {}),\n ...(documentation ? { documentation } : {}),\n ...(trigger ? { trigger } : {}),\n ...(eventDefinition ? { eventDefinition } : {}),\n ...(isNonInterrupting ? { isNonInterrupting: true } : {}),\n ...(elementType === \"BoundaryEvent\" ? { cancelActivity: el.cancelActivity !== false } : {}),\n ...(attachedToRef ? { attachedToRef } : {}),\n ...(eventDefinition?.timer ? { timer: eventDefinition.timer, timerExpression: eventDefinition.timer } : {}),\n ...(eventDefinition?.messageRef ? { messageRef: eventDefinition.messageRef } : {}),\n ...(eventDefinition?.signalRef ? { signalRef: eventDefinition.signalRef } : {}),\n ...(eventDefinition?.errorRef ? { errorRef: eventDefinition.errorRef } : {}),\n ...(eventDefinition?.escalationRef ? { escalationRef: eventDefinition.escalationRef } : {}),\n ...(eventDefinition?.conditionExpression ? { conditionExpression: eventDefinition.conditionExpression } : {}),\n ...(eventDefinition?.linkName ? { linkName: eventDefinition.linkName } : {}),\n ...(calledElement ? { calledElement } : {}),\n ...(scriptFormat ? { scriptFormat } : {}),\n ...(script ? { script } : {}),\n ...(completionCondition ? { completionCondition } : {}),\n ...aranzaExt,\n };\n\n // SubProcess variant\n if (elementType === \"SubProcess\" || elementType === \"Transaction\" || elementType === \"EventSubProcess\" || elementType === \"AdHocSubProcess\") {\n const variant = extractSubProcessVariant(el);\n if (variant) data.subProcessVariant = variant;\n const isExpanded = shape?.isExpanded ?? true;\n data.isExpanded = isExpanded;\n }\n\n // Determine effective parentId: lane membership overrides process-level parent\n const laneId = ctx.laneMembership.get(id);\n const effectiveParentId = attachedToRef ?? laneId ?? parentId;\n\n const node: BpmnRFNode = {\n id,\n type: elementType,\n position: { x, y },\n data,\n width: shape?.width ?? meta?.defaultWidth,\n height: shape?.height ?? meta?.defaultHeight,\n ...(effectiveParentId ? { parentId: effectiveParentId } : {}),\n };\n\n nodes.push(node);\n}\n\nfunction buildEdge(\n el: ModdleElement,\n edgeType: BpmnEdgeType,\n ctx: WalkContext,\n edges: BpmnRFEdge[],\n) {\n const id = el.id as string;\n const source = (el.sourceRef as ModdleElement | undefined)?.id as string | undefined;\n const target = (el.targetRef as ModdleElement | undefined)?.id as string | undefined;\n\n if (!source || !target) {\n ctx.warnings.push(`Edge \"${id}\" missing source or target — skipped.`);\n return;\n }\n\n const label = asString(el.name);\n const documentation = extractDocumentation(el);\n const condExpr = el.conditionExpression as { body?: string } | undefined;\n\n const data: BpmnEdgeData = {\n edgeType,\n ...(label ? { label } : {}),\n ...(documentation ? { documentation } : {}),\n ...(condExpr?.body ? { conditionExpression: condExpr.body } : {}),\n };\n\n const waypoints = ctx.waypoints.get(id);\n if (waypoints?.length) data.routingPoints = waypoints;\n\n edges.push({ id, type: edgeType, source, target, data });\n}\n\n// ─── Handle Collaboration: Participants → Pool nodes ──────────────────────────\n\nfunction handleCollaboration(\n collaboration: ModdleElement,\n ctx: WalkContext,\n nodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n) {\n // Participants become Pool nodes\n for (const participant of asElements(collaboration.participants)) {\n const id = participant.id as string | undefined;\n if (!id) continue;\n const label = asString(participant.name);\n const shape = ctx.shapes.get(id);\n\n const poolNode: BpmnRFNode = {\n id,\n type: \"Pool\",\n position: { x: shape?.x ?? 0, y: shape?.y ?? 0 },\n data: { elementType: \"Pool\", ...(label ? { label } : {}) },\n width: shape?.width ?? 600,\n height: shape?.height ?? 200,\n };\n nodes.push(poolNode);\n\n // Walk the referenced process, assigning pool as parent\n const processRef = participant.processRef as ModdleElement | undefined;\n if (processRef) {\n const laneMembership = extractLaneMembership(processRef);\n walkFlowElements(\n asElements(processRef.flowElements),\n id,\n { ...ctx, laneMembership },\n nodes,\n edges,\n );\n\n // Add Lane nodes\n const laneSet = processRef.laneSet as ModdleElement | undefined;\n if (laneSet) {\n addLaneNodes(laneSet, id, ctx, nodes);\n }\n }\n }\n\n // Message flows\n for (const mf of asElements(collaboration.messageFlows)) {\n buildEdge(mf, \"messageFlow\", ctx, edges);\n }\n\n // Conversation links\n for (const cl of asElements(collaboration.conversationLinks)) {\n buildEdge(cl, \"conversationLink\", ctx, edges);\n }\n}\n\nfunction addLaneNodes(\n laneSet: ModdleElement,\n poolId: string,\n ctx: WalkContext,\n nodes: BpmnRFNode[],\n) {\n for (const lane of asElements(laneSet.lanes)) {\n const id = lane.id as string | undefined;\n if (!id) continue;\n const label = asString(lane.name);\n const shape = ctx.shapes.get(id);\n\n nodes.push({\n id,\n type: \"Lane\",\n position: { x: shape?.x ?? 30, y: shape?.y ?? 0 },\n data: { elementType: \"Lane\", ...(label ? { label } : {}) },\n width: shape?.width ?? 570,\n height: shape?.height ?? 120,\n parentId: poolId,\n });\n\n const child = lane.childLaneSet as ModdleElement | undefined;\n if (child) addLaneNodes(child, poolId, ctx, nodes);\n }\n}\n\n// ─── Public: parseBpmnXml ─────────────────────────────────────────────────────\n\n/**\n * Parse a BPMN 2.0 XML string into a ReactFlow-compatible node/edge graph.\n *\n * @param xml - Raw BPMN 2.0 XML string (UTF-8).\n * @returns Parsed nodes, edges, optional definitions set, and any parser warnings.\n * @throws {Error} When the XML cannot be parsed by bpmn-moddle.\n */\nexport async function parseBpmnXml(xml: string): Promise<BpmnImportResult> {\n const { BpmnModdle } = await import(\"bpmn-moddle\");\n const moddle = new BpmnModdle({ aranza: ARANZA_DESCRIPTOR });\n const warnings: string[] = [];\n\n let rootElement: ModdleElement;\n try {\n const result = await moddle.fromXML(xml);\n rootElement = result.rootElement;\n for (const w of result.warnings) warnings.push(w.message);\n } catch (err) {\n throw new Error(`Failed to parse BPMN XML: ${String(err)}`);\n }\n\n const nodes: BpmnRFNode[] = [];\n const edges: BpmnRFEdge[] = [];\n\n const { shapes, waypoints } = extractDiagramInfo(rootElement);\n const ctx: WalkContext = {\n shapes,\n waypoints,\n laneMembership: new Map(),\n warnings,\n autoX: { value: 50 },\n };\n\n for (const rootEl of asElements(rootElement.rootElements)) {\n if (rootEl.$type === \"bpmn:Collaboration\") {\n handleCollaboration(rootEl, ctx, nodes, edges);\n } else if (rootEl.$type === \"bpmn:Process\") {\n const laneMembership = extractLaneMembership(rootEl);\n const laneSet = rootEl.laneSet as ModdleElement | undefined;\n if (laneSet) addLaneNodes(laneSet, \"\", ctx, nodes);\n walkFlowElements(\n asElements(rootEl.flowElements),\n undefined,\n { ...ctx, laneMembership },\n nodes,\n edges,\n );\n }\n }\n\n const defaultFlowById = new Set<string>();\n const nodeIds = new Set(nodes.map((node) => node.id));\n for (const rootEl of asElements(rootElement.rootElements)) {\n collectDefaultFlows(rootEl, defaultFlowById);\n }\n\n const normalizedEdges: BpmnRFEdge[] = edges.map((edge) => {\n if (!defaultFlowById.has(edge.id)) return edge;\n const data: BpmnEdgeData = {\n edgeType: edge.data?.edgeType ?? (edge.type as BpmnEdgeType),\n ...(edge.data ?? {}),\n isDefault: true,\n };\n return { ...edge, data };\n });\n\n const firstProcess = asElements(rootElement.rootElements).find((rootEl) => rootEl.$type === \"bpmn:Process\");\n\n const importedDefinitions = extractDefinitions(rootElement);\n const process =\n firstProcess\n ? (() => {\n const importedProcess: NonNullable<BpmnImportResult[\"process\"]> = {};\n const processId = asString(firstProcess.id);\n const documentation = extractDocumentation(firstProcess);\n if (processId) importedProcess.processId = processId;\n if (typeof firstProcess.isExecutable === \"boolean\") importedProcess.executable = firstProcess.isExecutable as boolean;\n if (documentation) importedProcess.documentation = documentation;\n if (importedDefinitions) importedProcess.definitions = importedDefinitions;\n return importedProcess;\n })()\n : importedDefinitions\n ? { definitions: importedDefinitions }\n : undefined;\n\n return {\n nodes: normalizeChildPositions(nodes, nodeIds),\n edges: normalizedEdges,\n warnings,\n ...(process ? { process } : {}),\n };\n}\n\nfunction collectDefaultFlows(el: ModdleElement, defaultFlowById: Set<string>): void {\n const defaultRef = el.default as ModdleElement | undefined;\n if (defaultRef?.id) defaultFlowById.add(defaultRef.id as string);\n\n for (const child of asElements(el.rootElements)) collectDefaultFlows(child, defaultFlowById);\n for (const child of asElements(el.flowElements)) collectDefaultFlows(child, defaultFlowById);\n}\n\nfunction normalizeChildPositions(nodes: BpmnRFNode[], nodeIds: Set<string>): BpmnRFNode[] {\n const absoluteById = new Map(nodes.map((node) => [node.id, node.position]));\n\n return nodes.map((node) => {\n if (!node.parentId || !nodeIds.has(node.parentId)) return node;\n const parentPosition = absoluteById.get(node.parentId);\n if (!parentPosition) return node;\n\n return {\n ...node,\n position: {\n x: node.position.x - parentPosition.x,\n y: node.position.y - parentPosition.y,\n },\n };\n });\n}\n","import type { BpmnModdle, ModdleElement } from \"bpmn-moddle\";\nimport { ARANZA_DESCRIPTOR } from \"./aranza-descriptor\";\nimport { BPMN_ELEMENT_CATALOG } from \"../elements/catalog\";\nimport type { BpmnRFNode, BpmnRFEdge, BpmnExportOptions } from \"./types\";\nimport type {\n BpmnDefinitionsSet,\n BpmnEventDefinition,\n BpmnNodeData,\n BpmnProcessVariable,\n} from \"../elements/types\";\nimport {\n ELEMENT_TYPE_TO_MODDLE,\n EDGE_TYPE_TO_MODDLE,\n TRIGGER_TO_EVENT_DEF,\n} from \"./mapper\";\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction uid(prefix: string, id: string): string {\n return `${prefix}_${id}`;\n}\n\nfunction asNodes(nodes: BpmnRFNode[], types: string[]): BpmnRFNode[] {\n return nodes.filter((n) => types.includes(n.data.elementType));\n}\n\nfunction normalizeEventDefinition(data: BpmnNodeData): BpmnEventDefinition | undefined {\n const trigger = data.eventDefinition?.type ?? data.trigger;\n if (!trigger || trigger === \"none\") return undefined;\n const normalized: BpmnEventDefinition = { type: trigger };\n const timer = data.eventDefinition?.timer ?? data.timer ?? data.timerExpression;\n const messageRef = data.eventDefinition?.messageRef ?? (typeof data.messageRef === \"string\" ? data.messageRef : undefined);\n const signalRef = data.eventDefinition?.signalRef ?? (typeof data.signalRef === \"string\" ? data.signalRef : undefined);\n const errorRef = data.eventDefinition?.errorRef ?? (typeof data.errorRef === \"string\" ? data.errorRef : undefined);\n const escalationRef = data.eventDefinition?.escalationRef ?? (typeof data.escalationRef === \"string\" ? data.escalationRef : undefined);\n const conditionExpression = data.eventDefinition?.conditionExpression ?? (typeof data.conditionExpression === \"string\" ? data.conditionExpression : undefined);\n const linkName = data.eventDefinition?.linkName ?? (typeof data.linkName === \"string\" ? data.linkName : undefined);\n\n if (timer) normalized.timer = timer;\n if (messageRef) normalized.messageRef = messageRef;\n if (signalRef) normalized.signalRef = signalRef;\n if (errorRef) normalized.errorRef = errorRef;\n if (escalationRef) normalized.escalationRef = escalationRef;\n if (conditionExpression) normalized.conditionExpression = conditionExpression;\n if (linkName) normalized.linkName = linkName;\n\n return normalized;\n}\n\nfunction parseVariableType(type: string | undefined): string {\n switch (type) {\n case \"integer\":\n return \"xsd:int\";\n case \"boolean\":\n return \"xsd:boolean\";\n case \"date\":\n return \"xsd:dateTime\";\n case \"object\":\n return \"xsd:anyType\";\n case \"array\":\n return \"xsd:anyType\";\n default:\n return \"xsd:string\";\n }\n}\n\nfunction buildGlobalDefinitions(moddle: BpmnModdle, definitionsSet?: BpmnDefinitionsSet): ModdleElement[] {\n if (!definitionsSet) return [];\n const rootElements: ModdleElement[] = [];\n\n for (const message of definitionsSet.messages ?? []) {\n rootElements.push(moddle.create(\"bpmn:Message\", { id: message.id, name: message.name }));\n }\n for (const signal of definitionsSet.signals ?? []) {\n rootElements.push(moddle.create(\"bpmn:Signal\", { id: signal.id, name: signal.name }));\n }\n for (const error of definitionsSet.errors ?? []) {\n rootElements.push(moddle.create(\"bpmn:Error\", {\n id: error.id,\n name: error.name,\n ...(error.errorCode ? { errorCode: error.errorCode } : {}),\n }));\n }\n for (const escalation of definitionsSet.escalations ?? []) {\n rootElements.push(moddle.create(\"bpmn:Escalation\", {\n id: escalation.id,\n name: escalation.name,\n ...(escalation.escalationCode ? { escalationCode: escalation.escalationCode } : {}),\n }));\n }\n\n return rootElements;\n}\n\nfunction buildItemDefinitions(moddle: BpmnModdle, variables?: BpmnProcessVariable[]): ModdleElement[] {\n return (variables ?? []).map((variable) =>\n moddle.create(\"bpmn:ItemDefinition\", {\n id: `${variable.id}_item`,\n itemKind: \"Information\",\n structureRef: parseVariableType(variable.type),\n }),\n );\n}\n\nfunction buildEventDefinitions(\n moddle: BpmnModdle,\n node: BpmnRFNode,\n eventDefinition: BpmnEventDefinition,\n): ModdleElement[] {\n if (eventDefinition.type === \"multiple\" || eventDefinition.type === \"parallelMultiple\") {\n return [];\n }\n const defType = TRIGGER_TO_EVENT_DEF[eventDefinition.type];\n if (!defType) return [];\n\n const attrs: Record<string, unknown> = { id: uid(\"EventDef\", node.id) };\n\n if (eventDefinition.messageRef) attrs.messageRef = { id: eventDefinition.messageRef };\n if (eventDefinition.signalRef) attrs.signalRef = { id: eventDefinition.signalRef };\n if (eventDefinition.errorRef) attrs.errorRef = { id: eventDefinition.errorRef };\n if (eventDefinition.escalationRef) attrs.escalationRef = { id: eventDefinition.escalationRef };\n if (eventDefinition.conditionExpression) {\n attrs.condition = moddle.create(\"bpmn:FormalExpression\", {\n body: eventDefinition.conditionExpression,\n });\n }\n if (eventDefinition.timer?.value) {\n attrs[eventDefinition.timer.kind === \"date\"\n ? \"timeDate\"\n : eventDefinition.timer.kind === \"cycle\"\n ? \"timeCycle\"\n : \"timeDuration\"] = moddle.create(\"bpmn:FormalExpression\", {\n body: eventDefinition.timer.value,\n });\n }\n\n return [moddle.create(defType, attrs)];\n}\n\n// ─── AranzaFlows extensionElements builder ────────────────────────────────────\n\nfunction buildAranzaExtensionElements(\n moddle: BpmnModdle,\n node: BpmnRFNode,\n): ModdleElement | null {\n const { priority, owner, sla } = node.data;\n const connector = typeof node.data.connector === \"string\" ? node.data.connector : undefined;\n const action = typeof node.data.action === \"string\" ? node.data.action : undefined;\n const flowableType = typeof node.data.flowableType === \"string\" ? node.data.flowableType : undefined;\n const flowableDelegateExpression =\n typeof node.data.flowableDelegateExpression === \"string\"\n ? node.data.flowableDelegateExpression\n : undefined;\n const decisionRef = typeof node.data.decisionRef === \"string\" ? node.data.decisionRef : undefined;\n const formKey = typeof node.data.formKey === \"string\" ? node.data.formKey : undefined;\n const candidateUsers = typeof node.data.candidateUsers === \"string\" ? node.data.candidateUsers : undefined;\n const candidateGroups = typeof node.data.candidateGroups === \"string\" ? node.data.candidateGroups : undefined;\n\n if (!priority && !owner && !sla && !connector && !action && !flowableType && !flowableDelegateExpression && !decisionRef && !formKey && !candidateUsers && !candidateGroups) {\n return null;\n }\n\n const configAttrs: Record<string, string> = {};\n if (priority) configAttrs.priority = priority;\n if (owner) configAttrs.owner = owner;\n if (sla) configAttrs.sla = sla;\n if (connector) configAttrs.connector = connector;\n if (action) configAttrs.action = action;\n if (flowableType) configAttrs.flowableType = flowableType;\n if (flowableDelegateExpression) configAttrs.flowableDelegateExpression = flowableDelegateExpression;\n if (decisionRef) configAttrs.decisionRef = decisionRef;\n if (formKey) configAttrs.formKey = formKey;\n if (candidateUsers) configAttrs.candidateUsers = candidateUsers;\n if (candidateGroups) configAttrs.candidateGroups = candidateGroups;\n\n const taskConfig = moddle.create(\"aranza:TaskConfig\", configAttrs);\n return moddle.create(\"bpmn:ExtensionElements\", { values: [taskConfig] });\n}\n\n// ─── Build BPMN semantic model ────────────────────────────────────────────────\n\nfunction buildSemanticModel(\n moddle: BpmnModdle,\n nodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n opts: BpmnExportOptions,\n): ModdleElement {\n const defId = opts.id ?? \"Definitions_1\";\n const defName = opts.name;\n\n // Collect pool nodes → Collaboration + Participants\n const poolNodes = asNodes(nodes, [\"Pool\"]);\n const laneNodes = asNodes(nodes, [\"Lane\"]);\n const isCollaboration = poolNodes.length > 0;\n\n const definitions = moddle.create(\"bpmn:Definitions\", {\n id: defId,\n targetNamespace: \"http://bpmn.io/schema/bpmn\",\n ...(defName ? { name: defName } : {}),\n });\n // Flowable namespace: bpmn-moddle serializes xmlns:* from the element's own namespace map.\n // Injected via the moddle descriptor when a full Flowable extension is loaded.\n // For now, individual elements declare their own flowable:* attributes via $attrs.\n\n const rootElements: ModdleElement[] = [\n ...buildGlobalDefinitions(moddle, opts.process?.definitions),\n ];\n const itemDefinitions = buildItemDefinitions(moddle, opts.process?.definitions?.variables);\n if (itemDefinitions.length > 0) {\n (definitions as Record<string, unknown>).itemDefinitions = itemDefinitions;\n }\n\n if (isCollaboration) {\n const participants: ModdleElement[] = [];\n const processes: ModdleElement[] = [];\n\n for (const pool of poolNodes) {\n const processId = `Process_${pool.id}`;\n const process = buildProcess(moddle, nodes, edges, pool.id, laneNodes, processId, opts);\n processes.push(process);\n\n const participant = moddle.create(\"bpmn:Participant\", {\n id: pool.id,\n name: pool.data.label ?? \"\",\n processRef: process,\n });\n participants.push(participant);\n }\n\n // Message flows and conversation links belong to collaboration\n const messageFlowEdges = edges.filter((e) => e.data?.edgeType === \"messageFlow\");\n const conversationLinkEdges = edges.filter((e) => e.data?.edgeType === \"conversationLink\");\n\n const messageFlows = messageFlowEdges.map((e) =>\n moddle.create(\"bpmn:MessageFlow\", {\n id: e.id,\n name: e.data?.label ?? \"\",\n sourceRef: { id: e.source },\n targetRef: { id: e.target },\n }),\n );\n\n const conversationLinks = conversationLinkEdges.map((e) =>\n moddle.create(\"bpmn:ConversationLink\", {\n id: e.id,\n sourceRef: { id: e.source },\n targetRef: { id: e.target },\n }),\n );\n\n const collaboration = moddle.create(\"bpmn:Collaboration\", {\n id: `Collaboration_${defId}`,\n participants,\n messageFlows,\n conversationLinks,\n });\n\n rootElements.push(collaboration, ...processes);\n } else {\n // Single process — no collaboration\n const process = buildProcess(\n moddle,\n nodes,\n edges,\n undefined,\n laneNodes,\n opts.process?.processId ?? \"Process_1\",\n opts,\n );\n rootElements.push(process);\n }\n\n (definitions as Record<string, unknown>).rootElements = rootElements;\n return definitions;\n}\n\n// Build a bpmn:Process element containing flow nodes and sequence flows\nfunction buildProcess(\n moddle: BpmnModdle,\n allNodes: BpmnRFNode[],\n allEdges: BpmnRFEdge[],\n poolId: string | undefined,\n laneNodes: BpmnRFNode[],\n processId: string,\n opts: BpmnExportOptions,\n): ModdleElement {\n // Collect flow nodes that belong to this pool (or all if no pools)\n const subProcessIds = new Set(\n allNodes\n .filter((n) =>\n n.data.elementType === \"SubProcess\" ||\n n.data.elementType === \"Transaction\" ||\n n.data.elementType === \"EventSubProcess\" ||\n n.data.elementType === \"AdHocSubProcess\",\n )\n .map((n) => n.id),\n );\n const isInsideSubProcess = (node: BpmnRFNode) => {\n let parentId = node.parentId;\n while (parentId) {\n if (subProcessIds.has(parentId)) return true;\n parentId = allNodes.find((candidate) => candidate.id === parentId)?.parentId;\n }\n return false;\n };\n\n const belongsToPool = (node: BpmnRFNode): boolean => {\n let parentId = node.parentId;\n while (parentId) {\n if (parentId === poolId) return true;\n parentId = allNodes.find((candidate) => candidate.id === parentId)?.parentId;\n }\n return false;\n };\n\n const myNodes = (poolId\n ? allNodes.filter((n) => belongsToPool(n))\n : allNodes.filter((n) => n.data.elementType !== \"Pool\" && n.data.elementType !== \"Lane\"))\n .filter((n) => !isInsideSubProcess(n));\n\n const myLanes = laneNodes.filter((l) => (poolId ? l.parentId === poolId : true));\n\n // Build flow elements\n const flowElements: ModdleElement[] = [];\n\n for (const node of myNodes) {\n const el = buildFlowElement(moddle, node, allNodes, allEdges);\n if (el) flowElements.push(el);\n }\n\n // Sequence flows and associations\n const myNodeIds = new Set(myNodes.map((n) => n.id));\n const myEdges = allEdges.filter(\n (e) =>\n (e.data?.edgeType === \"sequenceFlow\" ||\n e.data?.edgeType === \"association\" ||\n e.data?.edgeType === \"dataAssociation\") &&\n myNodeIds.has(e.source) &&\n myNodeIds.has(e.target),\n );\n\n for (const edge of myEdges) {\n const edgeMeta = buildEdgeElement(moddle, edge);\n if (edgeMeta) flowElements.push(edgeMeta);\n }\n\n const elementById = new Map(\n flowElements\n .filter((element) => typeof element.id === \"string\")\n .map((element) => [element.id as string, element]),\n );\n for (const edge of myEdges) {\n if (!edge.data?.isDefault) continue;\n const sourceElement = elementById.get(edge.source);\n const edgeElement = elementById.get(edge.id);\n if (sourceElement && edgeElement) {\n (sourceElement as Record<string, unknown>).default = edgeElement;\n }\n }\n\n const process = moddle.create(\"bpmn:Process\", {\n id: processId,\n isExecutable: opts.process?.executable ?? true,\n flowElements,\n });\n\n if (opts.process?.documentation) {\n (process as Record<string, unknown>).documentation = [\n moddle.create(\"bpmn:Documentation\", { text: opts.process.documentation }),\n ];\n }\n\n // Lane set\n if (myLanes.length > 0) {\n const laneElements = myLanes.map((l) =>\n moddle.create(\"bpmn:Lane\", {\n id: l.id,\n name: l.data.label ?? \"\",\n flowNodeRef: myNodes\n .filter((n) => n.parentId === l.id)\n .map((n) => ({ id: n.id })),\n }),\n );\n (process as Record<string, unknown>).laneSet = moddle.create(\"bpmn:LaneSet\", {\n id: `LaneSet_${processId}`,\n lanes: laneElements,\n });\n }\n\n return process;\n}\n\nfunction buildFlowElement(\n moddle: BpmnModdle,\n node: BpmnRFNode,\n allNodes: BpmnRFNode[],\n allEdges: BpmnRFEdge[],\n): ModdleElement | null {\n const { elementType, label } = node.data;\n const eventDefinition = normalizeEventDefinition(node.data);\n\n // Pools and Lanes are handled in buildProcess / collaboration\n if (elementType === \"Pool\" || elementType === \"Lane\") return null;\n\n const moddleType = ELEMENT_TYPE_TO_MODDLE[elementType];\n if (!moddleType) return null;\n\n const attrs: Record<string, unknown> = {\n id: node.id,\n name: label ?? \"\",\n };\n\n if (node.data.documentation) {\n attrs.documentation = [\n moddle.create(\"bpmn:Documentation\", { text: node.data.documentation }),\n ];\n }\n\n // Event definitions\n if (eventDefinition) {\n const eventDefinitions = buildEventDefinitions(moddle, node, eventDefinition);\n if (eventDefinitions.length > 0) attrs.eventDefinitions = eventDefinitions;\n if (eventDefinition.linkName) attrs.name = eventDefinition.linkName;\n }\n\n if (elementType === \"BoundaryEvent\") {\n attrs.attachedToRef = { id: node.data.attachedToRef ?? node.parentId };\n const interrupting = node.data.cancelActivity ?? !node.data.isNonInterrupting;\n attrs.cancelActivity = interrupting;\n }\n\n if (elementType === \"CallActivity\" && node.data.calledElement) {\n attrs.calledElement = node.data.calledElement;\n }\n\n if (elementType === \"ScriptTask\") {\n const scriptFormat = typeof node.data.scriptFormat === \"string\" ? node.data.scriptFormat : undefined;\n const script = typeof node.data.script === \"string\" ? node.data.script : undefined;\n if (scriptFormat) attrs.scriptFormat = scriptFormat;\n if (script) attrs.script = script;\n }\n\n // UserTask: emit Flowable assignment + formKey as native attributes.\n if (elementType === \"UserTask\") {\n const flowableAttrs: Record<string, string> = {};\n const fk = typeof node.data.formKey === \"string\" ? node.data.formKey : undefined;\n const cu = typeof node.data.candidateUsers === \"string\" ? node.data.candidateUsers : undefined;\n const cg = typeof node.data.candidateGroups === \"string\" ? node.data.candidateGroups : undefined;\n if (fk) flowableAttrs[\"flowable:formKey\"] = fk;\n if (cu) flowableAttrs[\"flowable:candidateUsers\"] = cu;\n if (cg) flowableAttrs[\"flowable:candidateGroups\"] = cg;\n if (Object.keys(flowableAttrs).length > 0) attrs.$attrs = flowableAttrs;\n }\n\n // Flowable execution attributes on ServiceTask — emitted as namespace-prefixed\n // XML attributes (bpmn-moddle passes $attrs through to the serialized output).\n if (elementType === \"ServiceTask\") {\n const flowableAttrs: Record<string, string> = {};\n const flowableType = typeof node.data.flowableType === \"string\" ? node.data.flowableType : undefined;\n const flowableDelegateExpression =\n typeof node.data.flowableDelegateExpression === \"string\"\n ? node.data.flowableDelegateExpression\n : undefined;\n const connector = typeof node.data.connector === \"string\" ? node.data.connector : undefined;\n // Connector tasks use an HTTP-type delegate that reads aranza:TaskConfig at runtime\n if (connector) flowableAttrs[\"flowable:type\"] = \"http\";\n if (flowableType) flowableAttrs[\"flowable:type\"] = flowableType;\n if (flowableDelegateExpression) {\n flowableAttrs[\"flowable:delegateExpression\"] = flowableDelegateExpression;\n }\n if (Object.keys(flowableAttrs).length > 0) attrs.$attrs = flowableAttrs;\n }\n\n const aranzaConfig = buildAranzaExtensionElements(moddle, node);\n if (aranzaConfig) attrs.extensionElements = aranzaConfig;\n\n const isSubProcess =\n elementType === \"SubProcess\" ||\n elementType === \"Transaction\" ||\n elementType === \"EventSubProcess\" ||\n elementType === \"AdHocSubProcess\";\n\n if (isSubProcess) {\n attrs.flowElements = buildNestedFlowElements(moddle, node, allNodes, allEdges);\n if (elementType === \"EventSubProcess\" || node.data.subProcessVariant === \"event\") {\n attrs.triggeredByEvent = true;\n }\n if (elementType === \"AdHocSubProcess\" && typeof node.data.completionCondition === \"string\" && node.data.completionCondition.trim()) {\n attrs.completionCondition = moddle.create(\"bpmn:FormalExpression\", {\n body: node.data.completionCondition.trim(),\n });\n }\n }\n\n const element = moddle.create(moddleType, attrs);\n\n return element;\n}\n\nfunction buildNestedFlowElements(\n moddle: BpmnModdle,\n parent: BpmnRFNode,\n allNodes: BpmnRFNode[],\n allEdges: BpmnRFEdge[],\n): ModdleElement[] {\n const childNodes = allNodes.filter((node) => node.parentId === parent.id);\n const childNodeIds = new Set(childNodes.map((node) => node.id));\n const flowElements: ModdleElement[] = [];\n\n for (const child of childNodes) {\n const element = buildFlowElement(moddle, child, allNodes, allEdges);\n if (element) flowElements.push(element);\n }\n\n for (const edge of allEdges) {\n if (!childNodeIds.has(edge.source) || !childNodeIds.has(edge.target)) continue;\n const element = buildEdgeElement(moddle, edge);\n if (element) flowElements.push(element);\n }\n\n return flowElements;\n}\n\nfunction buildEdgeElement(moddle: BpmnModdle, edge: BpmnRFEdge): ModdleElement | null {\n if (!edge.data) return null;\n const moddleType = EDGE_TYPE_TO_MODDLE[edge.data.edgeType];\n if (!moddleType) return null;\n\n const attrs: Record<string, unknown> = {\n id: edge.id,\n name: edge.data.label ?? \"\",\n sourceRef: { id: edge.source },\n targetRef: { id: edge.target },\n };\n\n if (edge.data.documentation) {\n attrs.documentation = [\n moddle.create(\"bpmn:Documentation\", { text: edge.data.documentation }),\n ];\n }\n\n if (edge.data.conditionExpression) {\n attrs.conditionExpression = moddle.create(\"bpmn:FormalExpression\", {\n body: edge.data.conditionExpression,\n });\n }\n\n return moddle.create(moddleType, attrs);\n}\n\n// ─── Build BPMNDI (diagram interchange / layout) ─────────────────────────────\n\nfunction buildBpmnDI(\n moddle: BpmnModdle,\n definitions: ModdleElement,\n nodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n): void {\n const shapes: ModdleElement[] = [];\n const edgeShapes: ModdleElement[] = [];\n\n const absolutePositionById = buildAbsolutePositionMap(nodes);\n\n for (const node of nodes) {\n const meta = BPMN_ELEMENT_CATALOG[node.data.elementType];\n const w = node.width ?? meta?.defaultWidth ?? 120;\n const h = node.height ?? meta?.defaultHeight ?? 60;\n\n const bounds = moddle.create(\"dc:Bounds\", {\n x: absolutePositionById.get(node.id)?.x ?? node.position.x,\n y: absolutePositionById.get(node.id)?.y ?? node.position.y,\n width: w,\n height: h,\n });\n\n const shape = moddle.create(\"bpmndi:BPMNShape\", {\n id: uid(\"BPMNShape\", node.id),\n bpmnElement: { id: node.id },\n bounds,\n });\n\n if (node.data.isExpanded !== undefined) {\n (shape as Record<string, unknown>).isExpanded = node.data.isExpanded;\n }\n\n shapes.push(shape);\n }\n\n for (const edge of edges) {\n const waypoints = resolveEdgeWaypoints(edge, nodes, absolutePositionById).map((p) =>\n moddle.create(\"dc:Point\", { x: p.x, y: p.y }),\n );\n\n edgeShapes.push(\n moddle.create(\"bpmndi:BPMNEdge\", {\n id: uid(\"BPMNEdge\", edge.id),\n bpmnElement: { id: edge.id },\n waypoint: waypoints,\n }),\n );\n }\n\n // Find the main process / collaboration element\n const rootEls = (definitions as Record<string, unknown>).rootElements as ModdleElement[] | undefined;\n const planeElement = rootEls?.[0];\n\n const plane = moddle.create(\"bpmndi:BPMNPlane\", {\n id: \"BPMNPlane_1\",\n bpmnElement: planeElement ?? { id: \"unknown\" },\n planeElement: [...shapes, ...edgeShapes],\n });\n\n const diagram = moddle.create(\"bpmndi:BPMNDiagram\", {\n id: \"BPMNDiagram_1\",\n plane,\n });\n\n (definitions as Record<string, unknown>).diagrams = [diagram];\n}\n\nfunction resolveEdgeWaypoints(\n edge: BpmnRFEdge,\n nodes: BpmnRFNode[],\n absolutePositionById: Map<string, { x: number; y: number }>,\n): Array<{ x: number; y: number }> {\n if (edge.data?.routingPoints && edge.data.routingPoints.length >= 2) {\n return edge.data.routingPoints;\n }\n\n const source = nodes.find((node) => node.id === edge.source);\n const target = nodes.find((node) => node.id === edge.target);\n if (!source || !target) return [];\n\n const sourceMeta = BPMN_ELEMENT_CATALOG[source.data.elementType];\n const targetMeta = BPMN_ELEMENT_CATALOG[target.data.elementType];\n const sourcePosition = absolutePositionById.get(source.id) ?? source.position;\n const targetPosition = absolutePositionById.get(target.id) ?? target.position;\n return [\n {\n x: sourcePosition.x + (source.width ?? sourceMeta.defaultWidth) / 2,\n y: sourcePosition.y + (source.height ?? sourceMeta.defaultHeight) / 2,\n },\n {\n x: targetPosition.x + (target.width ?? targetMeta.defaultWidth) / 2,\n y: targetPosition.y + (target.height ?? targetMeta.defaultHeight) / 2,\n },\n ];\n}\n\nfunction buildAbsolutePositionMap(nodes: BpmnRFNode[]): Map<string, { x: number; y: number }> {\n const nodeById = new Map(nodes.map((node) => [node.id, node]));\n const absoluteById = new Map<string, { x: number; y: number }>();\n\n function resolve(node: BpmnRFNode): { x: number; y: number } {\n const cached = absoluteById.get(node.id);\n if (cached) return cached;\n\n const parent = node.parentId ? nodeById.get(node.parentId) : undefined;\n const parentPosition = parent ? resolve(parent) : { x: 0, y: 0 };\n const absolute = {\n x: parentPosition.x + node.position.x,\n y: parentPosition.y + node.position.y,\n };\n absoluteById.set(node.id, absolute);\n return absolute;\n }\n\n for (const node of nodes) resolve(node);\n return absoluteById;\n}\n\n// ─── Public: serializeBpmnXml ─────────────────────────────────────────────────\n\n/**\n * Serialize a ReactFlow BPMN graph to a BPMN 2.0 XML string.\n *\n * @param nodes - ReactFlow nodes carrying {@link BpmnNodeData}.\n * @param edges - ReactFlow edges carrying {@link BpmnEdgeData}.\n * @param opts - Optional export options (process id/name, formatting, variables).\n * @returns Formatted BPMN 2.0 XML string.\n */\nexport async function serializeBpmnXml(\n nodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n opts: BpmnExportOptions = {},\n): Promise<string> {\n const { BpmnModdle } = await import(\"bpmn-moddle\");\n const moddle = new BpmnModdle({ aranza: ARANZA_DESCRIPTOR });\n\n const definitions = buildSemanticModel(moddle, nodes, edges, opts);\n buildBpmnDI(moddle, definitions, nodes, edges);\n\n const { xml } = await moddle.toXML(definitions, {\n format: opts.format ?? true,\n });\n\n return xml;\n}\n"]}
@@ -1,6 +1,6 @@
1
- export { B as BPMN_ELEMENT_CATALOG, a as BPMN_RESIZABLE_ELEMENT_TYPES, g as getBpmnElementSize, b as getElementMeta, i as isBpmnElementResizable } from '../catalog-CjGdTFxc.cjs';
2
- import { f as BpmnElementType, k as BpmnHandlePolicy, n as BpmnOrientation } from '../types-wFn_tJLY.cjs';
3
- export { B as BpmnCategory, a as BpmnDefinitionsSet, b as BpmnEdgeData, c as BpmnEdgeType, d as BpmnElementMeta, e as BpmnElementSize, g as BpmnErrorDefinition, h as BpmnEscalationDefinition, i as BpmnEventDefinition, j as BpmnEventSemantics, l as BpmnMessageDefinition, m as BpmnNodeData, o as BpmnProcessVariable, p as BpmnSignalDefinition, q as BpmnTimerDefinition, r as BpmnTimerKind, E as EventTrigger, S as SubProcessVariant, T as TaskMarker } from '../types-wFn_tJLY.cjs';
1
+ export { B as BPMN_ELEMENT_CATALOG, a as BPMN_RESIZABLE_ELEMENT_TYPES, g as getBpmnElementSize, b as getElementMeta, i as isBpmnElementResizable } from '../catalog-Ch3YT0-0.cjs';
2
+ import { f as BpmnElementType, k as BpmnHandlePolicy, n as BpmnOrientation } from '../types-BTuiBv7p.cjs';
3
+ export { B as BpmnCategory, a as BpmnDefinitionsSet, b as BpmnEdgeData, c as BpmnEdgeType, d as BpmnElementMeta, e as BpmnElementSize, g as BpmnErrorDefinition, h as BpmnEscalationDefinition, i as BpmnEventDefinition, j as BpmnEventSemantics, l as BpmnMessageDefinition, m as BpmnNodeData, o as BpmnProcessVariable, p as BpmnSignalDefinition, q as BpmnTimerDefinition, r as BpmnTimerKind, E as EventTrigger, S as SubProcessVariant, T as TaskMarker } from '../types-BTuiBv7p.cjs';
4
4
 
5
5
  declare function isTaskType(type: BpmnElementType): boolean;
6
6
  declare function isGatewayType(type: BpmnElementType): boolean;
@@ -1,6 +1,6 @@
1
- export { B as BPMN_ELEMENT_CATALOG, a as BPMN_RESIZABLE_ELEMENT_TYPES, g as getBpmnElementSize, b as getElementMeta, i as isBpmnElementResizable } from '../catalog-DW0Hknp2.js';
2
- import { f as BpmnElementType, k as BpmnHandlePolicy, n as BpmnOrientation } from '../types-wFn_tJLY.js';
3
- export { B as BpmnCategory, a as BpmnDefinitionsSet, b as BpmnEdgeData, c as BpmnEdgeType, d as BpmnElementMeta, e as BpmnElementSize, g as BpmnErrorDefinition, h as BpmnEscalationDefinition, i as BpmnEventDefinition, j as BpmnEventSemantics, l as BpmnMessageDefinition, m as BpmnNodeData, o as BpmnProcessVariable, p as BpmnSignalDefinition, q as BpmnTimerDefinition, r as BpmnTimerKind, E as EventTrigger, S as SubProcessVariant, T as TaskMarker } from '../types-wFn_tJLY.js';
1
+ export { B as BPMN_ELEMENT_CATALOG, a as BPMN_RESIZABLE_ELEMENT_TYPES, g as getBpmnElementSize, b as getElementMeta, i as isBpmnElementResizable } from '../catalog-BOwJOaXV.js';
2
+ import { f as BpmnElementType, k as BpmnHandlePolicy, n as BpmnOrientation } from '../types-BTuiBv7p.js';
3
+ export { B as BpmnCategory, a as BpmnDefinitionsSet, b as BpmnEdgeData, c as BpmnEdgeType, d as BpmnElementMeta, e as BpmnElementSize, g as BpmnErrorDefinition, h as BpmnEscalationDefinition, i as BpmnEventDefinition, j as BpmnEventSemantics, l as BpmnMessageDefinition, m as BpmnNodeData, o as BpmnProcessVariable, p as BpmnSignalDefinition, q as BpmnTimerDefinition, r as BpmnTimerKind, E as EventTrigger, S as SubProcessVariant, T as TaskMarker } from '../types-BTuiBv7p.js';
4
4
 
5
5
  declare function isTaskType(type: BpmnElementType): boolean;
6
6
  declare function isGatewayType(type: BpmnElementType): boolean;
package/dist/index.cjs CHANGED
@@ -2515,7 +2515,10 @@ var ARANZA_DESCRIPTOR = {
2515
2515
  // BusinessRuleTask: reference to a DMN decision table id
2516
2516
  { name: "decisionRef", isAttr: true, type: "String" },
2517
2517
  // UserTask: form key resolved to a FormDefinition name at runtime
2518
- { name: "formKey", isAttr: true, type: "String" }
2518
+ { name: "formKey", isAttr: true, type: "String" },
2519
+ // UserTask: Flowable task assignment — comma-separated ids
2520
+ { name: "candidateUsers", isAttr: true, type: "String" },
2521
+ { name: "candidateGroups", isAttr: true, type: "String" }
2519
2522
  ]
2520
2523
  }
2521
2524
  ],
@@ -2799,6 +2802,10 @@ function extractAranzaExtensions(el) {
2799
2802
  if (fde) result.flowableDelegateExpression = fde;
2800
2803
  const fk = asString(elAttrs["flowable:formKey"]);
2801
2804
  if (fk) result.formKey = fk;
2805
+ const cu = asString(elAttrs["flowable:candidateUsers"]);
2806
+ if (cu) result.candidateUsers = cu;
2807
+ const cg = asString(elAttrs["flowable:candidateGroups"]);
2808
+ if (cg) result.candidateGroups = cg;
2802
2809
  }
2803
2810
  const ext = el.extensionElements;
2804
2811
  if (!ext) return result;
@@ -2824,6 +2831,10 @@ function extractAranzaExtensions(el) {
2824
2831
  if (decisionRef) result.decisionRef = decisionRef;
2825
2832
  const formKey = asString(taskConfig.formKey);
2826
2833
  if (formKey) result.formKey = formKey;
2834
+ const candidateUsers = asString(taskConfig.candidateUsers);
2835
+ if (candidateUsers) result.candidateUsers = candidateUsers;
2836
+ const candidateGroups = asString(taskConfig.candidateGroups);
2837
+ if (candidateGroups) result.candidateGroups = candidateGroups;
2827
2838
  return result;
2828
2839
  }
2829
2840
  function extractCompletionCondition(el) {
@@ -3193,7 +3204,9 @@ function buildAranzaExtensionElements(moddle, node) {
3193
3204
  const flowableDelegateExpression = typeof node.data.flowableDelegateExpression === "string" ? node.data.flowableDelegateExpression : void 0;
3194
3205
  const decisionRef = typeof node.data.decisionRef === "string" ? node.data.decisionRef : void 0;
3195
3206
  const formKey = typeof node.data.formKey === "string" ? node.data.formKey : void 0;
3196
- if (!priority && !owner && !sla && !connector && !action && !flowableType && !flowableDelegateExpression && !decisionRef && !formKey) {
3207
+ const candidateUsers = typeof node.data.candidateUsers === "string" ? node.data.candidateUsers : void 0;
3208
+ const candidateGroups = typeof node.data.candidateGroups === "string" ? node.data.candidateGroups : void 0;
3209
+ if (!priority && !owner && !sla && !connector && !action && !flowableType && !flowableDelegateExpression && !decisionRef && !formKey && !candidateUsers && !candidateGroups) {
3197
3210
  return null;
3198
3211
  }
3199
3212
  const configAttrs = {};
@@ -3206,6 +3219,8 @@ function buildAranzaExtensionElements(moddle, node) {
3206
3219
  if (flowableDelegateExpression) configAttrs.flowableDelegateExpression = flowableDelegateExpression;
3207
3220
  if (decisionRef) configAttrs.decisionRef = decisionRef;
3208
3221
  if (formKey) configAttrs.formKey = formKey;
3222
+ if (candidateUsers) configAttrs.candidateUsers = candidateUsers;
3223
+ if (candidateGroups) configAttrs.candidateGroups = candidateGroups;
3209
3224
  const taskConfig = moddle.create("aranza:TaskConfig", configAttrs);
3210
3225
  return moddle.create("bpmn:ExtensionElements", { values: [taskConfig] });
3211
3226
  }
@@ -3388,8 +3403,14 @@ function buildFlowElement(moddle, node, allNodes, allEdges) {
3388
3403
  if (script) attrs.script = script;
3389
3404
  }
3390
3405
  if (elementType === "UserTask") {
3406
+ const flowableAttrs = {};
3391
3407
  const fk = typeof node.data.formKey === "string" ? node.data.formKey : void 0;
3392
- if (fk) attrs.$attrs = { "flowable:formKey": fk };
3408
+ const cu = typeof node.data.candidateUsers === "string" ? node.data.candidateUsers : void 0;
3409
+ const cg = typeof node.data.candidateGroups === "string" ? node.data.candidateGroups : void 0;
3410
+ if (fk) flowableAttrs["flowable:formKey"] = fk;
3411
+ if (cu) flowableAttrs["flowable:candidateUsers"] = cu;
3412
+ if (cg) flowableAttrs["flowable:candidateGroups"] = cg;
3413
+ if (Object.keys(flowableAttrs).length > 0) attrs.$attrs = flowableAttrs;
3393
3414
  }
3394
3415
  if (elementType === "ServiceTask") {
3395
3416
  const flowableAttrs = {};
@@ -4033,6 +4054,130 @@ function isCompleted(state) {
4033
4054
  function setVariable(state, key, value) {
4034
4055
  return { ...state, variables: { ...state.variables, [key]: value } };
4035
4056
  }
4057
+
4058
+ // src/simulation/batch.ts
4059
+ function weightedChoice(edgeIds, weights) {
4060
+ if (edgeIds.length === 0) return "";
4061
+ const w = edgeIds.map((id) => Math.max(0, weights[id] ?? 1));
4062
+ const total = w.reduce((a, b) => a + b, 0);
4063
+ if (total === 0) return edgeIds[0];
4064
+ let r = Math.random() * total;
4065
+ for (let i = 0; i < edgeIds.length; i++) {
4066
+ r -= w[i];
4067
+ if (r <= 0) return edgeIds[i];
4068
+ }
4069
+ return edgeIds[edgeIds.length - 1];
4070
+ }
4071
+ function buildBatchDiagram(diagram, gatewayWeights, gwVarMap) {
4072
+ const patchedEdges = diagram.edges.map((edge) => {
4073
+ const gwId = edge.source;
4074
+ if (!(gwId in gatewayWeights) || edge.type !== "sequenceFlow") return edge;
4075
+ const varName = gwVarMap[gwId];
4076
+ const outEdges = diagram.edges.filter(
4077
+ (e) => e.source === gwId && e.type === "sequenceFlow"
4078
+ );
4079
+ const idx = outEdges.findIndex((e) => e.id === edge.id);
4080
+ if (idx === -1) return edge;
4081
+ return {
4082
+ ...edge,
4083
+ conditionExpression: `\${${varName} == ${idx}}`,
4084
+ isDefault: false
4085
+ };
4086
+ });
4087
+ return { nodes: diagram.nodes, edges: patchedEdges };
4088
+ }
4089
+ function runOneInstance(diagram, initialVars, maxSteps) {
4090
+ let state = createSimulation(diagram, initialVars);
4091
+ state = tick(diagram, state);
4092
+ const visitedNodes = /* @__PURE__ */ new Set();
4093
+ const peakPerNode = {};
4094
+ function snapshot() {
4095
+ const counts = {};
4096
+ for (const token of state.tokens) {
4097
+ visitedNodes.add(token.elementId);
4098
+ counts[token.elementId] = (counts[token.elementId] ?? 0) + 1;
4099
+ }
4100
+ for (const [nodeId, c] of Object.entries(counts)) {
4101
+ if (c > (peakPerNode[nodeId] ?? 0)) peakPerNode[nodeId] = c;
4102
+ }
4103
+ }
4104
+ snapshot();
4105
+ let steps = 0;
4106
+ while (state.status === "running" && steps < maxSteps) {
4107
+ const fireable = getFireable(diagram, state);
4108
+ if (fireable.length === 0) break;
4109
+ for (const id of fireable) {
4110
+ if (state.status !== "running") break;
4111
+ state = fire(diagram, state, id);
4112
+ snapshot();
4113
+ }
4114
+ steps++;
4115
+ }
4116
+ for (const entry of state.log) {
4117
+ visitedNodes.add(entry.elementId);
4118
+ }
4119
+ return {
4120
+ visitedNodes,
4121
+ peakPerNode,
4122
+ steps: state.step,
4123
+ completed: state.status === "completed"
4124
+ };
4125
+ }
4126
+ function runBatchSimulation(diagram, config = {}) {
4127
+ const n = Math.max(1, config.instances ?? 100);
4128
+ const maxSteps = Math.max(1, config.maxSteps ?? 500);
4129
+ const gwWeights = config.gatewayWeights ?? {};
4130
+ const nodeDurations = config.nodeDurations ?? {};
4131
+ const gwVarMap = {};
4132
+ Object.keys(gwWeights).forEach((gwId, i) => {
4133
+ gwVarMap[gwId] = `__g${i}`;
4134
+ });
4135
+ const batchDiagram = Object.keys(gwWeights).length > 0 ? buildBatchDiagram(diagram, gwWeights, gwVarMap) : diagram;
4136
+ const nodeStats = {};
4137
+ function node(id) {
4138
+ if (!nodeStats[id]) {
4139
+ nodeStats[id] = { visits: 0, totalDurationMs: 0, peakConcurrency: 0 };
4140
+ }
4141
+ return nodeStats[id];
4142
+ }
4143
+ let completed = 0;
4144
+ let deadlocked = 0;
4145
+ let totalSteps = 0;
4146
+ for (let i = 0; i < n; i++) {
4147
+ const instanceVars = {};
4148
+ for (const [gwId, varName] of Object.entries(gwVarMap)) {
4149
+ const outEdges = diagram.edges.filter(
4150
+ (e) => e.source === gwId && e.type === "sequenceFlow"
4151
+ );
4152
+ const edgeIds = outEdges.map((e) => e.id);
4153
+ const chosen = weightedChoice(edgeIds, gwWeights[gwId]);
4154
+ instanceVars[varName] = outEdges.findIndex((e) => e.id === chosen);
4155
+ }
4156
+ const result = runOneInstance(batchDiagram, instanceVars, maxSteps);
4157
+ if (result.completed) {
4158
+ completed++;
4159
+ totalSteps += result.steps;
4160
+ } else {
4161
+ deadlocked++;
4162
+ }
4163
+ for (const nodeId of result.visitedNodes) {
4164
+ const s = node(nodeId);
4165
+ s.visits++;
4166
+ s.totalDurationMs += nodeDurations[nodeId] ?? 0;
4167
+ }
4168
+ for (const [nodeId, peak] of Object.entries(result.peakPerNode)) {
4169
+ const s = node(nodeId);
4170
+ if (peak > s.peakConcurrency) s.peakConcurrency = peak;
4171
+ }
4172
+ }
4173
+ return {
4174
+ nodeStats,
4175
+ completed,
4176
+ deadlocked,
4177
+ total: n,
4178
+ avgSteps: completed > 0 ? Math.round(totalSteps / completed) : 0
4179
+ };
4180
+ }
4036
4181
  function createBpmnNode(options) {
4037
4182
  const size = getBpmnElementSize(options.elementType);
4038
4183
  const meta = BPMN_ELEMENT_CATALOG[options.elementType];
@@ -4976,6 +5121,7 @@ exports.resizeBpmnNodeByHandleCommand = resizeBpmnNodeByHandleCommand;
4976
5121
  exports.resizeBpmnNodeCommand = resizeBpmnNodeCommand;
4977
5122
  exports.restoreBpmnHistory = restoreBpmnHistory;
4978
5123
  exports.routeBpmnEdgeCommand = routeBpmnEdgeCommand;
5124
+ exports.runBatchSimulation = runBatchSimulation;
4979
5125
  exports.runBpmnCommand = runBpmnCommand;
4980
5126
  exports.runBpmnCommands = runBpmnCommands;
4981
5127
  exports.selectBpmnElementsCommand = selectBpmnElementsCommand;