@epilot/cli 0.1.144 → 0.1.145

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 CHANGED
@@ -29,7 +29,7 @@ npm install -g @epilot/cli
29
29
 
30
30
  <!-- usage-help -->
31
31
  ```
32
- epilot v0.1.144 — CLI for epilot APIs
32
+ epilot v0.1.145 — CLI for epilot APIs
33
33
 
34
34
  USAGE
35
35
  epilot <api> <operationId> [params...] [flags]
@@ -79,6 +79,15 @@
79
79
  "example": "wfABCDEFGH"
80
80
  }
81
81
  },
82
+ {
83
+ "name": "trigger_event_name",
84
+ "in": "query",
85
+ "description": "Filter by Event Catalog event name. Returns only automations that have an event_catalog trigger for this event.",
86
+ "schema": {
87
+ "type": "string",
88
+ "example": "CustomerRequestSubmitted"
89
+ }
90
+ },
82
91
  {
83
92
  "name": "include_flows",
84
93
  "in": "query",
@@ -1249,6 +1258,9 @@
1249
1258
  },
1250
1259
  {
1251
1260
  "$ref": "#/components/schemas/FlowsTrigger"
1261
+ },
1262
+ {
1263
+ "$ref": "#/components/schemas/EventCatalogTrigger"
1252
1264
  }
1253
1265
  ]
1254
1266
  },
@@ -1900,12 +1912,168 @@
1900
1912
  "items": {
1901
1913
  "type": "string"
1902
1914
  }
1915
+ },
1916
+ "graph_context": {
1917
+ "type": "array",
1918
+ "description": "Multi-hop graph queries (executed via entity-api's `POST /v1/entity:graph`), each\nmerging every traversed node into the mapping's source context under its own node id,\nso `mapping_attributes` (e.g. `_copy` / `_template`) can reference it alongside the\nmain entity, e.g. `{ \"_copy\": \"order.line_items\" }`.\n\n`seed.entity_id` and any node `filter[].value` may contain `{{handlebars}}`\nplaceholders (e.g. `{{trigger.entity._id}}`) that are resolved at execution time\nagainst the mapping's source context. Resolution and graph execution happen in\nentity-mapping-api; this API only accepts, validates and passes through this field.\n",
1919
+ "items": {
1920
+ "$ref": "#/components/schemas/GraphContextEntry"
1921
+ }
1903
1922
  }
1904
1923
  },
1905
1924
  "required": [
1906
1925
  "target_schema"
1907
1926
  ]
1908
1927
  },
