@hailer/mcp 0.0.1

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 (163) hide show
  1. package/.claude/commands/tool-builder.md +37 -0
  2. package/.claude/commands/ws-pull.md +44 -0
  3. package/.claude/settings.json +8 -0
  4. package/.claude/settings.local.json +49 -0
  5. package/.claude/skills/activity-api/SKILL.md +96 -0
  6. package/.claude/skills/activity-api/references/activity-endpoints.md +845 -0
  7. package/.claude/skills/add-app-member-skill/SKILL.md +977 -0
  8. package/.claude/skills/agent-building/SKILL.md +243 -0
  9. package/.claude/skills/agent-building/references/architecture-patterns.md +446 -0
  10. package/.claude/skills/agent-building/references/code-examples.md +587 -0
  11. package/.claude/skills/agent-building/references/implementation-guide.md +619 -0
  12. package/.claude/skills/app-api/SKILL.md +219 -0
  13. package/.claude/skills/app-api/references/app-endpoints.md +759 -0
  14. package/.claude/skills/building-hailer-apps-skill/SKILL.md +548 -0
  15. package/.claude/skills/create-app-skill/SKILL.md +1101 -0
  16. package/.claude/skills/create-insight-skill/SKILL.md +1317 -0
  17. package/.claude/skills/get-insight-data-skill/SKILL.md +1053 -0
  18. package/.claude/skills/hailer-api/SKILL.md +283 -0
  19. package/.claude/skills/hailer-api/references/activities.md +620 -0
  20. package/.claude/skills/hailer-api/references/authentication.md +216 -0
  21. package/.claude/skills/hailer-api/references/datasets.md +437 -0
  22. package/.claude/skills/hailer-api/references/files.md +301 -0
  23. package/.claude/skills/hailer-api/references/insights.md +469 -0
  24. package/.claude/skills/hailer-api/references/workflows.md +720 -0
  25. package/.claude/skills/hailer-api/references/workspaces-users.md +445 -0
  26. package/.claude/skills/insight-api/SKILL.md +185 -0
  27. package/.claude/skills/insight-api/references/insight-endpoints.md +514 -0
  28. package/.claude/skills/install-workflow-skill/SKILL.md +1056 -0
  29. package/.claude/skills/list-apps-skill/SKILL.md +1010 -0
  30. package/.claude/skills/list-workflows-minimal-skill/SKILL.md +992 -0
  31. package/.claude/skills/local-first-skill/SKILL.md +570 -0
  32. package/.claude/skills/mcp-tools/SKILL.md +419 -0
  33. package/.claude/skills/mcp-tools/references/api-endpoints.md +499 -0
  34. package/.claude/skills/mcp-tools/references/data-structures.md +554 -0
  35. package/.claude/skills/mcp-tools/references/implementation-patterns.md +717 -0
  36. package/.claude/skills/preview-insight-skill/SKILL.md +1290 -0
  37. package/.claude/skills/publish-hailer-app-skill/SKILL.md +453 -0
  38. package/.claude/skills/remove-app-member-skill/SKILL.md +671 -0
  39. package/.claude/skills/remove-app-skill/SKILL.md +985 -0
  40. package/.claude/skills/remove-insight-skill/SKILL.md +1011 -0
  41. package/.claude/skills/remove-workflow-skill/SKILL.md +920 -0
  42. package/.claude/skills/scaffold-hailer-app-skill/SKILL.md +1034 -0
  43. package/.claude/skills/skill-testing/README.md +137 -0
  44. package/.claude/skills/skill-testing/SKILL.md +348 -0
  45. package/.claude/skills/skill-testing/references/test-patterns.md +705 -0
  46. package/.claude/skills/skill-testing/references/testing-guide.md +603 -0
  47. package/.claude/skills/skill-testing/references/validation-checklist.md +537 -0
  48. package/.claude/skills/tool-builder/SKILL.md +328 -0
  49. package/.claude/skills/update-app-skill/SKILL.md +970 -0
  50. package/.claude/skills/update-workflow-field-skill/SKILL.md +1098 -0
  51. package/.env.example +81 -0
  52. package/.mcp.json +13 -0
  53. package/README.md +297 -0
  54. package/dist/app.d.ts +4 -0
  55. package/dist/app.js +74 -0
  56. package/dist/cli.d.ts +3 -0
  57. package/dist/cli.js +5 -0
  58. package/dist/client/adaptive-documentation-bot.d.ts +108 -0
  59. package/dist/client/adaptive-documentation-bot.js +475 -0
  60. package/dist/client/adaptive-documentation-types.d.ts +66 -0
  61. package/dist/client/adaptive-documentation-types.js +9 -0
  62. package/dist/client/agent-activity-bot.d.ts +51 -0
  63. package/dist/client/agent-activity-bot.js +166 -0
  64. package/dist/client/agent-tracker.d.ts +499 -0
  65. package/dist/client/agent-tracker.js +659 -0
  66. package/dist/client/description-updater.d.ts +56 -0
  67. package/dist/client/description-updater.js +259 -0
  68. package/dist/client/log-parser.d.ts +72 -0
  69. package/dist/client/log-parser.js +387 -0
  70. package/dist/client/mcp-client.d.ts +50 -0
  71. package/dist/client/mcp-client.js +532 -0
  72. package/dist/client/message-processor.d.ts +35 -0
  73. package/dist/client/message-processor.js +352 -0
  74. package/dist/client/multi-bot-manager.d.ts +24 -0
  75. package/dist/client/multi-bot-manager.js +74 -0
  76. package/dist/client/providers/anthropic-provider.d.ts +19 -0
  77. package/dist/client/providers/anthropic-provider.js +631 -0
  78. package/dist/client/providers/llm-provider.d.ts +47 -0
  79. package/dist/client/providers/llm-provider.js +367 -0
  80. package/dist/client/providers/openai-provider.d.ts +23 -0
  81. package/dist/client/providers/openai-provider.js +621 -0
  82. package/dist/client/simple-llm-caller.d.ts +19 -0
  83. package/dist/client/simple-llm-caller.js +100 -0
  84. package/dist/client/skill-generator.d.ts +81 -0
  85. package/dist/client/skill-generator.js +386 -0
  86. package/dist/client/test-adaptive-bot.d.ts +9 -0
  87. package/dist/client/test-adaptive-bot.js +82 -0
  88. package/dist/client/token-pricing.d.ts +38 -0
  89. package/dist/client/token-pricing.js +127 -0
  90. package/dist/client/token-tracker.d.ts +232 -0
  91. package/dist/client/token-tracker.js +457 -0
  92. package/dist/client/token-usage-bot.d.ts +53 -0
  93. package/dist/client/token-usage-bot.js +153 -0
  94. package/dist/client/tool-executor.d.ts +69 -0
  95. package/dist/client/tool-executor.js +159 -0
  96. package/dist/client/tool-schema-loader.d.ts +60 -0
  97. package/dist/client/tool-schema-loader.js +178 -0
  98. package/dist/client/types.d.ts +69 -0
  99. package/dist/client/types.js +7 -0
  100. package/dist/config.d.ts +162 -0
  101. package/dist/config.js +296 -0
  102. package/dist/core.d.ts +26 -0
  103. package/dist/core.js +147 -0
  104. package/dist/lib/context-manager.d.ts +111 -0
  105. package/dist/lib/context-manager.js +431 -0
  106. package/dist/lib/logger.d.ts +74 -0
  107. package/dist/lib/logger.js +277 -0
  108. package/dist/lib/materialize.d.ts +3 -0
  109. package/dist/lib/materialize.js +101 -0
  110. package/dist/lib/normalizedName.d.ts +7 -0
  111. package/dist/lib/normalizedName.js +48 -0
  112. package/dist/lib/prompt-length-manager.d.ts +81 -0
  113. package/dist/lib/prompt-length-manager.js +457 -0
  114. package/dist/lib/terminal-prompt.d.ts +9 -0
  115. package/dist/lib/terminal-prompt.js +108 -0
  116. package/dist/mcp/UserContextCache.d.ts +56 -0
  117. package/dist/mcp/UserContextCache.js +163 -0
  118. package/dist/mcp/auth.d.ts +2 -0
  119. package/dist/mcp/auth.js +29 -0
  120. package/dist/mcp/hailer-clients.d.ts +42 -0
  121. package/dist/mcp/hailer-clients.js +246 -0
  122. package/dist/mcp/signal-handler.d.ts +45 -0
  123. package/dist/mcp/signal-handler.js +317 -0
  124. package/dist/mcp/tool-registry.d.ts +100 -0
  125. package/dist/mcp/tool-registry.js +306 -0
  126. package/dist/mcp/tools/activity.d.ts +15 -0
  127. package/dist/mcp/tools/activity.js +955 -0
  128. package/dist/mcp/tools/app.d.ts +20 -0
  129. package/dist/mcp/tools/app.js +1488 -0
  130. package/dist/mcp/tools/discussion.d.ts +19 -0
  131. package/dist/mcp/tools/discussion.js +950 -0
  132. package/dist/mcp/tools/file.d.ts +15 -0
  133. package/dist/mcp/tools/file.js +119 -0
  134. package/dist/mcp/tools/insight.d.ts +17 -0
  135. package/dist/mcp/tools/insight.js +806 -0
  136. package/dist/mcp/tools/skill.d.ts +10 -0
  137. package/dist/mcp/tools/skill.js +279 -0
  138. package/dist/mcp/tools/user.d.ts +10 -0
  139. package/dist/mcp/tools/user.js +108 -0
  140. package/dist/mcp/tools/workflow-template.d.ts +19 -0
  141. package/dist/mcp/tools/workflow-template.js +822 -0
  142. package/dist/mcp/tools/workflow.d.ts +18 -0
  143. package/dist/mcp/tools/workflow.js +1362 -0
  144. package/dist/mcp/utils/api-errors.d.ts +45 -0
  145. package/dist/mcp/utils/api-errors.js +160 -0
  146. package/dist/mcp/utils/data-transformers.d.ts +102 -0
  147. package/dist/mcp/utils/data-transformers.js +194 -0
  148. package/dist/mcp/utils/file-upload.d.ts +33 -0
  149. package/dist/mcp/utils/file-upload.js +148 -0
  150. package/dist/mcp/utils/hailer-api-client.d.ts +120 -0
  151. package/dist/mcp/utils/hailer-api-client.js +323 -0
  152. package/dist/mcp/utils/index.d.ts +13 -0
  153. package/dist/mcp/utils/index.js +39 -0
  154. package/dist/mcp/utils/logger.d.ts +42 -0
  155. package/dist/mcp/utils/logger.js +103 -0
  156. package/dist/mcp/utils/types.d.ts +286 -0
  157. package/dist/mcp/utils/types.js +7 -0
  158. package/dist/mcp/workspace-cache.d.ts +42 -0
  159. package/dist/mcp/workspace-cache.js +97 -0
  160. package/dist/mcp-server.d.ts +42 -0
  161. package/dist/mcp-server.js +280 -0
  162. package/package.json +56 -0
  163. package/tsconfig.json +23 -0
