@bpmnkit/plugins 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/README.md +153 -0
  2. package/dist/ai-bridge/css.d.ts +2 -0
  3. package/dist/ai-bridge/css.js +366 -0
  4. package/dist/ai-bridge/index.d.ts +44 -0
  5. package/dist/ai-bridge/index.js +132 -0
  6. package/dist/ai-bridge/panel.d.ts +27 -0
  7. package/dist/ai-bridge/panel.js +715 -0
  8. package/dist/ascii-view/css.d.ts +4 -0
  9. package/dist/ascii-view/css.js +83 -0
  10. package/dist/ascii-view/index.d.ts +25 -0
  11. package/dist/ascii-view/index.js +92 -0
  12. package/dist/command-palette/css.d.ts +4 -0
  13. package/dist/command-palette/css.js +157 -0
  14. package/dist/command-palette/index.d.ts +53 -0
  15. package/dist/command-palette/index.js +378 -0
  16. package/dist/command-palette-editor/index.d.ts +35 -0
  17. package/dist/command-palette-editor/index.js +60 -0
  18. package/dist/config-panel/css.d.ts +4 -0
  19. package/dist/config-panel/css.js +719 -0
  20. package/dist/config-panel/index.d.ts +36 -0
  21. package/dist/config-panel/index.js +73 -0
  22. package/dist/config-panel/renderer.d.ts +127 -0
  23. package/dist/config-panel/renderer.js +1162 -0
  24. package/dist/config-panel/types.d.ts +118 -0
  25. package/dist/config-panel/types.js +2 -0
  26. package/dist/config-panel-bpmn/index.d.ts +58 -0
  27. package/dist/config-panel-bpmn/index.js +1320 -0
  28. package/dist/config-panel-bpmn/template-engine.d.ts +17 -0
  29. package/dist/config-panel-bpmn/template-engine.js +307 -0
  30. package/dist/config-panel-bpmn/template-to-service-task.d.ts +30 -0
  31. package/dist/config-panel-bpmn/template-to-service-task.js +92 -0
  32. package/dist/config-panel-bpmn/template-types.d.ts +126 -0
  33. package/dist/config-panel-bpmn/template-types.js +6 -0
  34. package/dist/config-panel-bpmn/templates/generated.d.ts +3 -0
  35. package/dist/config-panel-bpmn/templates/generated.js +57865 -0
  36. package/dist/config-panel-bpmn/util.d.ts +46 -0
  37. package/dist/config-panel-bpmn/util.js +195 -0
  38. package/dist/dmn-editor/css.d.ts +3 -0
  39. package/dist/dmn-editor/css.js +667 -0
  40. package/dist/dmn-editor/dmn-editor.d.ts +34 -0
  41. package/dist/dmn-editor/dmn-editor.js +646 -0
  42. package/dist/dmn-editor/drd-canvas.d.ts +85 -0
  43. package/dist/dmn-editor/drd-canvas.js +1087 -0
  44. package/dist/dmn-editor/index.d.ts +3 -0
  45. package/dist/dmn-editor/index.js +2 -0
  46. package/dist/dmn-viewer/css.d.ts +3 -0
  47. package/dist/dmn-viewer/css.js +151 -0
  48. package/dist/dmn-viewer/dmn-viewer.d.ts +30 -0
  49. package/dist/dmn-viewer/dmn-viewer.js +160 -0
  50. package/dist/dmn-viewer/feel.d.ts +3 -0
  51. package/dist/dmn-viewer/feel.js +2 -0
  52. package/dist/dmn-viewer/index.d.ts +14 -0
  53. package/dist/dmn-viewer/index.js +12 -0
  54. package/dist/element-docs/content.d.ts +20 -0
  55. package/dist/element-docs/content.js +1032 -0
  56. package/dist/element-docs/index.d.ts +7 -0
  57. package/dist/element-docs/index.js +643 -0
  58. package/dist/feel-playground/css.d.ts +4 -0
  59. package/dist/feel-playground/css.js +292 -0
  60. package/dist/feel-playground/index.d.ts +4 -0
  61. package/dist/feel-playground/index.js +3 -0
  62. package/dist/feel-playground/playground-plugin.d.ts +14 -0
  63. package/dist/feel-playground/playground-plugin.js +292 -0
  64. package/dist/form-editor/css.d.ts +3 -0
  65. package/dist/form-editor/css.js +703 -0
  66. package/dist/form-editor/form-editor.d.ts +48 -0
  67. package/dist/form-editor/form-editor.js +1039 -0
  68. package/dist/form-editor/index.d.ts +3 -0
  69. package/dist/form-editor/index.js +2 -0
  70. package/dist/form-viewer/css.d.ts +3 -0
  71. package/dist/form-viewer/css.js +303 -0
  72. package/dist/form-viewer/form-viewer.d.ts +29 -0
  73. package/dist/form-viewer/form-viewer.js +376 -0
  74. package/dist/form-viewer/index.d.ts +12 -0
  75. package/dist/form-viewer/index.js +11 -0
  76. package/dist/history/checkpoint.d.ts +10 -0
  77. package/dist/history/checkpoint.js +92 -0
  78. package/dist/history/css.d.ts +2 -0
  79. package/dist/history/css.js +130 -0
  80. package/dist/history/history-panel.d.ts +12 -0
  81. package/dist/history/history-panel.js +142 -0
  82. package/dist/history/index.d.ts +5 -0
  83. package/dist/history/index.js +3 -0
  84. package/dist/main-menu/css.d.ts +4 -0
  85. package/dist/main-menu/css.js +272 -0
  86. package/dist/main-menu/index.d.ts +59 -0
  87. package/dist/main-menu/index.js +285 -0
  88. package/dist/minimap/css.d.ts +10 -0
  89. package/dist/minimap/css.js +54 -0
  90. package/dist/minimap/index.d.ts +38 -0
  91. package/dist/minimap/index.js +69 -0
  92. package/dist/minimap/minimap.d.ts +35 -0
  93. package/dist/minimap/minimap.js +166 -0
  94. package/dist/optimize/index.d.ts +21 -0
  95. package/dist/optimize/index.js +304 -0
  96. package/dist/process-runner/css.d.ts +2 -0
  97. package/dist/process-runner/css.js +467 -0
  98. package/dist/process-runner/index.d.ts +56 -0
  99. package/dist/process-runner/index.js +549 -0
  100. package/dist/storage/auto-save.d.ts +11 -0
  101. package/dist/storage/auto-save.js +44 -0
  102. package/dist/storage/css.d.ts +2 -0
  103. package/dist/storage/css.js +2 -0
  104. package/dist/storage/db.d.ts +99 -0
  105. package/dist/storage/db.js +116 -0
  106. package/dist/storage/dialog.d.ts +15 -0
  107. package/dist/storage/dialog.js +201 -0
  108. package/dist/storage/export.d.ts +3 -0
  109. package/dist/storage/export.js +137 -0
  110. package/dist/storage/index.d.ts +44 -0
  111. package/dist/storage/index.js +201 -0
  112. package/dist/storage/sidebar.d.ts +2 -0
  113. package/dist/storage/sidebar.js +2 -0
  114. package/dist/storage/storage-api.d.ts +76 -0
  115. package/dist/storage/storage-api.js +342 -0
  116. package/dist/storage/types.d.ts +44 -0
  117. package/dist/storage/types.js +2 -0
  118. package/dist/storage-tabs-bridge/index.d.ts +96 -0
  119. package/dist/storage-tabs-bridge/index.js +502 -0
  120. package/dist/tabs/css.d.ts +3 -0
  121. package/dist/tabs/css.js +642 -0
  122. package/dist/tabs/file-resolver.d.ts +71 -0
  123. package/dist/tabs/file-resolver.js +46 -0
  124. package/dist/tabs/index.d.ts +15 -0
  125. package/dist/tabs/index.js +13 -0
  126. package/dist/tabs/tabs-plugin.d.ts +250 -0
  127. package/dist/tabs/tabs-plugin.js +1119 -0
  128. package/dist/token-highlight/css.d.ts +2 -0
  129. package/dist/token-highlight/css.js +81 -0
  130. package/dist/token-highlight/index.d.ts +44 -0
  131. package/dist/token-highlight/index.js +164 -0
  132. package/dist/watermark/css.d.ts +10 -0
  133. package/dist/watermark/css.js +54 -0
  134. package/dist/watermark/index.d.ts +48 -0
  135. package/dist/watermark/index.js +64 -0
  136. package/dist/zoom-controls/css.d.ts +4 -0
  137. package/dist/zoom-controls/css.js +48 -0
  138. package/dist/zoom-controls/index.d.ts +36 -0
  139. package/dist/zoom-controls/index.js +111 -0
  140. package/package.json +121 -0