1928
+ "GraphContextEntry": {
1929
+ "type": "object",
1930
+ "description": "One multi-hop graph query to run against entity-api's `POST /v1/entity:graph`. Every node\nin `graph.nodes` is merged into the mapping's source context under its own `id`, so\nlisting multiple nodes here costs one entity-api call, not one per node. A node's value\noverwrites any existing source-context key of the same name (the source entity, a 1-hop\nrelation, or another graph node).\n",
1931
+ "required": [
1932
+ "seed",
1933
+ "graph"
1934
+ ],
1935
+ "properties": {
1936
+ "seed": {
1937
+ "$ref": "#/components/schemas/GraphSeed"
1938
+ },
1939
+ "graph": {
1940
+ "$ref": "#/components/schemas/GraphDefinition"
1941
+ }
1942
+ }
1943
+ },
1944
+ "GraphSeed": {
1945
+ "type": "object",
1946
+ "required": [
1947
+ "entity_id",
1948
+ "node_id"
1949
+ ],
1950
+ "properties": {
1951
+ "entity_id": {
1952
+ "type": "string",
1953
+ "format": "uuid"
1954
+ },
1955
+ "node_id": {
1956
+ "type": "string",
1957
+ "description": "The node ID in the graph definition that corresponds to the seed entity",
1958
+ "example": "contact"
1959
+ }
1960
+ }
1961
+ },
1962
+ "GraphDefinition": {
1963
+ "type": "object",
1964
+ "required": [
1965
+ "nodes",
1966
+ "edges"
1967
+ ],
1968
+ "properties": {
1969
+ "nodes": {
1970
+ "type": "array",
1971
+ "description": "List of node definitions in the graph",
1972
+ "items": {
1973
+ "$ref": "#/components/schemas/GraphNode"
1974
+ }
1975
+ },
1976
+ "edges": {
1977
+ "type": "array",
1978
+ "description": "List of edge definitions connecting nodes",
1979
+ "items": {
1980
+ "$ref": "#/components/schemas/GraphEdge"
1981
+ }
1982
+ }
1983
+ }
1984
+ },
1985
+ "GraphNode": {
1986
+ "type": "object",
1987
+ "required": [
1988
+ "id",
1989
+ "schema"
1990
+ ],
1991
+ "properties": {
1992
+ "id": {
1993
+ "type": "string",
1994
+ "description": "Unique identifier for this node in the graph definition",
1995
+ "example": "contact"
1996
+ },
1997
+ "schema": {
1998
+ "type": "string",
1999
+ "description": "Entity schema slug for this node",
2000
+ "example": "contact"
2001
+ },
2002
+ "cardinality": {
2003
+ "type": "string",
2004
+ "enum": [
2005
+ "one",
2006
+ "many"
2007
+ ],
2008
+ "description": "\"one\": this node resolves to a single entity. \"many\" (default if unset): this node\nresolves to an array of entities. The seed node always returns a single entity\nregardless of this setting.\n",
2009
+ "example": "one"
2010
+ },
2011
+ "fields": {
2012
+ "type": "array",
2013
+ "description": "Optional entity fields to include in the hydrated response for this node.",
2014
+ "items": {
2015
+ "type": "string"
2016
+ }
2017
+ },
2018
+ "filter": {
2019
+ "type": "array",
2020
+ "description": "Narrows this node's traversal results to entities matching every filter (AND\nsemantics). Useful for disambiguating among multiple entities reachable via the same\ngraph edge.\n",
2021
+ "items": {
2022
+ "$ref": "#/components/schemas/GraphNodeFilter"
2023
+ }
2024
+ }
2025
+ }
2026
+ },
2027
+ "GraphNodeFilter": {
2028
+ "type": "object",
2029
+ "description": "Entities are included in this node's result only if `attribute` exactly equals the literal `value`.",
2030
+ "required": [
2031
+ "attribute",
2032
+ "value"
2033
+ ],
2034
+ "properties": {
2035
+ "attribute": {
2036
+ "type": "string",
2037
+ "description": "Entity attribute name to match against.",
2038
+ "example": "order_number"
2039
+ },
2040
+ "value": {
2041
+ "description": "Literal value the attribute must exactly equal for the entity to be included in this node's result. Supports `{{handlebars}}` placeholders resolved against sourceContext when given as a string.",
2042
+ "oneOf": [
2043
+ {
2044
+ "type": "string",
2045
+ "nullable": true
2046
+ },
2047
+ {
2048
+ "type": "number"
2049
+ },
2050
+ {
2051
+ "type": "boolean"
2052
+ }
2053
+ ],
2054
+ "example": "OR-113"
2055
+ }
2056
+ }
2057
+ },
2058
+ "GraphEdge": {
2059
+ "type": "object",
2060
+ "required": [
2061
+ "from",
2062
+ "to"
2063
+ ],
2064
+ "properties": {
2065
+ "from": {
2066
+ "type": "string",
2067
+ "description": "Source node ID",
2068
+ "example": "contact"
2069
+ },
2070
+ "to": {
2071
+ "type": "string",
2072
+ "description": "Target node ID",
2073
+ "example": "billing_account"
2074
+ }
2075
+ }
2076
+ },
1909
2077
  "MappingConfigRef": {
1910
2078
  "type": "object",
1911
2079
  "properties": {
@@ -2663,10 +2831,7 @@
2663
2831
  "language_code": {
2664
2832
  "type": "string",
2665
2833
  "description": "Language code for the email template",
2666
- "enum": [
2667
- "de",
2668
- "en"
2669
- ]
2834
+ "example": "de"
2670
2835
  },
2671
2836
  "reply_mode": {
2672
2837
  "type": "string",
@@ -2697,10 +2862,7 @@
2697
2862
  },
2698
2863
  "language_code": {
2699
2864
  "type": "string",
2700
- "enum": [
2701
- "de",
2702
- "en"
2703
- ]
2865
+ "example": "de"
2704
2866
  },
2705
2867
  "notify_portal_user_only": {
2706
2868
  "type": "boolean",
@@ -3503,10 +3665,12 @@
3503
3665
  },
3504
3666
  "originType": {
3505
3667
  "type": "string",
3668
+ "description": "`event` reads the operand from the trigger's Event Catalog payload instead of an entity: `attribute` is then a dot path into the payload (e.g. `ticket.subject`). Only valid with `origin: trigger` on flows started by an EventCatalogTrigger.\n",
3506
3669
  "enum": [
3507
3670
  "entity",
3508
3671
  "workflow",
3509
- "journey_block"
3672
+ "journey_block",
3673
+ "event"
3510
3674
  ]
3511
3675
  },
3512
3676
  "schema": {
@@ -3796,6 +3960,9 @@
3796
3960
  },
3797
3961
  {
3798
3962
  "$ref": "#/components/schemas/TriggerEventMessaging"
3963
+ },
3964
+ {
3965
+ "$ref": "#/components/schemas/TriggerEventEventCatalog"
3799
3966
  }
3800
3967
  ]
3801
3968
  },
@@ -3855,7 +4022,6 @@
3855
4022
  },
3856
4023
  "WorkflowExecutionContext": {
3857
4024
  "type": "object",
3858
- "description": "Automation Executions triggered by workflow task automations will always carry information about the triggering workflow. This information is helpful in correlating workflow executions with all the triggered automation executions\n",
3859
4025
  "required": [
3860
4026
  "workflow_exec_id",
3861
4027
  "workflow_role"
@@ -3897,12 +4063,17 @@
3897
4063
  }
3898
4064
  }
3899
4065
  }
4066
+ },
4067
+ "trigger_user_id": {
4068
+ "type": "string",
4069
+ "description": "Id of the user on whose behalf the workflow task triggered this automation — the caller of a user-initiated run, or the user whose task completion advanced the flow to the automation task. Action workers resolve it as the acting user for template variable resolution (user.*) and email thread assignment, matching the attribution of manually triggered executions. Absent when no human action led to the trigger (scheduler fires, journey-triggered flows).\n",
4070
+ "example": "10006129"
3900
4071
  }
