@open-mercato/core 0.6.5-develop.4639.1.0416d895fa → 0.6.5-develop.4670.1.afe50dfd5c
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/AGENTS.md +1 -0
- package/dist/modules/workflows/acl.js +102 -17
- package/dist/modules/workflows/acl.js.map +2 -2
- package/package.json +7 -7
- package/src/modules/customers/AGENTS.md +5 -0
- package/src/modules/customers/agentic/standalone-guide.md +1 -1
- package/src/modules/workflows/acl.ts +102 -17
package/AGENTS.md
CHANGED
|
@@ -518,6 +518,7 @@ MikroORM's identity-map and subscriber infrastructure can silently discard pendi
|
|
|
518
518
|
- Enable `{ transaction: true }` when atomicity matters (all-or-nothing semantics).
|
|
519
519
|
- Keep `emitCrudSideEffects` / `emitCrudUndoSideEffects` calls **OUTSIDE** `withAtomicFlush`
|
|
520
520
|
— side effects should only fire after the DB changes are committed.
|
|
521
|
+
- Cache invalidation follows the same rule as side effects: invalidate **after** the DB write commits, never inside the `withAtomicFlush` block. For the opt-in always-consistent read-projection tail (`OM_CACHE_SAFETY_ALWAYS_CONSISTENT`, default OFF) see `.ai/specs/2026-06-05-cache-safety-always-consistent.md`.
|
|
521
522
|
- This applies to **both** `execute` methods (update commands) and `undo` handlers.
|
|
522
523
|
|
|
523
524
|
### Commit-boundary guarantee (defense in depth)
|
|
@@ -1,23 +1,108 @@
|
|
|
1
1
|
const moduleId = "workflows";
|
|
2
2
|
const features = [
|
|
3
3
|
{ id: "workflows.view", title: "View workflows", module: moduleId },
|
|
4
|
-
{
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
{
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
{
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
4
|
+
{
|
|
5
|
+
id: "workflows.manage",
|
|
6
|
+
title: "Manage workflows",
|
|
7
|
+
module: moduleId,
|
|
8
|
+
dependsOn: ["workflows.view"]
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
id: "workflows.view_logs",
|
|
12
|
+
title: "View workflow logs",
|
|
13
|
+
module: moduleId,
|
|
14
|
+
dependsOn: ["workflows.view"]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: "workflows.view_tasks",
|
|
18
|
+
title: "View workflow tasks",
|
|
19
|
+
module: moduleId,
|
|
20
|
+
dependsOn: ["workflows.view"]
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: "workflows.definitions.view",
|
|
24
|
+
title: "View workflow definitions",
|
|
25
|
+
module: moduleId,
|
|
26
|
+
dependsOn: ["workflows.view"]
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: "workflows.definitions.create",
|
|
30
|
+
title: "Create workflow definitions",
|
|
31
|
+
module: moduleId,
|
|
32
|
+
dependsOn: ["workflows.definitions.view"]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: "workflows.definitions.edit",
|
|
36
|
+
title: "Edit workflow definitions",
|
|
37
|
+
module: moduleId,
|
|
38
|
+
dependsOn: ["workflows.definitions.view"]
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: "workflows.definitions.delete",
|
|
42
|
+
title: "Delete workflow definitions",
|
|
43
|
+
module: moduleId,
|
|
44
|
+
dependsOn: ["workflows.definitions.view"]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: "workflows.instances.view",
|
|
48
|
+
title: "View workflow instances",
|
|
49
|
+
module: moduleId,
|
|
50
|
+
dependsOn: ["workflows.view"]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: "workflows.instances.create",
|
|
54
|
+
title: "Start workflow instances",
|
|
55
|
+
module: moduleId,
|
|
56
|
+
dependsOn: ["workflows.instances.view", "workflows.definitions.view"]
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: "workflows.instances.cancel",
|
|
60
|
+
title: "Cancel workflow instances",
|
|
61
|
+
module: moduleId,
|
|
62
|
+
dependsOn: ["workflows.instances.view"]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: "workflows.instances.retry",
|
|
66
|
+
title: "Retry workflow instances",
|
|
67
|
+
module: moduleId,
|
|
68
|
+
dependsOn: ["workflows.instances.view"]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "workflows.instances.signal",
|
|
72
|
+
title: "Signal workflow instances",
|
|
73
|
+
module: moduleId,
|
|
74
|
+
dependsOn: ["workflows.instances.view"]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: "workflows.tasks.view",
|
|
78
|
+
title: "View user tasks",
|
|
79
|
+
module: moduleId,
|
|
80
|
+
dependsOn: ["workflows.view"]
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: "workflows.tasks.claim",
|
|
84
|
+
title: "Claim workflow tasks",
|
|
85
|
+
module: moduleId,
|
|
86
|
+
dependsOn: ["workflows.tasks.view"]
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: "workflows.tasks.complete",
|
|
90
|
+
title: "Complete workflow tasks",
|
|
91
|
+
module: moduleId,
|
|
92
|
+
dependsOn: ["workflows.tasks.view"]
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: "workflows.signals.send",
|
|
96
|
+
title: "Send workflow signals",
|
|
97
|
+
module: moduleId,
|
|
98
|
+
dependsOn: ["workflows.view"]
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
id: "workflows.events.view",
|
|
102
|
+
title: "View workflow events",
|
|
103
|
+
module: moduleId,
|
|
104
|
+
dependsOn: ["workflows.view"]
|
|
105
|
+
}
|
|
21
106
|
// Note: Event triggers are now embedded in workflow definitions.
|
|
22
107
|
// Trigger management permissions are covered by workflows.definitions.edit
|
|
23
108
|
];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/modules/workflows/acl.ts"],
|
|
4
|
-
"sourcesContent": ["const moduleId = 'workflows'\n\nexport const features = [\n { id: 'workflows.view', title: 'View workflows', module: moduleId },\n {
|
|
5
|
-
"mappings": "AAAA,MAAM,WAAW;AAEV,MAAM,WAAW;AAAA,EACtB,EAAE,IAAI,kBAAkB,OAAO,kBAAkB,QAAQ,SAAS;AAAA,EAClE,
|
|
4
|
+
"sourcesContent": ["const moduleId = 'workflows'\n\nexport const features = [\n { id: 'workflows.view', title: 'View workflows', module: moduleId },\n {\n id: 'workflows.manage',\n title: 'Manage workflows',\n module: moduleId,\n dependsOn: ['workflows.view'],\n },\n {\n id: 'workflows.view_logs',\n title: 'View workflow logs',\n module: moduleId,\n dependsOn: ['workflows.view'],\n },\n {\n id: 'workflows.view_tasks',\n title: 'View workflow tasks',\n module: moduleId,\n dependsOn: ['workflows.view'],\n },\n {\n id: 'workflows.definitions.view',\n title: 'View workflow definitions',\n module: moduleId,\n dependsOn: ['workflows.view'],\n },\n {\n id: 'workflows.definitions.create',\n title: 'Create workflow definitions',\n module: moduleId,\n dependsOn: ['workflows.definitions.view'],\n },\n {\n id: 'workflows.definitions.edit',\n title: 'Edit workflow definitions',\n module: moduleId,\n dependsOn: ['workflows.definitions.view'],\n },\n {\n id: 'workflows.definitions.delete',\n title: 'Delete workflow definitions',\n module: moduleId,\n dependsOn: ['workflows.definitions.view'],\n },\n {\n id: 'workflows.instances.view',\n title: 'View workflow instances',\n module: moduleId,\n dependsOn: ['workflows.view'],\n },\n {\n id: 'workflows.instances.create',\n title: 'Start workflow instances',\n module: moduleId,\n dependsOn: ['workflows.instances.view', 'workflows.definitions.view'],\n },\n {\n id: 'workflows.instances.cancel',\n title: 'Cancel workflow instances',\n module: moduleId,\n dependsOn: ['workflows.instances.view'],\n },\n {\n id: 'workflows.instances.retry',\n title: 'Retry workflow instances',\n module: moduleId,\n dependsOn: ['workflows.instances.view'],\n },\n {\n id: 'workflows.instances.signal',\n title: 'Signal workflow instances',\n module: moduleId,\n dependsOn: ['workflows.instances.view'],\n },\n {\n id: 'workflows.tasks.view',\n title: 'View user tasks',\n module: moduleId,\n dependsOn: ['workflows.view'],\n },\n {\n id: 'workflows.tasks.claim',\n title: 'Claim workflow tasks',\n module: moduleId,\n dependsOn: ['workflows.tasks.view'],\n },\n {\n id: 'workflows.tasks.complete',\n title: 'Complete workflow tasks',\n module: moduleId,\n dependsOn: ['workflows.tasks.view'],\n },\n {\n id: 'workflows.signals.send',\n title: 'Send workflow signals',\n module: moduleId,\n dependsOn: ['workflows.view'],\n },\n {\n id: 'workflows.events.view',\n title: 'View workflow events',\n module: moduleId,\n dependsOn: ['workflows.view'],\n },\n // Note: Event triggers are now embedded in workflow definitions.\n // Trigger management permissions are covered by workflows.definitions.edit\n]\n\nexport default features\n"],
|
|
5
|
+
"mappings": "AAAA,MAAM,WAAW;AAEV,MAAM,WAAW;AAAA,EACtB,EAAE,IAAI,kBAAkB,OAAO,kBAAkB,QAAQ,SAAS;AAAA,EAClE;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,4BAA4B;AAAA,EAC1C;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,4BAA4B;AAAA,EAC1C;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,4BAA4B;AAAA,EAC1C;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,4BAA4B,4BAA4B;AAAA,EACtE;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,CAAC,gBAAgB;AAAA,EAC9B;AAAA;AAAA;AAGF;AAEA,IAAO,cAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-mercato/core",
|
|
3
|
-
"version": "0.6.5-develop.
|
|
3
|
+
"version": "0.6.5-develop.4670.1.afe50dfd5c",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -245,16 +245,16 @@
|
|
|
245
245
|
"zod": "^4.4.3"
|
|
246
246
|
},
|
|
247
247
|
"peerDependencies": {
|
|
248
|
-
"@open-mercato/ai-assistant": "0.6.5-develop.
|
|
249
|
-
"@open-mercato/shared": "0.6.5-develop.
|
|
250
|
-
"@open-mercato/ui": "0.6.5-develop.
|
|
248
|
+
"@open-mercato/ai-assistant": "0.6.5-develop.4670.1.afe50dfd5c",
|
|
249
|
+
"@open-mercato/shared": "0.6.5-develop.4670.1.afe50dfd5c",
|
|
250
|
+
"@open-mercato/ui": "0.6.5-develop.4670.1.afe50dfd5c",
|
|
251
251
|
"react": "^19.0.0",
|
|
252
252
|
"react-dom": "^19.0.0"
|
|
253
253
|
},
|
|
254
254
|
"devDependencies": {
|
|
255
|
-
"@open-mercato/ai-assistant": "0.6.5-develop.
|
|
256
|
-
"@open-mercato/shared": "0.6.5-develop.
|
|
257
|
-
"@open-mercato/ui": "0.6.5-develop.
|
|
255
|
+
"@open-mercato/ai-assistant": "0.6.5-develop.4670.1.afe50dfd5c",
|
|
256
|
+
"@open-mercato/shared": "0.6.5-develop.4670.1.afe50dfd5c",
|
|
257
|
+
"@open-mercato/ui": "0.6.5-develop.4670.1.afe50dfd5c",
|
|
258
258
|
"@testing-library/dom": "^10.4.1",
|
|
259
259
|
"@testing-library/jest-dom": "^6.9.1",
|
|
260
260
|
"@testing-library/react": "^16.3.1",
|
|
@@ -88,6 +88,11 @@ Commands (`commands/people.ts`) demonstrate:
|
|
|
88
88
|
4. Side effects with `emitCrudSideEffects` and `emitCrudUndoSideEffects`
|
|
89
89
|
5. Include `indexer: { entityType, cacheAliases }` in both directions
|
|
90
90
|
|
|
91
|
+
## Transaction Safety
|
|
92
|
+
|
|
93
|
+
- Multi-phase scalar + relation mutations (e.g. update commands that also sync tags) use `withAtomicFlush(em, phases, { transaction: true })` from `@open-mercato/shared/lib/commands/flush` — never interleave `em.find`/`em.findOne` between a scalar mutation and `em.flush()`.
|
|
94
|
+
- Side effects (`emitCrudSideEffects`) and cache invalidation fire **after** commit, outside the `withAtomicFlush` block. See `packages/core/AGENTS.md` → "Entity Update Safety — `withAtomicFlush`" and `.ai/specs/2026-06-05-cache-safety-always-consistent.md`.
|
|
95
|
+
|
|
91
96
|
## Custom Field Integration
|
|
92
97
|
|
|
93
98
|
Use `collectCustomFieldValues()` from `@open-mercato/ui/backend/utils/customFieldValues`:
|
|
@@ -135,4 +135,4 @@ await withAtomicFlush(em, [
|
|
|
135
135
|
await emitCrudSideEffects({ ... })
|
|
136
136
|
```
|
|
137
137
|
|
|
138
|
-
Never run `em.find`/`em.findOne` between scalar mutations and `em.flush()` without `withAtomicFlush` — changes will be silently lost.
|
|
138
|
+
Never run `em.find`/`em.findOne` between scalar mutations and `em.flush()` without `withAtomicFlush` — changes will be silently lost. Cache invalidation must also stay outside `withAtomicFlush` and fire after commit, so the opt-in `OM_CACHE_SAFETY_ALWAYS_CONSISTENT` mode (default OFF) never serves stale or partially-committed reads.
|
|
@@ -2,23 +2,108 @@ const moduleId = 'workflows'
|
|
|
2
2
|
|
|
3
3
|
export const features = [
|
|
4
4
|
{ id: 'workflows.view', title: 'View workflows', module: moduleId },
|
|
5
|
-
{
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
{
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
{
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
5
|
+
{
|
|
6
|
+
id: 'workflows.manage',
|
|
7
|
+
title: 'Manage workflows',
|
|
8
|
+
module: moduleId,
|
|
9
|
+
dependsOn: ['workflows.view'],
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
id: 'workflows.view_logs',
|
|
13
|
+
title: 'View workflow logs',
|
|
14
|
+
module: moduleId,
|
|
15
|
+
dependsOn: ['workflows.view'],
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: 'workflows.view_tasks',
|
|
19
|
+
title: 'View workflow tasks',
|
|
20
|
+
module: moduleId,
|
|
21
|
+
dependsOn: ['workflows.view'],
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
id: 'workflows.definitions.view',
|
|
25
|
+
title: 'View workflow definitions',
|
|
26
|
+
module: moduleId,
|
|
27
|
+
dependsOn: ['workflows.view'],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 'workflows.definitions.create',
|
|
31
|
+
title: 'Create workflow definitions',
|
|
32
|
+
module: moduleId,
|
|
33
|
+
dependsOn: ['workflows.definitions.view'],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: 'workflows.definitions.edit',
|
|
37
|
+
title: 'Edit workflow definitions',
|
|
38
|
+
module: moduleId,
|
|
39
|
+
dependsOn: ['workflows.definitions.view'],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: 'workflows.definitions.delete',
|
|
43
|
+
title: 'Delete workflow definitions',
|
|
44
|
+
module: moduleId,
|
|
45
|
+
dependsOn: ['workflows.definitions.view'],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: 'workflows.instances.view',
|
|
49
|
+
title: 'View workflow instances',
|
|
50
|
+
module: moduleId,
|
|
51
|
+
dependsOn: ['workflows.view'],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: 'workflows.instances.create',
|
|
55
|
+
title: 'Start workflow instances',
|
|
56
|
+
module: moduleId,
|
|
57
|
+
dependsOn: ['workflows.instances.view', 'workflows.definitions.view'],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: 'workflows.instances.cancel',
|
|
61
|
+
title: 'Cancel workflow instances',
|
|
62
|
+
module: moduleId,
|
|
63
|
+
dependsOn: ['workflows.instances.view'],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'workflows.instances.retry',
|
|
67
|
+
title: 'Retry workflow instances',
|
|
68
|
+
module: moduleId,
|
|
69
|
+
dependsOn: ['workflows.instances.view'],
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
id: 'workflows.instances.signal',
|
|
73
|
+
title: 'Signal workflow instances',
|
|
74
|
+
module: moduleId,
|
|
75
|
+
dependsOn: ['workflows.instances.view'],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: 'workflows.tasks.view',
|
|
79
|
+
title: 'View user tasks',
|
|
80
|
+
module: moduleId,
|
|
81
|
+
dependsOn: ['workflows.view'],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
id: 'workflows.tasks.claim',
|
|
85
|
+
title: 'Claim workflow tasks',
|
|
86
|
+
module: moduleId,
|
|
87
|
+
dependsOn: ['workflows.tasks.view'],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: 'workflows.tasks.complete',
|
|
91
|
+
title: 'Complete workflow tasks',
|
|
92
|
+
module: moduleId,
|
|
93
|
+
dependsOn: ['workflows.tasks.view'],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
id: 'workflows.signals.send',
|
|
97
|
+
title: 'Send workflow signals',
|
|
98
|
+
module: moduleId,
|
|
99
|
+
dependsOn: ['workflows.view'],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: 'workflows.events.view',
|
|
103
|
+
title: 'View workflow events',
|
|
104
|
+
module: moduleId,
|
|
105
|
+
dependsOn: ['workflows.view'],
|
|
106
|
+
},
|
|
22
107
|
// Note: Event triggers are now embedded in workflow definitions.
|
|
23
108
|
// Trigger management permissions are covered by workflows.definitions.edit
|
|
24
109
|
]
|