@@ -0,0 +1,1032 @@
1
+ /** Map key: elementType, or elementType:eventDefinitionType for typed events. */
2
+ export const ENTRIES = {
3
+ // ── Start Events ────────────────────────────────────────────────────────────
4
+ startEvent: {
5
+ title: "Start Event",
6
+ subtitle: "Event · Start · Plain",
7
+ body: `## What is it?
8
+ The plain start event marks where a process instance begins. It fires immediately when the process is triggered — there is no condition or correlation needed.
9
+
10
+ ## When to use
11
+ Use the plain start event when:
12
+ - The process is started manually by a user
13
+ - The process is started programmatically via API
14
+ - You don't need to correlate an incoming message or schedule
15
+
16
+ > Every process must have **at least one** start event. A process cannot have more than one plain start event without using event sub-processes.
17
+
18
+ ## Best practices
19
+ - Give the start event a meaningful name using past-participle form: _"Order Received"_, _"Request Submitted"_
20
+ - Place it at the far left of the diagram (BPMN flows left to right)
21
+
22
+ ## See also
23
+ Timer Start, Message Start, Signal Start`,
24
+ },
25
+ "startEvent:message": {
26
+ title: "Message Start Event",
27
+ subtitle: "Event · Start · Message",
28
+ body: `## What is it?
29
+ A message start event starts a new process instance when a specific **named message** is received. The engine correlates the message by its name and optionally a correlation key.
30
+
31
+ ## When to use
32
+ - Process is triggered by an incoming API call, webhook, or platform message
33
+ - Multiple processes listen for different message types
34
+ - You need to pass an initial payload into the process via the message
35
+
36
+ ## In Camunda
37
+ Publish a message via the Camunda API:
38
+ \`\`\`
39
+ POST /api/v1/messages/publish
40
+ { "messageName": "order-received", "correlationKey": "order-123" }
41
+ \`\`\`
42
+ The message name in the BPMN **must match** the published message name exactly.
43
+
44
+ > Unlike signals, messages are point-to-point — they target a specific process or instance.
45
+
46
+ ## Best practices
47
+ - Name the message in a business-readable way: _"Order Received"_, _"Payment Confirmed"_
48
+ - Always include a correlation key when correlating to existing instances`,
49
+ },
50
+ "startEvent:timer": {
51
+ title: "Timer Start Event",
52
+ subtitle: "Event · Start · Timer",
53
+ body: `## What is it?
54
+ A timer start event starts a new process instance on a schedule — either at a specific date/time or repeatedly on a cycle.
55
+
56
+ ## Timer types
57
+ | Type | Example | Description |
58
+ |------|---------|-------------|
59
+ | Duration | \`PT1H\` | Wait 1 hour, then start (relative) |
60
+ | Date | \`2026-01-01T09:00:00Z\` | Start at a specific ISO 8601 date |
61
+ | Cycle | \`R/PT24H\` | Repeat every 24 hours |
62
+
63
+ ## When to use
64
+ - Daily batch processing jobs
65
+ - Scheduled reminders or escalations
66
+ - Regular data synchronization tasks
67
+
68
+ > Timer start events require the Camunda Job Worker infrastructure to be running. The timer is evaluated by the engine's internal scheduler.
69
+
70
+ ## Best practices
71
+ - Use cycles (\`R/\`) for recurring processes
72
+ - Prefer duration timers over absolute dates for portability`,
73
+ },
74
+ "startEvent:signal": {
75
+ title: "Signal Start Event",
76
+ subtitle: "Event · Start · Signal",
77
+ body: `## What is it?
78
+ A signal start event starts a new process instance when a named **signal is broadcast**. Unlike messages, signals are delivered to **all** processes that are listening for that signal — it is a broadcast, not point-to-point.
79
+
80
+ ## When to use
81
+ - Multiple independent processes should react to the same event
82
+ - You want a "pub/sub" broadcast pattern
83
+ - Coordinating across process definitions (e.g., all instances react to a "shutdown" signal)
84
+
85
+ ## In Camunda
86
+ Broadcast a signal via the Camunda API:
87
+ \`\`\`
88
+ POST /api/v1/signals/broadcast
89
+ { "signalName": "daily-close" }
90
+ \`\`\`
91
+
92
+ > Signals are **broadcast** — every process definition with a matching signal start event will create a new instance. If that is not intended, use a message start event instead.`,
93
+ },
94
+ "startEvent:error": {
95
+ title: "Error Start Event",
96
+ subtitle: "Event · Start · Error",
97
+ body: `## What is it?
98
+ An error start event can **only be used inside an event sub-process**. It catches an error thrown within the enclosing scope (by an Error End Event or a system error) and starts the sub-process to handle it.
99
+
100
+ ## When to use
101
+ - Centralized error handling within a sub-process scope
102
+ - Compensating or cleaning up when a specific business error occurs
103
+ - Separating error-handling logic from the happy path
104
+
105
+ > **Only valid inside an event sub-process.** Cannot be used as a top-level start event.
106
+
107
+ ## Best practices
108
+ - Name the error in both the throw and catch to ensure correct correlation
109
+ - Use _interrupting_ mode to cancel the parent scope on error
110
+ - Use _non-interrupting_ mode to add error logging without stopping the parent`,
111
+ },
112
+ "startEvent:escalation": {
113
+ title: "Escalation Start Event",
114
+ subtitle: "Event · Start · Escalation",
115
+ body: `## What is it?
116
+ An escalation start event is used **only inside an event sub-process** to catch escalations raised within the enclosing scope. Escalations differ from errors — they represent expected, business-level situations requiring attention (not failures).
117
+
118
+ ## When to use
119
+ - A task raises an escalation that needs special handling within the same sub-process
120
+ - Non-critical issues that should be handled without terminating the main flow
121
+
122
+ > Escalations are non-fatal by nature. Unlike errors, they do not necessarily stop the raising activity.`,
123
+ },
124
+ // ── End Events ──────────────────────────────────────────────────────────────
125
+ endEvent: {
126
+ title: "End Event",
127
+ subtitle: "Event · End · Plain",
128
+ body: `## What is it?
129
+ The plain end event marks the completion of **one path** through the process. When the token reaches an end event, that path is finished. If all paths have reached end events, the process instance completes.
130
+
131
+ ## When to use
132
+ - Terminate any path in the process
133
+ - Use multiple end events to represent different outcomes (success, rejection, timeout)
134
+
135
+ ## Best practices
136
+ - Give end events descriptive names representing the outcome: _"Order Fulfilled"_, _"Request Rejected"_, _"Payment Failed"_
137
+ - Do **not** leave nodes without outgoing flows — always connect to an end event
138
+ - Use different end event types (error, terminate) when the outcome carries semantics`,
139
+ },
140
+ "endEvent:terminate": {
141
+ title: "Terminate End Event",
142
+ subtitle: "Event · End · Terminate",
143
+ body: `## What is it?
144
+ A terminate end event **immediately cancels the entire process instance** — all parallel branches, tokens, and active jobs are stopped. This is in contrast to the plain end event which only ends one path.
145
+
146
+ ## When to use
147
+ - Any one path reaching this event should abort the entire process
148
+ - Failure of a critical step should stop all parallel work
149
+ - "Cancel" actions where you want to stop everything
150
+
151
+ > **Use carefully.** Terminating ends all active parallel branches — incomplete work will not be compensated or rolled back unless you add compensation logic.
152
+
153
+ ## vs. Plain End Event
154
+ | | Plain End | Terminate End |
155
+ |---|---|---|
156
+ | Other parallel paths | Continue | **Stopped immediately** |
157
+ | Sub-process scope | Ends this path | **Cancels everything** |`,
158
+ },
159
+ "endEvent:error": {
160
+ title: "Error End Event",
161
+ subtitle: "Event · End · Error",
162
+ body: `## What is it?
163
+ An error end event **throws a named error** when the flow reaches it. The error propagates up through the element hierarchy until it is caught by a matching Error Boundary Event or Error Start Event on an Event Sub-Process.
164
+
165
+ ## When to use
166
+ - Business exceptions that need to be handled by a parent scope
167
+ - Signaling that a sub-process has failed in a recoverable way
168
+ - Propagating validation failures out of a sub-process
169
+
170
+ ## Error correlation
171
+ The error is matched by its **error code**. Set the same error code in both the throw and the catch for reliable correlation.
172
+
173
+ > If no matching catch exists in any enclosing scope, the process instance terminates with an error.
174
+
175
+ ## Best practices
176
+ - Always name errors clearly: _"Payment Declined"_, _"Validation Failed"_
177
+ - Catch errors at the appropriate level — not too high, not too low`,
178
+ },
179
+ "endEvent:message": {
180
+ title: "Message End Event",
181
+ subtitle: "Event · End · Message",
182
+ body: `## What is it?
183
+ A message end event **sends a named message** when the path completes. It is semantically equivalent to a message throw event followed by a plain end event.
184
+
185
+ ## When to use
186
+ - Notify external systems or downstream processes when a path completes
187
+ - Trigger another process upon completion
188
+ - Integration patterns where completion must be communicated`,
189
+ },
190
+ "endEvent:signal": {
191
+ title: "Signal End Event",
192
+ subtitle: "Event · End · Signal",
193
+ body: `## What is it?
194
+ A signal end event **broadcasts a named signal** to all listening processes and sub-processes when this path completes.
195
+
196
+ ## When to use
197
+ - Broadcast completion to multiple downstream listeners
198
+ - Fan-out notification when one process completes
199
+
200
+ > Because signals are broadcast, ensure no unintended processes react to the signal.`,
201
+ },
202
+ "endEvent:escalation": {
203
+ title: "Escalation End Event",
204
+ subtitle: "Event · End · Escalation",
205
+ body: `## What is it?
206
+ An escalation end event **raises a named escalation** within an enclosing sub-process scope. The escalation is caught by an Escalation Boundary Event on the sub-process or an Escalation Start Event on an Event Sub-Process.
207
+
208
+ ## When to use
209
+ - A sub-process path reaches a business condition that needs parent-level attention
210
+ - Non-critical situations that require escalation without terminating the sub-process`,
211
+ },
212
+ "endEvent:compensation": {
213
+ title: "Compensation End Event",
214
+ subtitle: "Event · End · Compensation",
215
+ body: `## What is it?
216
+ A compensation end event **triggers compensation** for the current scope — executing all compensation handlers associated with completed activities in reverse order.
217
+
218
+ ## When to use
219
+ - Undo previously completed work (e.g., reverse a charge, cancel a booking)
220
+ - Saga pattern: compensate each completed step when a later step fails
221
+
222
+ > Compensation handlers are attached to activities via Compensation Boundary Events. When compensation is triggered, each handler runs for its associated activity.`,
223
+ },
224
+ // ── Intermediate Catch Events ────────────────────────────────────────────────
225
+ intermediateCatchEvent: {
226
+ title: "Intermediate Catch Event",
227
+ subtitle: "Event · Intermediate · Catch · Plain",
228
+ body: `## What is it?
229
+ A plain intermediate catch event **pauses the flow** and waits for something unspecified. Because a plain catch event has no trigger semantics, it is rarely useful on its own.
230
+
231
+ ## When to use
232
+ Prefer typed intermediate catch events (Timer, Message, Signal) which have defined trigger conditions.
233
+
234
+ > A plain intermediate catch event can serve as a visual waypoint or "wait state" marker, but has no actual triggering mechanism in most engines.`,
235
+ },
236
+ "intermediateCatchEvent:message": {
237
+ title: "Message Intermediate Catch",
238
+ subtitle: "Event · Intermediate · Catch · Message",
239
+ body: `## What is it?
240
+ A message intermediate catch event **pauses the process flow** and waits for a specific named message to arrive before continuing. When the message is received, execution resumes.
241
+
242
+ ## When to use
243
+ - Asynchronous callback patterns (send a request, wait for a response)
244
+ - Human-in-the-loop: wait for external confirmation
245
+ - Webhook integration: the process parks here until a callback arrives
246
+
247
+ ## In Camunda
248
+ When a process instance is waiting at a message catch event, publish the message:
249
+ \`\`\`
250
+ POST /api/v1/messages/publish
251
+ { "messageName": "payment-confirmed", "correlationKey": "order-123" }
252
+ \`\`\`
253
+ Use the correlation key to target the correct waiting instance.
254
+
255
+ ## Best practices
256
+ - Always add a Timer Boundary Event on the catch event for timeouts
257
+ - Use meaningful message names that describe the expected event`,
258
+ },
259
+ "intermediateCatchEvent:timer": {
260
+ title: "Timer Intermediate Catch",
261
+ subtitle: "Event · Intermediate · Catch · Timer",
262
+ body: `## What is it?
263
+ A timer intermediate catch event **pauses execution** for a specified duration or until a specific date/time, then continues.
264
+
265
+ ## Timer types
266
+ - **Duration**: \`PT30M\` — pause for 30 minutes
267
+ - **Date**: \`2026-06-01T08:00:00Z\` — resume at a specific time
268
+
269
+ ## When to use
270
+ - Introduce a delay between steps (cooling-off period, retry delay)
271
+ - Send a reminder after N hours if a task is not completed
272
+ - Schedule future processing
273
+
274
+ > Use FEEL expressions for dynamic durations: \`= duration(timePeriod)\`
275
+
276
+ ## Best practices
277
+ - Label timer events with the duration: _"Wait 24h"_, _"Retry in 5 min"_
278
+ - Combine with boundary events on tasks for SLA monitoring`,
279
+ },
280
+ "intermediateCatchEvent:signal": {
281
+ title: "Signal Intermediate Catch",
282
+ subtitle: "Event · Intermediate · Catch · Signal",
283
+ body: `## What is it?
284
+ A signal intermediate catch event **pauses the flow** and waits for a named signal to be broadcast. When the signal arrives, execution resumes.
285
+
286
+ ## When to use
287
+ - Wait for a cross-process or system-wide broadcast
288
+ - Coordinate parallel processes that need to synchronize
289
+ - React to operational events (e.g., _"deploy signal"_ triggers all waiting instances)
290
+
291
+ > Unlike message catch, signal catch does NOT use a correlation key — the signal goes to ALL waiting instances with matching signal name.`,
292
+ },
293
+ "intermediateCatchEvent:link": {
294
+ title: "Link Intermediate Catch",
295
+ subtitle: "Event · Intermediate · Catch · Link",
296
+ body: `## What is it?
297
+ A link catch event is the **target** of a link throw event. Together, they form an "off-page connector" — visually connecting two distant parts of a large diagram without drawing a long sequence flow line.
298
+
299
+ ## When to use
300
+ - Large diagrams where sequence flows would cross many elements and reduce readability
301
+ - Connect a throw point at the bottom of the diagram to a catch point elsewhere
302
+
303
+ > Links are purely cosmetic connectors — they do **not** pause execution or wait for anything. The flow passes through instantly.
304
+
305
+ ## Usage
306
+ 1. Place a **Link Throw** event where you want to jump from
307
+ 2. Place a **Link Catch** event where you want to land
308
+ 3. Give both the **same link name**
309
+
310
+ A throw + catch pair with the same name acts as a single invisible sequence flow.`,
311
+ },
312
+ // ── Intermediate Throw Events ────────────────────────────────────────────────
313
+ intermediateThrowEvent: {
314
+ title: "Intermediate Throw Event",
315
+ subtitle: "Event · Intermediate · Throw · Plain",
316
+ body: `## What is it?
317
+ A plain intermediate throw event passes through without doing anything. It can serve as a **visual milestone** in the diagram.
318
+
319
+ ## When to use
320
+ Use typed throw events (Message, Signal, Escalation, Link) for actual behavior. A plain throw is primarily cosmetic.
321
+
322
+ > Consider using a Text Annotation instead of a plain throw event to mark milestones — it communicates intent more clearly without adding fake BPMN semantics.`,
323
+ },
324
+ "intermediateThrowEvent:message": {
325
+ title: "Message Intermediate Throw",
326
+ subtitle: "Event · Intermediate · Throw · Message",
327
+ body: `## What is it?
328
+ A message intermediate throw event **sends a named message** to a target participant or process and immediately continues. Unlike a send task, it has no retry or job semantics.
329
+
330
+ ## When to use
331
+ - Notify another process or participant during execution
332
+ - Fire-and-forget messaging (no need to wait for a reply)
333
+
334
+ > For request/reply patterns, use a **Send Task** followed by a **Message Catch** event.`,
335
+ },
336
+ "intermediateThrowEvent:signal": {
337
+ title: "Signal Intermediate Throw",
338
+ subtitle: "Event · Intermediate · Throw · Signal",
339
+ body: `## What is it?
340
+ A signal intermediate throw event **broadcasts a named signal** to all signal catch events with the matching name. All waiting instances and catch events in the engine receive it simultaneously.
341
+
342
+ ## When to use
343
+ - Broadcast a state change to multiple processes
344
+ - Trigger all waiting parallel processes at once
345
+ - System-wide events ("end of day", "batch started")`,
346
+ },
347
+ "intermediateThrowEvent:escalation": {
348
+ title: "Escalation Intermediate Throw",
349
+ subtitle: "Event · Intermediate · Throw · Escalation",
350
+ body: `## What is it?
351
+ An escalation throw event **raises a named escalation** within the current scope, caught by an Escalation Boundary Event or Event Sub-Process in the enclosing context.
352
+
353
+ ## When to use
354
+ - Raise a non-fatal business issue that needs parent-level attention
355
+ - Trigger escalation handling without stopping the current flow (non-interrupting)`,
356
+ },
357
+ "intermediateThrowEvent:compensation": {
358
+ title: "Compensation Intermediate Throw",
359
+ subtitle: "Event · Intermediate · Throw · Compensation",
360
+ body: `## What is it?
361
+ A compensation throw event **triggers compensation handlers** for completed activities in the current scope. Used in the Saga pattern to undo previously completed work.
362
+
363
+ ## When to use
364
+ - Undo specific completed activities (optionally targeted to one activity)
365
+ - Implement business-level rollback
366
+
367
+ ## How it works
368
+ 1. Mark activities with a **Compensation Boundary Event** and connect a compensation handler
369
+ 2. When the throw event fires, each marked activity's handler executes
370
+ 3. Handlers run for activities that have _already completed_`,
371
+ },
372
+ "intermediateThrowEvent:link": {
373
+ title: "Link Intermediate Throw",
374
+ subtitle: "Event · Intermediate · Throw · Link",
375
+ body: `## What is it?
376
+ A link throw event **jumps the flow** to the matching Link Catch event elsewhere in the diagram. They form an off-page connector pair.
377
+
378
+ ## When to use
379
+ - Connect distant parts of a diagram without crossing flow lines
380
+ - Improve readability of large diagrams
381
+
382
+ ## Usage
383
+ Give the throw and catch events the **same link name**. The flow passes through instantly with no wait state.`,
384
+ },
385
+ // ── Boundary Events ──────────────────────────────────────────────────────────
386
+ "boundaryEvent:message": {
387
+ title: "Message Boundary Event",
388
+ subtitle: "Event · Boundary · Message",
389
+ body: `## What is it?
390
+ A message boundary event attaches to an activity and **intercepts a named message** while that activity is active. When the message arrives, the boundary event fires and the flow leaves the activity.
391
+
392
+ ## Interrupting vs. Non-Interrupting
393
+ | Mode | Marker | Behavior |
394
+ |------|--------|----------|
395
+ | Interrupting | Solid border | Cancels the activity, follows boundary path |
396
+ | Non-interrupting | Dashed border | Activity continues, boundary path runs in parallel |
397
+
398
+ ## When to use
399
+ - **Interrupting**: Cancel an approval task when the request is withdrawn
400
+ - **Non-interrupting**: Start a parallel notification when a task is running too long
401
+
402
+ > When the boundary event fires (interrupting), any sub-process or multi-instance work inside the activity is cancelled.`,
403
+ },
404
+ "boundaryEvent:timer": {
405
+ title: "Timer Boundary Event",
406
+ subtitle: "Event · Boundary · Timer",
407
+ body: `## What is it?
408
+ A timer boundary event fires after a duration or at a specific time while its host activity is executing. The most common boundary event — used for SLA monitoring and timeouts.
409
+
410
+ ## Interrupting vs. Non-Interrupting
411
+ | Mode | Use case |
412
+ |------|----------|
413
+ | Interrupting | Timeout: cancel task and escalate |
414
+ | Non-interrupting | Reminder: send a reminder but keep the task active |
415
+
416
+ ## Example: SLA Escalation
417
+ \`\`\`
418
+ Review Task ──── [Timer 24h, non-interrupting] ──► Send Reminder
419
+ └── [Timer 72h, interrupting] ──► Escalate to Manager
420
+ \`\`\`
421
+
422
+ ## In Camunda
423
+ Timer boundary events create time-based jobs handled by the Camunda scheduler. Use ISO 8601 durations (\`PT24H\`) or FEEL expressions.
424
+
425
+ ## Best practices
426
+ - Add timer boundaries to all user tasks that must complete within an SLA
427
+ - Label the timer with the threshold: _"After 24h"_`,
428
+ },
429
+ "boundaryEvent:error": {
430
+ title: "Error Boundary Event",
431
+ subtitle: "Event · Boundary · Error",
432
+ body: `## What is it?
433
+ An error boundary event **catches an error thrown** inside the attached activity (or its sub-processes). It is always interrupting — the activity is cancelled and flow continues on the error path.
434
+
435
+ ## When to use
436
+ - Handle errors thrown by service tasks (API failures, validation errors)
437
+ - Catch errors propagated from sub-processes
438
+ - Provide graceful degradation when a task fails
439
+
440
+ ## Example
441
+ \`\`\`
442
+ Call Payment API ─── [Error: "payment-failed"] ──► Handle Payment Error
443
+ \`\`\`
444
+
445
+ > Error boundaries on **Call Activities** catch errors thrown by the called process. Errors on **Sub-Processes** catch errors from inside the sub-process.
446
+
447
+ ## Best practices
448
+ - Match the error code between the throw and catch for precise error handling
449
+ - Leave the error code empty to catch **any** error`,
450
+ },
451
+ "boundaryEvent:signal": {
452
+ title: "Signal Boundary Event",
453
+ subtitle: "Event · Boundary · Signal",
454
+ body: `## What is it?
455
+ A signal boundary event fires when a named signal is broadcast while the attached activity is executing.
456
+
457
+ ## Interrupting vs. Non-Interrupting
458
+ | Mode | Use case |
459
+ |------|----------|
460
+ | Interrupting | Cancel the activity when the signal arrives |
461
+ | Non-interrupting | Start a parallel path when the signal arrives |
462
+
463
+ ## When to use
464
+ - React to system-wide events while a task is running
465
+ - Cancel or redirect work when an operational signal fires`,
466
+ },
467
+ "boundaryEvent:timer_escalation": {
468
+ title: "Escalation Boundary Event",
469
+ subtitle: "Event · Boundary · Escalation",
470
+ body: `## What is it?
471
+ An escalation boundary event catches escalations raised inside the attached activity's scope. Unlike error boundaries, escalation boundaries can be **non-interrupting** — the sub-process continues while the boundary path handles the escalation.
472
+
473
+ ## When to use
474
+ - Handle business-level escalations from sub-processes without stopping them
475
+ - Route escalated cases to a manager while the original task continues
476
+
477
+ > Escalation boundaries are commonly **non-interrupting** to allow the sub-process to continue normally after the escalation is handled.`,
478
+ },
479
+ "boundaryEvent:compensation": {
480
+ title: "Compensation Boundary Event",
481
+ subtitle: "Event · Boundary · Compensation",
482
+ body: `## What is it?
483
+ A compensation boundary event marks an activity as **compensatable**. It connects the activity to a compensation handler — a task or sub-process that undoes the activity's effects when compensation is triggered.
484
+
485
+ ## When to use
486
+ - Implement the Saga pattern: each compensatable step has a corresponding undo step
487
+ - Undo completed booking, charge, or allocation when a later step fails
488
+
489
+ ## How it works
490
+ 1. Attach a compensation boundary event to an activity (e.g., _"Charge Card"_)
491
+ 2. Connect it with a **compensation association** (dashed arrow) to a handler activity (e.g., _"Refund Card"_)
492
+ 3. When a Compensation Throw Event fires, the handler runs for all completed compensatable activities
493
+
494
+ > Compensation boundaries are **not interrupting** and do **not** use sequence flows — they use associations.`,
495
+ },
496
+ "boundaryEvent:cancel": {
497
+ title: "Cancel Boundary Event",
498
+ subtitle: "Event · Boundary · Cancel",
499
+ body: `## What is it?
500
+ A cancel boundary event **only applies to Transaction sub-processes**. It fires when the transaction is cancelled (via a Cancel End Event inside the transaction), allowing cleanup work.
501
+
502
+ ## When to use
503
+ - Clean up after a cancelled transaction (e.g., release reservations)
504
+ - Only valid on Transaction sub-processes — not regular tasks or sub-processes`,
505
+ },
506
+ // ── Tasks ────────────────────────────────────────────────────────────────────
507
+ serviceTask: {
508
+ title: "Service Task",
509
+ subtitle: "Task · Service",
510
+ body: `## What is it?
511
+ A service task represents an **automated activity** performed by a software system, without human interaction. The process engine executes it by invoking a service — an external worker, a REST API, or a script.
512
+
513
+ ## In Camunda (Job Workers)
514
+ Service tasks in Camunda use the **Job Worker** pattern:
515
+
516
+ 1. Set the **Job Type** (\`jobType\`) on the task
517
+ 2. Deploy a worker that polls for jobs of that type
518
+ 3. The worker completes (or fails) the job
519
+
520
+ \`\`\`
521
+ jobType: "process-payment"
522
+ inputVariables: { orderId, amount }
523
+ outputVariables: { transactionId, status }
524
+ \`\`\`
525
+
526
+ ## HTTP Connector
527
+ For HTTP/REST calls, use the built-in connector:
528
+ - Set \`jobType\` to \`io.camunda:http-json:1\`
529
+ - Configure \`taskHeaders\`: \`url\`, \`method\`, \`body\`
530
+ - Set \`resultVariable\` for the response
531
+
532
+ ## When to use
533
+ - Any automated step: API calls, data processing, messaging
534
+ - Integration with external systems
535
+ - Any step where no human input is needed
536
+
537
+ ## Best practices
538
+ - Name service tasks with _Verb Object_: _"Validate Order"_, _"Send Notification"_
539
+ - Keep worker logic simple; use a sub-process for complex multi-step logic
540
+ - Always handle errors with a boundary event`,
541
+ },
542
+ userTask: {
543
+ title: "User Task",
544
+ subtitle: "Task · User",
545
+ body: `## What is it?
546
+ A user task represents work that must be **performed by a human**. When execution reaches a user task, the engine creates a task in the task list, assigns it (by user, group, or expression), and waits for completion.
547
+
548
+ ## In Camunda
549
+ - Assign using \`assignee\`, \`candidateGroups\`, or \`candidateUsers\` (FEEL expressions supported)
550
+ - Optionally link a **Form** (by form ID) to provide a structured UI
551
+ - Task is completed via the Tasklist app or via API
552
+
553
+ ## Properties
554
+ | Property | Description |
555
+ |----------|-------------|
556
+ | Assignee | Direct user assignment |
557
+ | Candidate Groups | Groups that can claim the task |
558
+ | Candidate Users | Users that can claim the task |
559
+ | Due Date | ISO 8601 date/time for the SLA |
560
+ | Follow-up Date | When to follow up |
561
+ | Priority | Numeric priority (default 50) |
562
+ | Form | Form schema to render |
563
+
564
+ ## When to use
565
+ - Manual review, approval, or data-entry steps
566
+ - Any step that requires a human decision
567
+ - Forms for structured input collection
568
+
569
+ ## Best practices
570
+ - Always set candidate groups or assignees — avoid leaving tasks unassigned
571
+ - Add a timer boundary event for SLA enforcement
572
+ - Link a form for structured data capture`,
573
+ },
574
+ businessRuleTask: {
575
+ title: "Business Rule Task",
576
+ subtitle: "Task · Business Rule",
577
+ body: `## What is it?
578
+ A business rule task **evaluates a decision** (typically a DMN decision table) and stores the result in a process variable. It is fully automated — no human interaction required.
579
+
580
+ ## In Camunda
581
+ Link to a DMN decision:
582
+ - Set **Decision ID** to the DMN decision key
583
+ - Set **Result Variable** to store the output
584
+ - Optionally set **Result Type** (single, list, collect)
585
+
586
+ ## Example
587
+ Decision: _"Determine Risk Level"_ (DMN table)
588
+ Input variables: \`customerAge\`, \`creditScore\`
589
+ Output: \`riskLevel\` = _"low"_ | _"medium"_ | _"high"_
590
+
591
+ ## When to use
592
+ - Credit scoring, risk assessment, eligibility checks
593
+ - Tax calculation, pricing rules
594
+ - Any rule that is best modeled as a decision table (separate from the process)
595
+
596
+ ## Best practices
597
+ - Keep decision logic in DMN, not in FEEL expressions on gateways
598
+ - Decision tables are easier to maintain and audit separately from the process`,
599
+ },
600
+ scriptTask: {
601
+ title: "Script Task",
602
+ subtitle: "Task · Script",
603
+ body: `## What is it?
604
+ A script task executes an **inline script** within the process engine. In Camunda, script tasks use FEEL expressions to transform data.
605
+
606
+ ## When to use
607
+ - Lightweight data transformation (e.g., map a response to a variable)
608
+ - Compute derived values from existing variables
609
+ - Simple string/number manipulations
610
+
611
+ > For complex logic or anything that needs testing in isolation, use a **Service Task** with a job worker instead.
612
+
613
+ ## In Camunda
614
+ Set the **Script Expression** using FEEL:
615
+ \`\`\`feel
616
+ = { fullName: firstName + " " + lastName,
617
+ totalAmount: items |> sum(item.price) }
618
+ \`\`\`
619
+
620
+ ## Best practices
621
+ - Keep scripts short — one responsibility per task
622
+ - Avoid side effects or I/O operations in scripts
623
+ - Prefer service tasks for logic that needs unit testing`,
624
+ },
625
+ sendTask: {
626
+ title: "Send Task",
627
+ subtitle: "Task · Send",
628
+ body: `## What is it?
629
+ A send task **sends a message** to another participant or process. It is equivalent to a service task with messaging semantics, and conceptually represents _"we are sending something to someone else"_.
630
+
631
+ ## When to use
632
+ - Model inter-process or inter-participant communication explicitly
633
+ - Send notifications to external systems as a named business activity
634
+ - Collaboration diagrams where participants exchange messages
635
+
636
+ > In practice, Camunda treats send tasks similarly to service tasks. You still configure a job type and use a worker to implement the actual sending.`,
637
+ },
638
+ receiveTask: {
639
+ title: "Receive Task",
640
+ subtitle: "Task · Receive",
641
+ body: `## What is it?
642
+ A receive task **waits for a named message** to arrive. It is semantically equivalent to a Message Intermediate Catch Event, but modeled as a task (rectangular shape).
643
+
644
+ ## When to use
645
+ - Represent the act of "receiving" something as a named business step
646
+ - Async request-reply patterns: send a request, then wait at a receive task
647
+ - Collaboration diagrams where receiving a message is a notable activity
648
+
649
+ ## In Camunda
650
+ Correlate the message using the Camunda API just as with message catch events.
651
+
652
+ > Prefer **Message Intermediate Catch Events** for most cases — they communicate waiting semantics more clearly on the diagram.`,
653
+ },
654
+ manualTask: {
655
+ title: "Manual Task",
656
+ subtitle: "Task · Manual",
657
+ body: `## What is it?
658
+ A manual task represents work performed by a human **outside** the process engine — no system interaction, no task list entry. It documents a step that happens in the physical world.
659
+
660
+ ## When to use
661
+ - Document steps that happen offline (phone call, physical inspection, paper signing)
662
+ - Show human steps in a process that aren't tracked in the system
663
+ - Model as-is processes that include manual work before automation
664
+
665
+ > The engine does **not** create a task for manual tasks and does **not** wait — it passes through immediately. Manual tasks are documentation only.
666
+
667
+ ## vs. User Task
668
+ | | Manual Task | User Task |
669
+ |---|---|---|
670
+ | Task list entry | No | Yes |
671
+ | System tracking | No | Yes |
672
+ | Automated routing | No | Yes |`,
673
+ },
674
+ callActivity: {
675
+ title: "Call Activity",
676
+ subtitle: "Activity · Call",
677
+ body: `## What is it?
678
+ A call activity **invokes a separately defined process** as a reusable sub-process. When the call activity starts, a new child process instance is created. When that child instance completes, the call activity completes and the parent continues.
679
+
680
+ ## When to use
681
+ - Reuse a common sub-flow across multiple parent processes (e.g., _"KYC Check"_, _"Payment"_)
682
+ - Break a large complex process into smaller, independently deployable processes
683
+ - Versioned sub-processes that can be updated independently
684
+
685
+ ## In Camunda
686
+ - Set **Called Process ID** to the BPMN process ID of the child process
687
+ - Map input variables from parent → child using **Input Mappings**
688
+ - Map output variables from child → parent using **Output Mappings**
689
+
690
+ ## Best practices
691
+ - Call activities should be _independent_ — the child process should not depend on parent variables directly
692
+ - Use I/O mappings to pass only what's needed
693
+ - Version the called process ID if you want to call a specific version`,
694
+ },
695
+ subProcess: {
696
+ title: "Sub-Process",
697
+ subtitle: "Activity · Sub-Process (Embedded)",
698
+ body: `## What is it?
699
+ An embedded sub-process **groups flow elements** into a collapsible container within the parent process. Unlike a call activity, it is part of the same process — it shares variables, can catch boundary events, and is not independently deployed.
700
+
701
+ ## When to use
702
+ - Group related steps to improve diagram readability
703
+ - Apply a boundary event to an entire group of activities
704
+ - Create a scope for event sub-processes, compensation, or loops
705
+
706
+ ## vs. Call Activity
707
+ | | Sub-Process | Call Activity |
708
+ |---|---|---|
709
+ | Definition | Embedded in parent | Separate BPMN process |
710
+ | Variable scope | Shared with parent | Independent (mapped) |
711
+ | Reuse | No (inline only) | Yes (multiple callers) |
712
+ | Boundary events | Yes | Yes |
713
+
714
+ ## Collapsed vs. Expanded
715
+ - **Expanded**: contents visible in the diagram
716
+ - **Collapsed**: shown as a single task-like box (content hidden)
717
+
718
+ ## Best practices
719
+ - Use sub-processes to scope error and timer boundary events over multiple tasks
720
+ - Collapse sub-processes in high-level diagrams for readability`,
721
+ },
722
+ adHocSubProcess: {
723
+ title: "Ad-Hoc Sub-Process",
724
+ subtitle: "Activity · Ad-Hoc Sub-Process",
725
+ body: `## What is it?
726
+ An ad-hoc sub-process contains activities that can be **executed in any order, any number of times, or skipped entirely**. Activities inside are not connected by sequence flows — participants choose what to do and when.
727
+
728
+ ## When to use
729
+ - Discretionary, case-based workflows where the sequence is not predetermined
730
+ - Knowledge work (research, investigation, consulting)
731
+ - Situations where the process depends heavily on context and professional judgment
732
+
733
+ > Ad-hoc sub-processes are rarely used in automated processes. They model human-driven, flexible work where the exact sequence is not known upfront.
734
+
735
+ ## Camunda support
736
+ Ad-hoc support varies by engine version. Check your engine's documentation for the level of ad-hoc execution support.`,
737
+ },
738
+ // ── Gateways ─────────────────────────────────────────────────────────────────
739
+ exclusiveGateway: {
740
+ title: "Exclusive Gateway (XOR)",
741
+ subtitle: "Gateway · Exclusive",
742
+ body: `## What is it?
743
+ An exclusive gateway (XOR) **routes the flow to exactly one** outgoing path based on conditions. Each outgoing sequence flow has a condition; the first condition that evaluates to _true_ wins. One path has no condition or is the **default flow**.
744
+
745
+ ## Split vs. Join
746
+ | Role | Incoming | Outgoing |
747
+ |------|----------|----------|
748
+ | Split (fork) | 1 | 2+ |
749
+ | Join (merge) | 2+ | 1 |
750
+
751
+ A single gateway should perform only one role — never both simultaneously.
752
+
753
+ ## In Camunda
754
+ Conditions use FEEL expressions on outgoing sequence flows:
755
+ \`\`\`feel
756
+ = amount > 1000
757
+ = status = "approved"
758
+ \`\`\`
759
+
760
+ Always set a **default flow** (marked with a slash on the arrow) to handle the else-case.
761
+
762
+ ## Best practices
763
+ - Name split gateways as a yes/no question: _"Invoice valid?"_
764
+ - Label outgoing flows with condition names: _"Yes"_ / _"No"_
765
+ - Always include a default flow to prevent unhandled cases
766
+ - Separate split and join gateways — don't combine`,
767
+ },
768
+ parallelGateway: {
769
+ title: "Parallel Gateway (AND)",
770
+ subtitle: "Gateway · Parallel",
771
+ body: `## What is it?
772
+ A parallel gateway (AND) **splits the flow into multiple parallel branches** (all branches execute) or **waits for all branches to complete** before continuing.
773
+
774
+ ## Split vs. Join
775
+ - **Split (+)**: Creates N parallel tokens — all paths execute concurrently
776
+ - **Join (+)**: Waits until ALL incoming branches have arrived, then releases one token
777
+
778
+ > Always pair a parallel split with a parallel join of the same type. The join holds tokens until all parallel branches complete.
779
+
780
+ ## When to use
781
+ - Steps that can run concurrently to reduce elapsed time
782
+ - Fan-out: notify multiple systems simultaneously
783
+ - Fan-in: wait for all parallel work to complete before proceeding
784
+
785
+ ## Example
786
+ \`\`\`
787
+ Order ──(+)── Ship Item ─────────────────────(+)── Confirm
788
+ └─── Charge Card ──────────────────┘
789
+ └─── Send Confirmation Email ──────┘
790
+ \`\`\`
791
+
792
+ ## Best practices
793
+ - Do **not** add conditions to outgoing flows from a parallel split — all branches always execute
794
+ - Parallel gateways do **not** need a label`,
795
+ },
796
+ inclusiveGateway: {
797
+ title: "Inclusive Gateway (OR)",
798
+ subtitle: "Gateway · Inclusive",
799
+ body: `## What is it?
800
+ An inclusive gateway (OR) **splits the flow into one or more paths** based on conditions. Unlike the exclusive gateway, **multiple conditions can be true**, activating multiple branches simultaneously.
801
+
802
+ ## Split vs. Join
803
+ - **Split**: Evaluates all conditions; activates every true branch (at least one must be true)
804
+ - **Join**: Waits for **all activated branches** to complete (not all incoming — only those that were started)
805
+
806
+ > The join is smart — it only waits for branches that were actually activated by the matching split, not all possible incoming paths.
807
+
808
+ ## When to use
809
+ - Multiple optional paths that may run in parallel
810
+ - Feature flags or optional processing steps
811
+ - When you need AND + XOR combined (some paths always, some conditionally)
812
+
813
+ ## Best practices
814
+ - Always set a default flow to ensure at least one branch fires
815
+ - The matching split and join should be of the **same type** (both inclusive)
816
+ - Use parallel gateway when ALL branches should always run`,
817
+ },
818
+ eventBasedGateway: {
819
+ title: "Event-Based Gateway",
820
+ subtitle: "Gateway · Event-Based",
821
+ body: `## What is it?
822
+ An event-based gateway **routes based on which event occurs first** — a race condition. Each outgoing path connects to an event (message catch, timer catch, signal catch). The first event to fire activates its path; all other paths are discarded.
823
+
824
+ ## When to use
825
+ - Wait for one of several possible external responses
826
+ - Timeout pattern: wait for a callback OR a timer, whichever comes first
827
+ - Choose between different incoming messages
828
+
829
+ ## Example
830
+ \`\`\`
831
+ Event-based gateway ─── Message: "Order Confirmed" ──► Continue
832
+ └── Timer: after 24h ────────────► Send Reminder → Cancel
833
+ \`\`\`
834
+
835
+ ## Rules
836
+ - Outgoing paths must connect to **intermediate catch events** (message, timer, signal) or **receive tasks**
837
+ - Exactly one path fires — others are cancelled when one event triggers
838
+ - Do **not** use with plain sequence flows or tasks on outgoing paths
839
+
840
+ ## Best practices
841
+ - Label the event-based gateway: _"Awaiting response"_
842
+ - One outgoing path should always be a timer (to handle the no-response case)`,
843
+ },
844
+ // ── Sequence Flows ────────────────────────────────────────────────────────────
845
+ sequenceFlow: {
846
+ title: "Sequence Flow",
847
+ subtitle: "Connector · Sequence Flow",
848
+ body: `## What is it?
849
+ A sequence flow is the **arrow** connecting flow elements. It defines the order of execution in a process.
850
+
851
+ ## Types
852
+ | Type | Marker | Description |
853
+ |------|--------|-------------|
854
+ | Regular | Plain arrow | Unconditional flow |
855
+ | Default | Arrow with slash at source | Taken when all other conditions are false |
856
+ | Conditional | Arrow with mini-diamond at source | Has a FEEL condition expression |
857
+
858
+ ## Conditions (FEEL)
859
+ Add a condition expression to control which path is taken from a gateway:
860
+ \`\`\`feel
861
+ = amount > 1000
862
+ = status = "approved" and risk = "low"
863
+ \`\`\`
864
+
865
+ ## Default Flow
866
+ Set one outgoing flow from an exclusive or inclusive gateway as the default. It fires when no other condition is true. The default flow **never has a condition expression** — it is the else-case.
867
+
868
+ ## Best practices
869
+ - Label conditional flows with their condition: _"Approved"_, _"Amount > €1000"_
870
+ - Always set a default flow on exclusive/inclusive gateways
871
+ - Flows should generally go left-to-right; backwards flows indicate loops`,
872
+ },
873
+ };
874
+ export const CATEGORIES = [
875
+ {
876
+ label: "Start Events",
877
+ items: [
878
+ { key: "startEvent", title: "Start Event", brief: "Plain start — begins the process" },
879
+ {
880
+ key: "startEvent:message",
881
+ title: "Message Start",
882
+ brief: "Triggered by an incoming message",
883
+ },
884
+ { key: "startEvent:timer", title: "Timer Start", brief: "Triggered on a schedule" },
885
+ { key: "startEvent:signal", title: "Signal Start", brief: "Triggered by a broadcast signal" },
886
+ {
887
+ key: "startEvent:error",
888
+ title: "Error Start",
889
+ brief: "Catches errors in event sub-processes",
890
+ },
891
+ {
892
+ key: "startEvent:escalation",
893
+ title: "Escalation Start",
894
+ brief: "Catches escalations in event sub-processes",
895
+ },
896
+ ],
897
+ },
898
+ {
899
+ label: "End Events",
900
+ items: [
901
+ { key: "endEvent", title: "End Event", brief: "Ends one path in the process" },
902
+ { key: "endEvent:terminate", title: "Terminate End", brief: "Cancels the entire process" },
903
+ { key: "endEvent:error", title: "Error End", brief: "Throws a named error upwards" },
904
+ { key: "endEvent:message", title: "Message End", brief: "Sends a message on completion" },
905
+ { key: "endEvent:signal", title: "Signal End", brief: "Broadcasts a signal on completion" },
906
+ { key: "endEvent:escalation", title: "Escalation End", brief: "Raises an escalation" },
907
+ { key: "endEvent:compensation", title: "Compensation End", brief: "Triggers compensation" },
908
+ ],
909
+ },
910
+ {
911
+ label: "Intermediate Events",
912
+ items: [
913
+ { key: "intermediateCatchEvent", title: "Catch (Plain)", brief: "Pauses the flow" },
914
+ {
915
+ key: "intermediateCatchEvent:message",
916
+ title: "Message Catch",
917
+ brief: "Waits for a message to arrive",
918
+ },
919
+ {
920
+ key: "intermediateCatchEvent:timer",
921
+ title: "Timer Catch",
922
+ brief: "Pauses for a duration or date",
923
+ },
924
+ {
925
+ key: "intermediateCatchEvent:signal",
926
+ title: "Signal Catch",
927
+ brief: "Waits for a signal broadcast",
928
+ },
929
+ {
930
+ key: "intermediateCatchEvent:link",
931
+ title: "Link Catch",
932
+ brief: "Off-page connector target",
933
+ },
934
+ {
935
+ key: "intermediateThrowEvent",
936
+ title: "Throw (Plain)",
937
+ brief: "Visual milestone, no behavior",
938
+ },
939
+ { key: "intermediateThrowEvent:message", title: "Message Throw", brief: "Sends a message" },
940
+ { key: "intermediateThrowEvent:signal", title: "Signal Throw", brief: "Broadcasts a signal" },
941
+ {
942
+ key: "intermediateThrowEvent:escalation",
943
+ title: "Escalation Throw",
944
+ brief: "Raises an escalation in scope",
945
+ },
946
+ {
947
+ key: "intermediateThrowEvent:compensation",
948
+ title: "Compensation Throw",
949
+ brief: "Triggers compensation handlers",
950
+ },
951
+ {
952
+ key: "intermediateThrowEvent:link",
953
+ title: "Link Throw",
954
+ brief: "Off-page connector source",
955
+ },
956
+ ],
957
+ },
958
+ {
959
+ label: "Boundary Events",
960
+ items: [
961
+ {
962
+ key: "boundaryEvent:message",
963
+ title: "Message Boundary",
964
+ brief: "Catches a message on an activity",
965
+ },
966
+ { key: "boundaryEvent:timer", title: "Timer Boundary", brief: "Timeout / SLA monitoring" },
967
+ {
968
+ key: "boundaryEvent:error",
969
+ title: "Error Boundary",
970
+ brief: "Catches errors from an activity",
971
+ },
972
+ {
973
+ key: "boundaryEvent:signal",
974
+ title: "Signal Boundary",
975
+ brief: "Catches a signal on an activity",
976
+ },
977
+ {
978
+ key: "boundaryEvent:timer_escalation",
979
+ title: "Escalation Boundary",
980
+ brief: "Catches escalations from sub-processes",
981
+ },
982
+ {
983
+ key: "boundaryEvent:compensation",
984
+ title: "Compensation Boundary",
985
+ brief: "Marks an activity as compensatable",
986
+ },
987
+ {
988
+ key: "boundaryEvent:cancel",
989
+ title: "Cancel Boundary",
990
+ brief: "Catches cancel in transactions",
991
+ },
992
+ ],
993
+ },
994
+ {
995
+ label: "Tasks",
996
+ items: [
997
+ { key: "serviceTask", title: "Service Task", brief: "Automated task via job worker" },
998
+ { key: "userTask", title: "User Task", brief: "Human task in the task list" },
999
+ { key: "businessRuleTask", title: "Business Rule Task", brief: "Evaluates a DMN decision" },
1000
+ { key: "scriptTask", title: "Script Task", brief: "Inline FEEL script" },
1001
+ { key: "sendTask", title: "Send Task", brief: "Sends a message to a participant" },
1002
+ { key: "receiveTask", title: "Receive Task", brief: "Waits for an incoming message" },
1003
+ { key: "manualTask", title: "Manual Task", brief: "Offline human work, not tracked" },
1004
+ { key: "callActivity", title: "Call Activity", brief: "Invokes a reusable sub-process" },
1005
+ ],
1006
+ },
1007
+ {
1008
+ label: "Sub-Processes",
1009
+ items: [
1010
+ { key: "subProcess", title: "Sub-Process", brief: "Embedded grouping container" },
1011
+ {
1012
+ key: "adHocSubProcess",
1013
+ title: "Ad-Hoc Sub-Process",
1014
+ brief: "Flexible, discretionary flow",
1015
+ },
1016
+ ],
1017
+ },
1018
+ {
1019
+ label: "Gateways",
1020
+ items: [
1021
+ { key: "exclusiveGateway", title: "Exclusive (XOR)", brief: "Route to exactly one path" },
1022
+ { key: "parallelGateway", title: "Parallel (AND)", brief: "Split to all paths / join all" },
1023
+ { key: "inclusiveGateway", title: "Inclusive (OR)", brief: "Route to one or more paths" },
1024
+ { key: "eventBasedGateway", title: "Event-Based", brief: "Route to first event that fires" },
1025
+ ],
1026
+ },
1027
+ {
1028
+ label: "Connectors",
1029
+ items: [{ key: "sequenceFlow", title: "Sequence Flow", brief: "Arrow connecting elements" }],
1030
+ },
1031
+ ];
1032
+ //# sourceMappingURL=content.js.map