@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.
- package/README.md +153 -0
- package/dist/ai-bridge/css.d.ts +2 -0
- package/dist/ai-bridge/css.js +366 -0
- package/dist/ai-bridge/index.d.ts +44 -0
- package/dist/ai-bridge/index.js +132 -0
- package/dist/ai-bridge/panel.d.ts +27 -0
- package/dist/ai-bridge/panel.js +715 -0
- package/dist/ascii-view/css.d.ts +4 -0
- package/dist/ascii-view/css.js +83 -0
- package/dist/ascii-view/index.d.ts +25 -0
- package/dist/ascii-view/index.js +92 -0
- package/dist/command-palette/css.d.ts +4 -0
- package/dist/command-palette/css.js +157 -0
- package/dist/command-palette/index.d.ts +53 -0
- package/dist/command-palette/index.js +378 -0
- package/dist/command-palette-editor/index.d.ts +35 -0
- package/dist/command-palette-editor/index.js +60 -0
- package/dist/config-panel/css.d.ts +4 -0
- package/dist/config-panel/css.js +719 -0
- package/dist/config-panel/index.d.ts +36 -0
- package/dist/config-panel/index.js +73 -0
- package/dist/config-panel/renderer.d.ts +127 -0
- package/dist/config-panel/renderer.js +1162 -0
- package/dist/config-panel/types.d.ts +118 -0
- package/dist/config-panel/types.js +2 -0
- package/dist/config-panel-bpmn/index.d.ts +58 -0
- package/dist/config-panel-bpmn/index.js +1320 -0
- package/dist/config-panel-bpmn/template-engine.d.ts +17 -0
- package/dist/config-panel-bpmn/template-engine.js +307 -0
- package/dist/config-panel-bpmn/template-to-service-task.d.ts +30 -0
- package/dist/config-panel-bpmn/template-to-service-task.js +92 -0
- package/dist/config-panel-bpmn/template-types.d.ts +126 -0
- package/dist/config-panel-bpmn/template-types.js +6 -0
- package/dist/config-panel-bpmn/templates/generated.d.ts +3 -0
- package/dist/config-panel-bpmn/templates/generated.js +57865 -0
- package/dist/config-panel-bpmn/util.d.ts +46 -0
- package/dist/config-panel-bpmn/util.js +195 -0
- package/dist/dmn-editor/css.d.ts +3 -0
- package/dist/dmn-editor/css.js +667 -0
- package/dist/dmn-editor/dmn-editor.d.ts +34 -0
- package/dist/dmn-editor/dmn-editor.js +646 -0
- package/dist/dmn-editor/drd-canvas.d.ts +85 -0
- package/dist/dmn-editor/drd-canvas.js +1087 -0
- package/dist/dmn-editor/index.d.ts +3 -0
- package/dist/dmn-editor/index.js +2 -0
- package/dist/dmn-viewer/css.d.ts +3 -0
- package/dist/dmn-viewer/css.js +151 -0
- package/dist/dmn-viewer/dmn-viewer.d.ts +30 -0
- package/dist/dmn-viewer/dmn-viewer.js +160 -0
- package/dist/dmn-viewer/feel.d.ts +3 -0
- package/dist/dmn-viewer/feel.js +2 -0
- package/dist/dmn-viewer/index.d.ts +14 -0
- package/dist/dmn-viewer/index.js +12 -0
- package/dist/element-docs/content.d.ts +20 -0
- package/dist/element-docs/content.js +1032 -0
- package/dist/element-docs/index.d.ts +7 -0
- package/dist/element-docs/index.js +643 -0
- package/dist/feel-playground/css.d.ts +4 -0
- package/dist/feel-playground/css.js +292 -0
- package/dist/feel-playground/index.d.ts +4 -0
- package/dist/feel-playground/index.js +3 -0
- package/dist/feel-playground/playground-plugin.d.ts +14 -0
- package/dist/feel-playground/playground-plugin.js +292 -0
- package/dist/form-editor/css.d.ts +3 -0
- package/dist/form-editor/css.js +703 -0
- package/dist/form-editor/form-editor.d.ts +48 -0
- package/dist/form-editor/form-editor.js +1039 -0
- package/dist/form-editor/index.d.ts +3 -0
- package/dist/form-editor/index.js +2 -0
- package/dist/form-viewer/css.d.ts +3 -0
- package/dist/form-viewer/css.js +303 -0
- package/dist/form-viewer/form-viewer.d.ts +29 -0
- package/dist/form-viewer/form-viewer.js +376 -0
- package/dist/form-viewer/index.d.ts +12 -0
- package/dist/form-viewer/index.js +11 -0
- package/dist/history/checkpoint.d.ts +10 -0
- package/dist/history/checkpoint.js +92 -0
- package/dist/history/css.d.ts +2 -0
- package/dist/history/css.js +130 -0
- package/dist/history/history-panel.d.ts +12 -0
- package/dist/history/history-panel.js +142 -0
- package/dist/history/index.d.ts +5 -0
- package/dist/history/index.js +3 -0
- package/dist/main-menu/css.d.ts +4 -0
- package/dist/main-menu/css.js +272 -0
- package/dist/main-menu/index.d.ts +59 -0
- package/dist/main-menu/index.js +285 -0
- package/dist/minimap/css.d.ts +10 -0
- package/dist/minimap/css.js +54 -0
- package/dist/minimap/index.d.ts +38 -0
- package/dist/minimap/index.js +69 -0
- package/dist/minimap/minimap.d.ts +35 -0
- package/dist/minimap/minimap.js +166 -0
- package/dist/optimize/index.d.ts +21 -0
- package/dist/optimize/index.js +304 -0
- package/dist/process-runner/css.d.ts +2 -0
- package/dist/process-runner/css.js +467 -0
- package/dist/process-runner/index.d.ts +56 -0
- package/dist/process-runner/index.js +549 -0
- package/dist/storage/auto-save.d.ts +11 -0
- package/dist/storage/auto-save.js +44 -0
- package/dist/storage/css.d.ts +2 -0
- package/dist/storage/css.js +2 -0
- package/dist/storage/db.d.ts +99 -0
- package/dist/storage/db.js +116 -0
- package/dist/storage/dialog.d.ts +15 -0
- package/dist/storage/dialog.js +201 -0
- package/dist/storage/export.d.ts +3 -0
- package/dist/storage/export.js +137 -0
- package/dist/storage/index.d.ts +44 -0
- package/dist/storage/index.js +201 -0
- package/dist/storage/sidebar.d.ts +2 -0
- package/dist/storage/sidebar.js +2 -0
- package/dist/storage/storage-api.d.ts +76 -0
- package/dist/storage/storage-api.js +342 -0
- package/dist/storage/types.d.ts +44 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage-tabs-bridge/index.d.ts +96 -0
- package/dist/storage-tabs-bridge/index.js +502 -0
- package/dist/tabs/css.d.ts +3 -0
- package/dist/tabs/css.js +642 -0
- package/dist/tabs/file-resolver.d.ts +71 -0
- package/dist/tabs/file-resolver.js +46 -0
- package/dist/tabs/index.d.ts +15 -0
- package/dist/tabs/index.js +13 -0
- package/dist/tabs/tabs-plugin.d.ts +250 -0
- package/dist/tabs/tabs-plugin.js +1119 -0
- package/dist/token-highlight/css.d.ts +2 -0
- package/dist/token-highlight/css.js +81 -0
- package/dist/token-highlight/index.d.ts +44 -0
- package/dist/token-highlight/index.js +164 -0
- package/dist/watermark/css.d.ts +10 -0
- package/dist/watermark/css.js +54 -0
- package/dist/watermark/index.d.ts +48 -0
- package/dist/watermark/index.js +64 -0
- package/dist/zoom-controls/css.d.ts +4 -0
- package/dist/zoom-controls/css.js +48 -0
- package/dist/zoom-controls/index.d.ts +36 -0
- package/dist/zoom-controls/index.js +111 -0
- 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
|