3901
4072
  }
3902
4073
  },
3903
4074
  "WorkflowWaitContext": {
3904
4075
  "type": "object",
3905
- "description": "Workflow automation tasks can be paused & waiting for journey automation executions to succeed. If such is the case, this context tracks the task_id of the workflow waiting for journey submission success This context is consumed by svc-workflows to resume a task waiting on this journey submission.\n",
4076
+ "description": "Correlation stamped when the triggering submission entity carried workflow wait claims from a journey link (AL-2521). Consumed by svc-workflows to resume a task waiting on this journey submission.\n",
3906
4077
  "required": [
3907
4078
  "workflow_execution_id",
3908
4079
  "workflow_task_id"
@@ -4088,6 +4259,92 @@
4088
4259
  "operation_type"
4089
4260
  ]
4090
4261
  },
4262
+ "TriggerEventEventCatalog": {
4263
+ "type": "object",
4264
+ "description": "Set on executions started by an Event Catalog event (see EventCatalogTrigger). The full event payload is not stored inline (it may be up to 256 KB) but by reference in `payload_ref`; automation workers hydrate it before every action.\n",
4265
+ "properties": {
4266
+ "type": {
4267
+ "type": "string",
4268
+ "enum": [
4269
+ "event_catalog"
4270
+ ]
4271
+ },
4272
+ "org_id": {
4273
+ "type": "string",
4274
+ "example": "123"
4275
+ },
4276
+ "entity_id": {
4277
+ "$ref": "#/components/schemas/EntityId"
4278
+ },
4279
+ "entity_node_id": {
4280
+ "type": "string",
4281
+ "description": "Node id of the event's entity graph that was resolved to `entity_id`",
4282
+ "example": "ticket"
4283
+ },
4284
+ "event_id": {
4285
+ "type": "string",
4286
+ "description": "Event Catalog event id (ULID) of the published event",
4287
+ "example": "01K3ZK8QZ7Y7Q2M8W1V3N4X5P6"
4288
+ },
4289
+ "event_name": {
4290
+ "type": "string",
4291
+ "example": "CustomerRequestSubmitted"
4292
+ },
4293
+ "event_version": {
4294
+ "type": "string",
4295
+ "description": "Version the payload was delivered in (the version pinned on the trigger)",
4296
+ "example": "1.1"
4297
+ },
4298
+ "published_version": {
4299
+ "type": "string",
4300
+ "description": "Version the event was originally published with, before downgrading to `event_version`",
4301
+ "example": "1.2"
4302
+ },
4303
+ "event_time": {
4304
+ "type": "string",
4305
+ "format": "date-time"
4306
+ },
4307
+ "trigger_source_type": {
4308
+ "type": "string",
4309
+ "description": "How the event was triggered in the catalog (api | automation | operation | portal_user)",
4310
+ "example": "operation"
4311
+ },
4312
+ "trigger_source": {
4313
+ "type": "string",
4314
+ "description": "Opaque source reference from the catalog (e.g. activity id, automation execution id)"
4315
+ },
4316
+ "payload_ref": {
4317
+ "$ref": "#/components/schemas/TriggerEventPayloadRef"
4318
+ }
4319
+ },
4320
+ "required": [
4321
+ "type",
4322
+ "org_id",
4323
+ "entity_id",
4324
+ "entity_node_id",
4325
+ "event_id",
4326
+ "event_name",
4327
+ "event_version"
4328
+ ]
4329
+ },
4330
+ "TriggerEventPayloadRef": {
4331
+ "type": "object",
4332
+ "description": "S3 reference to the stored trigger event payload (`_downgrades` stripped, downgraded to the pinned version)",
4333
+ "properties": {
4334
+ "bucket": {
4335
+ "type": "string",
4336
+ "example": "automation-trigger-payloads-prod"
4337
+ },
4338
+ "key": {
4339
+ "type": "string",
4340
+ "example": "trigger-payloads/123/6c8e5d9a-7f1b-4c2e-9d3a-0b1c2d3e4f5a.json"
4341
+ }
4342
+ },
4343
+ "required": [
4344
+ "bucket",
4345
+ "key"
4346
+ ]
4347
+ },
4091
4348
  "ApiCallerContext": {
4092
4349
  "type": "object",
4093
4350
  "additionalProperties": true,
@@ -4999,7 +5256,12 @@
4999
5256
  "updateEntity",
5000
5257
  "deleteEntity",
5001
5258
  "softDeleteEntity",
5002
- "restoreEntity"
5259
+ "restoreEntity",
5260
+ "relationsAdded",
5261
+ "relationsRemoved",
5262
+ "relationsSoftDeleted",
5263
+ "relationsRestored",
5264
+ "relationsDeleted"
5003
5265
  ]
5004
5266
  },
5005
5267
  "EntitySearchFilter": {
@@ -5205,6 +5467,76 @@
5205
5467
  }
5206
5468
  ]
5207
5469
  },