@@ -0,0 +1,720 @@
1
+ # Hailer Workflows API
2
+
3
+ ## Overview
4
+
5
+ Workflows automate business processes by defining a series of steps, transitions, and actions that activities follow. Workflows can include conditional logic, automatic assignments, notifications, and integrations.
6
+
7
+ ## Workflow Concepts
8
+
9
+ - **Workflow** - A defined process with steps and transitions
10
+ - **Step** - A stage in the workflow (maps to activity status)
11
+ - **Transition** - Movement from one step to another
12
+ - **Trigger** - Event that starts or advances a workflow
13
+ - **Action** - Automated task performed during workflow execution
14
+ - **Condition** - Logic that determines workflow behavior
15
+
16
+ ## Endpoints
17
+
18
+ ### List Workflows
19
+
20
+ ```http
21
+ GET /v3/workflows?workspace_id=ws_123
22
+ ```
23
+
24
+ **Response:**
25
+ ```json
26
+ {
27
+ "data": [
28
+ {
29
+ "id": "wf_123",
30
+ "name": "Invoice Approval Process",
31
+ "description": "Multi-step invoice approval workflow",
32
+ "workspace_id": "ws_456",
33
+ "active": true,
34
+ "steps": [
35
+ {
36
+ "id": "step_1",
37
+ "name": "Submitted",
38
+ "status": "submitted"
39
+ },
40
+ {
41
+ "id": "step_2",
42
+ "name": "Manager Review",
43
+ "status": "manager_review"
44
+ },
45
+ {
46
+ "id": "step_3",
47
+ "name": "Finance Approval",
48
+ "status": "finance_approval"
49
+ },
50
+ {
51
+ "id": "step_4",
52
+ "name": "Approved",
53
+ "status": "approved"
54
+ }
55
+ ]
56
+ }
57
+ ]
58
+ }
59
+ ```
60
+
61
+ ### Get Workflow
62
+
63
+ ```http
64
+ GET /v3/workflows/{workflow_id}
65
+ ```
66
+
67
+ Returns complete workflow definition including steps, transitions, actions, and conditions.
68
+
69
+ ### Create Workflow
70
+
71
+ ```http
72
+ POST /v3/workflows
73
+ Content-Type: application/json
74
+
75
+ {
76
+ "name": "Bug Fix Workflow",
77
+ "workspace_id": "ws_123",
78
+ "description": "Standard process for bug fixes",
79
+ "steps": [
80
+ {
81
+ "name": "Reported",
82
+ "status": "reported"
83
+ },
84
+ {
85
+ "name": "Triaged",
86
+ "status": "triaged"
87
+ },
88
+ {
89
+ "name": "In Progress",
90
+ "status": "in_progress"
91
+ },
92
+ {
93
+ "name": "Testing",
94
+ "status": "testing"
95
+ },
96
+ {
97
+ "name": "Resolved",
98
+ "status": "resolved"
99
+ }
100
+ ],
101
+ "transitions": [
102
+ {
103
+ "from": "reported",
104
+ "to": "triaged",
105
+ "name": "Triage",
106
+ "conditions": []
107
+ },
108
+ {
109
+ "from": "triaged",
110
+ "to": "in_progress",
111
+ "name": "Start Work",
112
+ "actions": [
113
+ {
114
+ "type": "assign",
115
+ "user_id": ":current_user"
116
+ },
117
+ {
118
+ "type": "notify",
119
+ "recipients": ["manager"]
120
+ }
121
+ ]
122
+ }
123
+ ],
124
+ "triggers": [
125
+ {
126
+ "event": "activity.created",
127
+ "conditions": [
128
+ {
129
+ "field": "tags",
130
+ "operator": "contains",
131
+ "value": "bug"
132
+ }
133
+ ]
134
+ }
135
+ ]
136
+ }
137
+ ```
138
+
139
+ ### Update Workflow
140
+
141
+ ```http
142
+ PATCH /v3/workflows/{workflow_id}
143
+ {
144
+ "active": true,
145
+ "description": "Updated description"
146
+ }
147
+ ```
148
+
149
+ ### Delete Workflow
150
+
151
+ ```http
152
+ DELETE /v3/workflows/{workflow_id}
153
+ ```
154
+
155
+ ## Workflow Steps
156
+
157
+ ### Step Object
158
+
159
+ ```json
160
+ {
161
+ "id": "step_123",
162
+ "name": "In Review",
163
+ "status": "review",
164
+ "order": 2,
165
+ "color": "#FF9800",
166
+ "actions": [
167
+ {
168
+ "type": "assign",
169
+ "role": "reviewer"
170
+ },
171
+ {
172
+ "type": "notify",
173
+ "template": "review_requested"
174
+ }
175
+ ]
176
+ }
177
+ ```
178
+
179
+ ### Add Step
180
+
181
+ ```http
182
+ POST /v3/workflows/{workflow_id}/steps
183
+ {
184
+ "name": "Quality Assurance",
185
+ "status": "qa",
186
+ "order": 3
187
+ }
188
+ ```
189
+
190
+ ### Update Step
191
+
192
+ ```http
193
+ PATCH /v3/workflows/{workflow_id}/steps/{step_id}
194
+ {
195
+ "name": "QA Testing",
196
+ "color": "#9C27B0"
197
+ }
198
+ ```
199
+
200
+ ### Delete Step
201
+
202
+ ```http
203
+ DELETE /v3/workflows/{workflow_id}/steps/{step_id}
204
+ ```
205
+
206
+ ## Workflow Transitions
207
+
208
+ ### Transition Object
209
+
210
+ ```json
211
+ {
212
+ "id": "trans_123",
213
+ "from": "in_progress",
214
+ "to": "review",
215
+ "name": "Submit for Review",
216
+ "conditions": [
217
+ {
218
+ "field": "custom_fields.test_coverage",
219
+ "operator": ">=",
220
+ "value": 80
221
+ }
222
+ ],
223
+ "actions": [
224
+ {
225
+ "type": "comment",
226
+ "text": "Submitted for review"
227
+ },
228
+ {
229
+ "type": "assign",
230
+ "role": "reviewer"
231
+ }
232
+ ]
233
+ }
234
+ ```
235
+
236
+ ### Available Operators
237
+
238
+ - `=` / `!=` - Equals / Not equals
239
+ - `>` / `<` / `>=` / `<=` - Comparisons
240
+ - `contains` - String contains
241
+ - `in` - Value in list
242
+ - `is_empty` / `is_not_empty` - Empty checks
243
+
244
+ ### Add Transition
245
+
246
+ ```http
247
+ POST /v3/workflows/{workflow_id}/transitions
248
+ {
249
+ "from": "review",
250
+ "to": "approved",
251
+ "name": "Approve",
252
+ "conditions": [
253
+ {
254
+ "field": "assigned_to",
255
+ "operator": "=",
256
+ "value": ":current_user"
257
+ }
258
+ ]
259
+ }
260
+ ```
261
+
262
+ ## Workflow Actions
263
+
264
+ Actions are automated tasks performed when transitions occur or steps are entered.
265
+
266
+ ### Available Action Types
267
+
268
+ #### Assign Activity
269
+
270
+ ```json
271
+ {
272
+ "type": "assign",
273
+ "user_id": "user_123"
274
+ }
275
+ ```
276
+
277
+ Or use role-based assignment:
278
+ ```json
279
+ {
280
+ "type": "assign",
281
+ "role": "manager"
282
+ }
283
+ ```
284
+
285
+ #### Send Notification
286
+
287
+ ```json
288
+ {
289
+ "type": "notify",
290
+ "recipients": ["assigned_to", "creator"],
291
+ "template": "status_changed",
292
+ "custom_message": "Activity moved to {{status}}"
293
+ }
294
+ ```
295
+
296
+ #### Add Comment
297
+
298
+ ```json
299
+ {
300
+ "type": "comment",
301
+ "text": "Automatically moved to {{step_name}} on {{date}}"
302
+ }
303
+ ```
304
+
305
+ #### Update Field
306
+
307
+ ```json
308
+ {
309
+ "type": "update_field",
310
+ "field": "priority",
311
+ "value": "high"
312
+ }
313
+ ```
314
+
315
+ #### Create Subtask
316
+
317
+ ```json
318
+ {
319
+ "type": "create_activity",
320
+ "title": "Code Review for {{parent_title}}",
321
+ "template_id": "tmpl_review"
322
+ }
323
+ ```
324
+
325
+ #### Trigger Webhook
326
+
327
+ ```json
328
+ {
329
+ "type": "webhook",
330
+ "url": "https://your-server.com/webhook",
331
+ "method": "POST",
332
+ "payload": {
333
+ "activity_id": "{{activity_id}}",
334
+ "status": "{{status}}"
335
+ }
336
+ }
337
+ ```
338
+
339
+ #### Send Email
340
+
341
+ ```json
342
+ {
343
+ "type": "email",
344
+ "to": ["{{assigned_to}}"],
345
+ "subject": "Activity {{title}} needs your attention",
346
+ "template": "activity_assigned"
347
+ }
348
+ ```
349
+
350
+ ## Workflow Triggers
351
+
352
+ Triggers start or advance workflows based on events.
353
+
354
+ ### Trigger Types
355
+
356
+ #### Activity Created
357
+
358
+ ```json
359
+ {
360
+ "event": "activity.created",
361
+ "conditions": [
362
+ {
363
+ "field": "priority",
364
+ "operator": "=",
365
+ "value": "critical"
366
+ }
367
+ ],
368
+ "workflow_id": "wf_123"
369
+ }
370
+ ```
371
+
372
+ #### Activity Updated
373
+
374
+ ```json
375
+ {
376
+ "event": "activity.updated",
377
+ "conditions": [
378
+ {
379
+ "field": "status",
380
+ "operator": "=",
381
+ "value": "completed"
382
+ }
383
+ ],
384
+ "actions": [
385
+ {
386
+ "type": "notify",
387
+ "recipients": ["creator"]
388
+ }
389
+ ]
390
+ }
391
+ ```
392
+
393
+ #### Time-Based
394
+
395
+ ```json
396
+ {
397
+ "event": "scheduled",
398
+ "schedule": "0 9 * * 1",
399
+ "conditions": [
400
+ {
401
+ "field": "status",
402
+ "operator": "in",
403
+ "value": ["open", "in_progress"]
404
+ }
405
+ ]
406
+ }
407
+ ```
408
+
409
+ Schedule uses cron syntax:
410
+ - `* * * * *` - Every minute
411
+ - `0 9 * * 1` - Every Monday at 9:00 AM
412
+ - `0 0 1 * *` - First day of each month
413
+
414
+ #### Field Changed
415
+
416
+ ```json
417
+ {
418
+ "event": "activity.field_changed",
419
+ "field": "assigned_to",
420
+ "workflow_id": "wf_123"
421
+ }
422
+ ```
423
+
424
+ ## Workflow Execution
425
+
426
+ ### Trigger Workflow
427
+
428
+ ```http
429
+ POST /v3/workflows/{workflow_id}/trigger
430
+ {
431
+ "activity_id": "act_123",
432
+ "input": {
433
+ "priority": "high",
434
+ "requester": "Johan Rekna"
435
+ }
436
+ }
437
+ ```
438
+
439
+ ### Advance Activity in Workflow
440
+
441
+ ```http
442
+ POST /v3/workflows/{workflow_id}/advance
443
+ {
444
+ "activity_id": "act_123",
445
+ "to_step": "step_456"
446
+ }
447
+ ```
448
+
449
+ ### Get Workflow State
450
+
451
+ ```http
452
+ GET /v3/activities/{activity_id}/workflow
453
+ ```
454
+
455
+ **Response:**
456
+ ```json
457
+ {
458
+ "workflow_id": "wf_123",
459
+ "current_step": {
460
+ "id": "step_2",
461
+ "name": "In Review",
462
+ "status": "review"
463
+ },
464
+ "available_transitions": [
465
+ {
466
+ "id": "trans_3",
467
+ "name": "Approve",
468
+ "to": "step_3"
469
+ },
470
+ {
471
+ "id": "trans_4",
472
+ "name": "Reject",
473
+ "to": "step_1"
474
+ }
475
+ ],
476
+ "history": [
477
+ {
478
+ "from": "step_1",
479
+ "to": "step_2",
480
+ "timestamp": "2025-01-15T10:30:00Z",
481
+ "user_id": "user_123"
482
+ }
483
+ ]
484
+ }
485
+ ```
486
+
487
+ ## Conditional Logic
488
+
489
+ ### Condition Object
490
+
491
+ ```json
492
+ {
493
+ "field": "custom_fields.budget",
494
+ "operator": ">",
495
+ "value": 10000
496
+ }
497
+ ```
498
+
499
+ ### Complex Conditions
500
+
501
+ Use `AND` / `OR` logic:
502
+
503
+ ```json
504
+ {
505
+ "operator": "AND",
506
+ "conditions": [
507
+ {
508
+ "field": "priority",
509
+ "operator": "=",
510
+ "value": "high"
511
+ },
512
+ {
513
+ "field": "assigned_to",
514
+ "operator": "is_not_empty"
515
+ }
516
+ ]
517
+ }
518
+ ```
519
+
520
+ ```json
521
+ {
522
+ "operator": "OR",
523
+ "conditions": [
524
+ {
525
+ "field": "status",
526
+ "operator": "=",
527
+ "value": "completed"
528
+ },
529
+ {
530
+ "field": "status",
531
+ "operator": "=",
532
+ "value": "cancelled"
533
+ }
534
+ ]
535
+ }
536
+ ```
537
+
538
+ ## Workflow Templates
539
+
540
+ ### Create from Template
541
+
542
+ ```http
543
+ POST /v3/workflows/from-template
544
+ {
545
+ "template_id": "tmpl_invoice_approval",
546
+ "workspace_id": "ws_123",
547
+ "customizations": {
548
+ "approval_threshold": 5000,
549
+ "approver_role": "finance_manager"
550
+ }
551
+ }
552
+ ```
553
+
554
+ ### Available Templates
555
+
556
+ - Invoice Approval
557
+ - Bug Tracking
558
+ - Change Request
559
+ - Customer Support Ticket
560
+ - Project Management
561
+ - HR Onboarding
562
+
563
+ ## Workflow Analytics
564
+
565
+ ### Get Workflow Statistics
566
+
567
+ ```http
568
+ GET /v3/workflows/{workflow_id}/stats
569
+ ```
570
+
571
+ **Response:**
572
+ ```json
573
+ {
574
+ "total_activities": 523,
575
+ "active_activities": 89,
576
+ "completed_activities": 434,
577
+ "average_completion_time_days": 5.3,
578
+ "step_statistics": [
579
+ {
580
+ "step": "submitted",
581
+ "count": 89,
582
+ "average_time_in_step_days": 0.5
583
+ },
584
+ {
585
+ "step": "review",
586
+ "count": 45,
587
+ "average_time_in_step_days": 2.1
588
+ }
589
+ ]
590
+ }
591
+ ```
592
+
593
+ ## Best Practices
594
+
595
+ 1. **Keep workflows simple** - Complex workflows are hard to maintain
596
+ 2. **Use clear step names** - Self-explanatory names improve usability
597
+ 3. **Add conditions to transitions** - Prevent invalid state changes
598
+ 4. **Automate notifications** - Keep stakeholders informed
599
+ 5. **Test workflows thoroughly** - Test all paths before deployment
600
+ 6. **Monitor workflow performance** - Track bottlenecks and delays
601
+ 7. **Document workflow purpose** - Add descriptions for team understanding
602
+ 8. **Use templates** - Start with proven workflow patterns
603
+ 9. **Version workflows** - Track changes over time
604
+ 10. **Limit workflow complexity** - Maximum 10-15 steps for maintainability
605
+
606
+ ## Example Workflows
607
+
608
+ ### Simple Approval Workflow
609
+
610
+ ```json
611
+ {
612
+ "name": "Simple Approval",
613
+ "steps": [
614
+ {"name": "Submitted", "status": "submitted"},
615
+ {"name": "Approved", "status": "approved"},
616
+ {"name": "Rejected", "status": "rejected"}
617
+ ],
618
+ "transitions": [
619
+ {
620
+ "from": "submitted",
621
+ "to": "approved",
622
+ "name": "Approve",
623
+ "actions": [
624
+ {"type": "comment", "text": "Approved by {{current_user}}"},
625
+ {"type": "notify", "recipients": ["creator"]}
626
+ ]
627
+ },
628
+ {
629
+ "from": "submitted",
630
+ "to": "rejected",
631
+ "name": "Reject",
632
+ "actions": [
633
+ {"type": "comment", "text": "Rejected by {{current_user}}"},
634
+ {"type": "notify", "recipients": ["creator"]}
635
+ ]
636
+ }
637
+ ]
638
+ }
639
+ ```
640
+
641
+ ### Multi-Stage Review Workflow
642
+
643
+ ```json
644
+ {
645
+ "name": "Multi-Stage Review",
646
+ "steps": [
647
+ {"name": "Draft", "status": "draft"},
648
+ {"name": "Peer Review", "status": "peer_review"},
649
+ {"name": "Manager Review", "status": "manager_review"},
650
+ {"name": "Final Approval", "status": "final_approval"},
651
+ {"name": "Published", "status": "published"}
652
+ ],
653
+ "transitions": [
654
+ {
655
+ "from": "draft",
656
+ "to": "peer_review",
657
+ "name": "Submit for Peer Review",
658
+ "actions": [
659
+ {"type": "assign", "role": "peer_reviewer"},
660
+ {"type": "notify", "recipients": ["assigned_to"]}
661
+ ]
662
+ },
663
+ {
664
+ "from": "peer_review",
665
+ "to": "manager_review",
666
+ "name": "Escalate to Manager",
667
+ "conditions": [
668
+ {"field": "custom_fields.peer_approved", "operator": "=", "value": true}
669
+ ],
670
+ "actions": [
671
+ {"type": "assign", "role": "manager"},
672
+ {"type": "update_field", "field": "priority", "value": "high"}
673
+ ]
674
+ }
675
+ ]
676
+ }
677
+ ```
678
+
679
+ ## Workflow Variables
680
+
681
+ Use variables in action templates:
682
+
683
+ - `{{activity_id}}` - Activity ID
684
+ - `{{activity_title}}` - Activity title
685
+ - `{{status}}` - Current status
686
+ - `{{assigned_to}}` - Assigned user
687
+ - `{{creator}}` - Activity creator
688
+ - `{{current_user}}` - User performing action
689
+ - `{{step_name}}` - Current step name
690
+ - `{{date}}` - Current date
691
+ - `{{custom_fields.field_name}}` - Custom field value
692
+
693
+ ## Error Handling
694
+
695
+ Workflows can fail due to:
696
+ - Invalid conditions
697
+ - Missing required fields
698
+ - Permission errors
699
+ - Action execution failures
700
+
701
+ Get workflow errors:
702
+
703
+ ```http
704
+ GET /v3/workflows/{workflow_id}/errors?activity_id=act_123
705
+ ```
706
+
707
+ **Response:**
708
+ ```json
709
+ {
710
+ "errors": [
711
+ {
712
+ "timestamp": "2025-01-15T10:30:00Z",
713
+ "step": "review",
714
+ "action": "assign",
715
+ "error": "User not found",
716
+ "details": "Attempted to assign to user_999 which does not exist"
717
+ }
718
+ ]
719
+ }
720
+ ```