5470
+ "EventCatalogTrigger": {
5471
+ "description": "Starts the flow when an Event Catalog event is published for the organization. The execution runs in the context of one entity from the event's entity graph (`entity_node_id`), and the event payload is available to conditions and actions as the `event` variable context.\n",
5472
+ "allOf": [
5473
+ {
5474
+ "$ref": "#/components/schemas/AutomationTrigger"
5475
+ },
5476
+ {
5477
+ "type": "object",
5478
+ "properties": {
5479
+ "type": {
5480
+ "type": "string",
5481
+ "enum": [
5482
+ "event_catalog"
5483
+ ]
5484
+ },
5485
+ "configuration": {
5486
+ "type": "object",
5487
+ "properties": {
5488
+ "event_name": {
5489
+ "type": "string",
5490
+ "description": "Name of the Event Catalog event that starts this flow",
5491
+ "example": "CustomerRequestSubmitted"
5492
+ },
5493
+ "event_version": {
5494
+ "type": "string",
5495
+ "description": "Event version (MAJOR.MINOR) this trigger is pinned to. Payloads published in a newer version are downgraded to this version before the flow runs, so field references in conditions and actions stay stable.\n",
5496
+ "example": "1.1"
5497
+ },
5498
+ "entity_node_id": {
5499
+ "type": "string",
5500
+ "description": "Id of the cardinality-one node in the event's entity graph whose entity becomes the execution's main entity (the entity actions operate on).\n",
5501
+ "example": "ticket"
5502
+ },
5503
+ "entity_schema": {
5504
+ "type": "string",
5505
+ "description": "Schema of the entity behind `entity_node_id`, denormalized from the event definition at configuration time",
5506
+ "example": "ticket"
5507
+ },
5508
+ "ignore_automation_triggered": {
5509
+ "type": "boolean",
5510
+ "default": true,
5511
+ "description": "When true (default), events that were emitted by an automation (`_trigger_source_type: automation`) do not start this flow. This prevents automation → event → automation chains unless explicitly enabled.\n"
5512
+ }
5513
+ },
5514
+ "required": [
5515
+ "event_name",
5516
+ "event_version",
5517
+ "entity_node_id",
5518
+ "entity_schema"
5519
+ ]
5520
+ }
5521
+ },
5522
+ "required": [
5523
+ "type",
5524
+ "configuration"
5525
+ ]
5526
+ }
5527
+ ],
5528
+ "example": {
5529
+ "id": "12d4f45a-1883-4841-a94c-5928cb338a94",
5530
+ "type": "event_catalog",
5531
+ "configuration": {
5532
+ "event_name": "CustomerRequestSubmitted",
5533
+ "event_version": "1.1",
5534
+ "entity_node_id": "ticket",
5535
+ "entity_schema": "ticket",
5536
+ "ignore_automation_triggered": true
5537
+ }
5538
+ }
5539
+ },
5208
5540
  "TriggerCondition": {
5209
5541
  "type": "object",
5210
5542
  "properties": {
@@ -48,6 +48,39 @@
48
48
  }
49
49
  }
50
50
  }
51
+ },
52
+ "post": {
53
+ "operationId": "createCustomEvent",
54
+ "summary": "createCustomEvent",
55
+ "description": "Reserve an org-scoped custom event name and persist its immutable v1.0 draft definition.",
56
+ "tags": [
57
+ "Event Catalog"
58
+ ],
59
+ "requestBody": {
60
+ "required": true,
61
+ "content": {
62
+ "application/json": {
63
+ "schema": {
64
+ "$ref": "#/components/schemas/CreateCustomEventPayload"
65
+ }
66
+ }
67
+ }
68
+ },
69
+ "responses": {
70
+ "201": {
71
+ "description": "Custom event draft created",
72
+ "content": {
73
+ "application/json": {
74
+ "schema": {
75
+ "$ref": "#/components/schemas/EventConfig"
76
+ }
77
+ }
78
+ }
79
+ },
80
+ "409": {
81
+ "description": "Name is reserved by a built-in or existing org event"
82
+ }
83
+ }
51
84
  }
52
85
  },
53
86
  "/v1/events/{event_name}": {
@@ -125,6 +158,127 @@
125
158
  "description": "Event not found"
126
159
  }
127
160
  }
161
+ },
162
+ "delete": {
163
+ "operationId": "deprecateCustomEvent",
164
+ "summary": "deprecateCustomEvent",
165
+ "description": "Soft-deprecate an org-scoped custom event. Definitions and v1.0 history remain readable.",
166
+ "tags": [
167
+ "Event Catalog"
168
+ ],
169
+ "parameters": [
170
+ {
171
+ "name": "event_name",
172
+ "in": "path",
173
+ "required": true,
174
+ "schema": {
175
+ "type": "string"
176
+ }
177
+ }
178
+ ],
179
+ "responses": {
180
+ "204": {
181
+ "description": "Custom event deprecated"
182
+ },
183
+ "404": {
184
+ "description": "Event not found"
185
+ },
186
+ "409": {
187
+ "description": "Built-ins cannot be deprecated or lifecycle cannot transition"
188
+ }
189
+ }
190
+ }
191
+ },
192
+ "/v1/events/{event_name}:preview": {
193
+ "post": {
194
+ "operationId": "previewCustomEvent",
195
+ "summary": "previewCustomEvent",
196
+ "description": "Assemble and fully validate a persisted custom-event draft without publishing it.",
197
+ "tags": [
198
+ "Event Catalog"
199
+ ],
200
+ "parameters": [
201
+ {
202
+ "name": "event_name",
203
+ "in": "path",
204
+ "required": true,
205
+ "schema": {
206
+ "type": "string"
207
+ }
208
+ }
209
+ ],
210
+ "requestBody": {
211
+ "required": true,
212
+ "content": {
213
+ "application/json": {
214
+ "schema": {
215
+ "$ref": "#/components/schemas/TriggerEventPayload"
216
+ }
217
+ }
218
+ }
219
+ },
220
+ "responses": {
221
+ "200": {
222
+ "description": "Deterministic preview result",
223
+ "content": {
224
+ "application/json": {
225
+ "schema": {
226
+ "$ref": "#/components/schemas/PreviewEventResponse"
227
+ }
228
+ }
229
+ }
230
+ },
231
+ "400": {
232
+ "description": "Projection or schema validation failed"
233
+ },
234
+ "404": {
235
+ "description": "Custom event not found"
236
+ }
237
+ }
238
+ }
239
+ },
240
+ "/v1/events/{event_name}:publish": {
241
+ "post": {
242
+ "operationId": "publishCustomEventDefinition",
243
+ "summary": "publishCustomEventDefinition",
244
+ "description": "Conditionally activate an immutable custom-event v1.0 definition.",
245
+ "tags": [
246
+ "Event Catalog"
247
+ ],
248
+ "parameters": [
249
+ {
250
+ "name": "event_name",
251
+ "in": "path",
252
+ "required": true,
253
+ "schema": {
254
+ "type": "string"
255
+ }
256
+ }
257
+ ],
258
+ "requestBody": {
259
+ "content": {
260
+ "application/json": {
261
+ "schema": {
262
+ "$ref": "#/components/schemas/PublishCustomEventPayload"
263
+ }
264
+ }
265
+ }
266
+ },
267
+ "responses": {
268
+ "200": {
269
+ "description": "Published event configuration",
270
+ "content": {
271
+ "application/json": {
272
+ "schema": {
273
+ "$ref": "#/components/schemas/EventConfig"
274
+ }
275
+ }
276
+ }
277
+ },
278
+ "409": {
279
+ "description": "Definition is not a draft or base publication choice is invalid"
280
+ }
281
+ }
128
282
  }
129
283
  },
130
284
  "/v1/events/{event_name}/json_schema": {
@@ -437,7 +591,7 @@
437
591
  "post": {
438
592
  "operationId": "triggerEvent",
439
593
  "summary": "triggerEvent",
440
- "description": "Explicitly trigger an event by providing input field values and an optional entity seed\nfor graph hydration. The event must be enabled for the organization.\n\n- For events with an entity_graph, a seed (entity_id + node_id) is required\n- For events without an entity_graph, only fields are needed\n- Entity operation context fields (operation, trigger_entity, activity_id, activity_type)\n are not included when triggering via API\n",
594
+ "description": "Explicitly trigger an event by providing input field values and an optional entity seed\nfor graph hydration. The event must be enabled for the organization.\n\n- For events with an entity_graph, a seed (entity_id + node_id) is required\n- For events without an entity_graph, only fields are needed\n- Entity operation context fields (operation, trigger_entity, activity_id, activity_type)\n are not included when triggering via API\n- Events marked `automation_trigger_only` require `_trigger_source_type: automation` and a\n stable execution/action ID in `_trigger_source`; retries with that ID return the same\n logical event, including while durable delivery is pending\n",
441
595
  "tags": [
442
596
  "Event Catalog"
443
597
  ],
@@ -464,7 +618,7 @@
464
618
  },
465
619
  "responses": {
466
620
  "200": {
467
- "description": "Event triggered successfully",
621
+ "description": "Event published successfully",
468
622
  "content": {
469
623
  "application/json": {
470
624
  "schema": {
@@ -481,6 +635,33 @@
481
635
  },
482
636
  "404": {
483
637
  "description": "Event not found"
638
+ },
639
+ "409": {
640
+ "description": "The Automation trigger source was already used with different trigger input, including a different entity seed"
641
+ },
642
+ "425": {
643
+ "description": "The hydrated entity graph is not ready yet, another request currently owns the\nidempotency lease, or a durably queued event (including an already-requested redrive)\nis awaiting publication. Automation must retry with the same trigger source and may\nadvance only after a 200 response.\n",
644
+ "headers": {
645
+ "Retry-After": {
646
+ "description": "Seconds before the Automation action should retry",
647
+ "schema": {
648
+ "type": "integer",
649
+ "minimum": 1
650
+ }
651
+ }
652
+ }
653
+ },
654
+ "503": {
655
+ "description": "Durable delivery exhausted its bounded automatic redrives. The same logical event is\nretained and no new event is created. An API retry with the same trigger source\nrequests a redrive of the existing Standard workflow from its failed task checkpoint\nand receives this retryable response. Subsequent retries receive 425 while that\nredrive is pending or running.\n",
656
+ "headers": {
657
+ "Retry-After": {
658
+ "description": "Seconds before the Automation action should retry",
659
+ "schema": {
660
+ "type": "integer",
661
+ "minimum": 1
662
+ }
663
+ }
664
+ }
484
665
  }
485
666
  }
486
667
  }
@@ -594,6 +775,34 @@
594
775
  "default": false,
595
776
  "example": true
596
777
  },
778
+ "automation_trigger_only": {
779
+ "type": "boolean",
780
+ "readOnly": true,
781
+ "description": "Whether explicit triggering is restricted to Automation. When true, callers must pass\n`_trigger_source_type: automation` and a stable `_trigger_source`. The trigger uses\nstrict entity readiness validation and the durable Automation outbox.\nRequires `automation_trigger: true` and cannot be combined with `entity_operation`.\n",
782
+ "default": false,
783
+ "example": true
784
+ },
785
+ "automation_trigger_seed_node": {
786
+ "type": "string",
787
+ "readOnly": true,
788
+ "description": "Required entity-graph seed node for an Automation-only trigger. When configured, an\nexplicit trigger using any other node is rejected before hydration.\n",
789
+ "example": "ticket"
790
+ },
791
+ "event_origin": {
792
+ "type": "string",
793
+ "readOnly": true,
794
+ "enum": [
795
+ "builtin",
796
+ "custom"
797
+ ],
798
+ "description": "Definition ownership. Built-ins always win a name collision."
799
+ },
800
+ "mapping": {
801
+ "$ref": "#/components/schemas/EventMapping"
802
+ },
803
+ "lineage": {
804
+ "$ref": "#/components/schemas/CustomEventLineage"
805
+ },
597
806
  "success_criteria": {
598
807
  "type": "array",
599
808
  "description": "Org-defined success criteria for this event: the entity attributes that an\norganization considers must be captured for an event change request to be\ntreated as complete (e.g. for telephony / self-service flows).\n\nAdvisory metadata — event-catalog does NOT require an org to define any and\ndoes NOT enforce them when an event is triggered or published. The org may\ndefine none (empty array or omitted). When provided, each entry is validated\nfor well-formedness on write (see SuccessCriterion).\n",
@@ -629,17 +838,187 @@
629
838
  }
630
839
  ]
631
840
  },
632
- "UpdateEventPayload": {
633
- "description": "Payload for updating an event configuration.\nAccepts the same fields as EventConfig (all optional for PATCH).\nCurrently `enabled`, `auto_trigger` and `success_criteria` fields are processed.\n",
634
- "allOf": [
635
- {
636
- "$ref": "#/components/schemas/EventConfigBase"
841
+ "CreateCustomEventPayload": {
842
+ "type": "object",
843
+ "description": "Complete immutable custom-event v1.0 definition. Publication is a separate conditional action.",
844
+ "properties": {
845
+ "event_name": {
846
+ "type": "string",
847
+ "pattern": "^[A-Z][A-Za-z0-9]{2,79}$"
637
848
  },
638
- {
639
- "type": "object"
849
+ "event_title": {
850
+ "type": "string",
851
+ "minLength": 1,
852
+ "maxLength": 160
853
+ },
854
+ "event_description": {
855
+ "type": "string",
856
+ "maxLength": 2000
857
+ },
858
+ "event_tags": {
859
+ "type": "array",
860
+ "items": {
861
+ "type": "string"
862
+ }
863
+ },
864
+ "schema_fields": {
865
+ "type": "object",
866
+ "additionalProperties": {
867
+ "$ref": "#/components/schemas/CustomSchemaField"
868
+ }
869
+ },
870
+ "entity_graph": {
871
+ "$ref": "#/components/schemas/GraphDefinition"
872
+ },
873
+ "entity_operation": {
874
+ "$ref": "#/components/schemas/EntityOperationTrigger"
875
+ },
876
+ "automation_trigger": {
877
+ "type": "boolean",
878
+ "default": true
879
+ },
880
+ "mapping": {
881
+ "$ref": "#/components/schemas/EventMapping"
882
+ },
883
+ "lineage": {
884
+ "$ref": "#/components/schemas/CustomEventLineage"
885
+ },
886
+ "example": {
887
+ "type": "object",
888
+ "additionalProperties": true
889
+ }
890
+ },
891
+ "required": [
892
+ "event_name",
893
+ "event_title",
894
+ "schema_fields"
895
+ ]
896
+ },
897
+ "EventMapping": {
898
+ "type": "object",
899
+ "description": "Guided mappings use schema_fields graph_source expressions; raw mode evaluates one JSONata object transform.",
900
+ "properties": {
901
+ "mode": {
902
+ "type": "string",
903
+ "enum": [
904
+ "guided",
905
+ "jsonata"
906
+ ],
907
+ "default": "guided"
908
+ },
909
+ "jsonata": {
910
+ "type": "string",
911
+ "minLength": 1,
912
+ "maxLength": 20000
640
913
  }
914
+ },
915
+ "required": [
916
+ "mode"
641
917
  ]
642
918
  },
919
+ "CustomEventLineage": {
920
+ "type": "object",
921
+ "description": "Optional catalog lineage to a separately named base event. It does not replace the base event.",
922
+ "properties": {
923
+ "base_event_name": {
924
+ "type": "string"
925
+ },
926
+ "base_event_version": {
927
+ "type": "string"
928
+ }
929
+ },
930
+ "required": [
931
+ "base_event_name",
932
+ "base_event_version"
933
+ ]
934
+ },
935
+ "PurposeFilterSnapshot": {
936
+ "type": "object",
937
+ "properties": {
938
+ "id": {
939
+ "type": "string",
940
+ "minLength": 1
941
+ },
942
+ "display_name": {
943
+ "type": "string",
944
+ "minLength": 1
945
+ }
946
+ },
947
+ "required": [
948
+ "id",
949
+ "display_name"
950
+ ]
951
+ },
952
+ "PublishCustomEventPayload": {
953
+ "type": "object",
954
+ "properties": {
955
+ "enabled": {
956
+ "type": "boolean",
957
+ "default": true
958
+ },
959
+ "auto_trigger": {
960
+ "type": "boolean",
961
+ "default": true
962
+ },
963
+ "base_auto_trigger_enabled": {
964
+ "type": "boolean",
965
+ "description": "Optional publication choice. False disables only the named lineage base event's org auto-trigger overlay."
966
+ }
967
+ }
968
+ },
969
+ "ValidationIssue": {
970
+ "type": "object",
971
+ "properties": {
972
+ "path": {
973
+ "type": "string"
974
+ },
975
+ "message": {
976
+ "type": "string"
977
+ }
978
+ },
979
+ "required": [
980
+ "path",
981
+ "message"
982
+ ]
983
+ },
984
+ "PreviewEventResponse": {
985
+ "type": "object",
986
+ "properties": {
987
+ "payload": {
988
+ "type": "object",
989
+ "additionalProperties": true
990
+ },
991
+ "errors": {
992
+ "type": "array",
993
+ "items": {
994
+ "$ref": "#/components/schemas/ValidationIssue"
995
+ }
996
+ }
997
+ },
998
+ "required": [
999
+ "payload",
1000
+ "errors"
1001
+ ]
1002
+ },
1003
+ "UpdateEventPayload": {
1004
+ "type": "object",
1005
+ "description": "Mutable org activation overlay. Immutable event definition fields are not accepted.",
1006
+ "properties": {
1007
+ "enabled": {
1008
+ "type": "boolean"
1009
+ },
1010
+ "auto_trigger": {
1011
+ "type": "boolean"
1012
+ },
1013
+ "success_criteria": {
1014
+ "type": "array",
1015
+ "items": {
1016
+ "$ref": "#/components/schemas/SuccessCriterion"
1017
+ }
1018
+ }
1019
+ },
1020
+ "additionalProperties": false
1021
+ },
643
1022
  "PrimitiveField": {
644
1023
  "type": "object",
645
1024
  "description": "A primitive JSON Schema field definition",
@@ -700,6 +1079,17 @@
700
1079
  "items"
701
1080
  ]
702
1081
  },
1082
+ "CustomSchemaField": {
1083
+ "description": "Custom v1 fields support JSON Schema values and context entities; attachment semantics are built-in-only.",
1084
+ "oneOf": [
1085
+ {
1086
+ "$ref": "#/components/schemas/PrimitiveField"
1087
+ },
1088
+ {
1089
+ "$ref": "#/components/schemas/ContextEntity"
1090
+ }
1091
+ ]
1092
+ },
703
1093
  "SchemaField": {
704
1094
  "oneOf": [
705
1095
  {
@@ -982,6 +1372,13 @@
982
1372
  "items": {
983
1373
  "$ref": "#/components/schemas/InlineDowngradeStep"
984
1374
  }
1375
+ },
1376
+ "_automation_chain": {
1377
+ "type": "array",
1378
+ "description": "Ordered automation flow ids that caused this event (at most 100), propagated verbatim from the trigger input or the originating entity operation. Internal loop-prevention transport for automation-api; svc-webhooks strips it before delivery.",
1379
+ "items": {
1380
+ "type": "string"
1381
+ }
985
1382
  }
986
1383
  },
987
1384
  "required": [
@@ -1208,6 +1605,13 @@
1208
1605
  "Kündigung",
1209
1606
  "Umzug/Auszug"
1210
1607
  ]
1608
+ },
1609
+ "purpose_filters": {
1610
+ "type": "array",
1611
+ "description": "Stable purpose IDs plus immutable display-name snapshots for custom events.",
1612
+ "items": {
1613
+ "$ref": "#/components/schemas/PurposeFilterSnapshot"
1614
+ }
1211
1615
  }
1212
1616
  },
1213
1617
  "required": [
@@ -1300,6 +1704,14 @@
1300
1704
  "TriggerEventPayload": {
1301
1705
  "type": "object",
1302
1706
  "description": "Payload for explicitly triggering an event via API",
1707
+ "example": {
1708
+ "seed": {
1709
+ "entity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1710
+ "node_id": "ticket"
1711
+ },
1712
+ "_trigger_source_type": "automation",
1713
+ "_trigger_source": "execution-id/action-id"
1714
+ },
1303
1715
  "properties": {
1304
1716
  "seed": {
1305
1717
  "type": "object",
@@ -1338,7 +1750,14 @@
1338
1750
  },
1339
1751
  "_trigger_source": {
1340
1752
  "type": "string",
1341
- "description": "Identifier of the specific trigger source.\nExamples: user ID, automation execution ID, activity ID, portal user email\nDefaults to the calling user ID if not specified.\n"
1753
+ "description": "Identifier of the specific trigger source.\nExamples: user ID, automation execution ID, activity ID, portal user email\nDefaults to the calling user ID if not specified.\nRequired for events marked `automation_trigger_only` and must remain stable across\naction retries.\n"
1754
+ },
1755
+ "_automation_chain": {
1756
+ "type": "array",
1757
+ "description": "Ordered automation flow ids that caused this trigger (at most 100); propagated verbatim onto the published event for automation loop prevention.",
1758
+ "items": {
1759
+ "type": "string"
1760
+ }
1342
1761
  }
1343
1762
  }
1344
1763
  },
@@ -1348,7 +1767,7 @@
1348
1767
  "properties": {
1349
1768
  "success": {
1350
1769
  "type": "boolean",
1351
- "description": "Whether the event was triggered successfully"
1770
+ "description": "Whether the event was published successfully"
1352
1771
  },
1353
1772
  "event_id": {
1354
1773
  "type": "string",
@@ -1356,7 +1775,7 @@
1356
1775
  },
1357
1776
  "event_bridge_event_id": {
1358
1777
  "type": "string",
1359
- "description": "EventBridge event ID from publishing"
1778
+ "description": "EventBridge event ID when synchronous delivery or a completed retry provides it"
1360
1779
  }
1361
1780
  },
1362
1781
  "required": [
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  API_LIST
4
- } from "../chunk-4EODPJ5A.js";
4
+ } from "../chunk-GNZOIBKX.js";
5
5
 
6
6
  // bin/epilot.ts
7
7
  import { runMain } from "citty";
@@ -11,7 +11,7 @@ import { defineCommand } from "citty";
11
11
  var main = defineCommand({
12
12
  meta: {
13
13
  name: "epilot",
14
- version: "0.1.144",
14
+ version: "0.1.145",
15
15
  description: "CLI for epilot APIs"
16
16
  },
17
17
  args: {
@@ -30,8 +30,8 @@ var main = defineCommand({
30
30
  auth: () => import("../auth-WMXFMPWE.js").then((m) => m.default),
31
31
  profile: () => import("../profile-OZJL5ZPT.js").then((m) => m.default),
32
32
  config: () => import("../config-DGZIMLZK.js").then((m) => m.default),
33
- completion: () => import("../completion-HPDI7RNO.js").then((m) => m.default),
34
- upgrade: () => import("../upgrade-4LGBIDMY.js").then((m) => m.default),
33
+ completion: () => import("../completion-RZ6CSKPV.js").then((m) => m.default),
34
+ upgrade: () => import("../upgrade-4DRMPNCM.js").then((m) => m.default),
35
35
  "access-token": () => import("../access-token-WWE6BDJH.js").then((m) => m.default),
36
36
  address: () => import("../address-EH3C4CVB.js").then((m) => m.default),
37
37
  "address-suggestions": () => import("../address-suggestions-RRSLOBFW.js").then((m) => m.default),
@@ -134,13 +134,13 @@ process.stderr.on("error", (err) => {
134
134
  if (err.code === "EPIPE") process.exit(0);
135
135
  throw err;
136
136
  });
137
- var VERSION = true ? "0.1.144" : (await null).default.version;
137
+ var VERSION = true ? "0.1.145" : (await null).default.version;
138
138
  var reorderedArgv = hoistFlagsAfterSubcommand(process.argv.slice(2));
139
139
  process.argv = [process.argv[0], process.argv[1], ...reorderedArgv];
140
140
  var args = process.argv.slice(2);
141
141
  var completionsIdx = args.indexOf("--_completions");
142
142
  if (completionsIdx >= 0) {
143
- const { handleCompletions } = await import("../completion-HPDI7RNO.js");
143
+ const { handleCompletions } = await import("../completion-RZ6CSKPV.js");
144
144
  handleCompletions(args[completionsIdx + 1], args[completionsIdx + 2]);
145
145
  process.exit(0);
146
146
  }
@@ -810,11 +810,15 @@ var API_LIST = [
810
810
  kebabName: "event-catalog",
811
811
  title: "Event Catalog API",
812
812
  serverUrl: "https://event-catalog.sls.epilot.io",
813
- operationCount: 10,
813
+ operationCount: 14,
814
814
  operationIds: [
815
815
  "listEvents",
816
+ "createCustomEvent",
816
817
  "getEvent",
817
818
  "patchEvent",
819
+ "deprecateCustomEvent",
820
+ "previewCustomEvent",
821
+ "publishCustomEventDefinition",
818
822
  "getEventJSONSchema",
819
823
  "getEventExample",
820
824
  "listEventVersions",
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  API_LIST
4
- } from "./chunk-4EODPJ5A.js";
4
+ } from "./chunk-GNZOIBKX.js";
5
5
  import {
6
6
  DIM,
7
7
  GREEN,
@@ -72,7 +72,7 @@ ${GREEN}${BOLD}Upgraded to @epilot/cli@${latest}${RESET}
72
72
  }
73
73
  });
74
74
  var getCurrentVersion = () => {
75
- if (true) return "0.1.144";
75
+ if (true) return "0.1.145";
76
76
  try {
77
77
  const output = execSync("npm ls -g @epilot/cli --depth=0 --json 2>/dev/null", {
78
78
  encoding: "utf-8",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epilot/cli",
3
- "version": "0.1.144",
3
+ "version": "0.1.145",
4
4
  "description": "CLI for epilot APIs",
5
5
  "type": "module",
6
6
  "bin": {