@automagik/omni 2.260915.19 → 2.260915.21

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.
@@ -79,6 +79,46 @@ export interface paths {
79
79
  patch?: never;
80
80
  trace?: never;
81
81
  };
82
+ "/audit": {
83
+ parameters: {
84
+ query?: never;
85
+ header?: never;
86
+ path?: never;
87
+ cookie?: never;
88
+ };
89
+ /**
90
+ * List config-mutation audit entries
91
+ * @description One entry per POST/PATCH/PUT/DELETE on instances, agents, providers, routes, automations, API keys and settings. Reads are never recorded. Scope: `audit:read`.
92
+ */
93
+ get: operations["listConfigAudit"];
94
+ put?: never;
95
+ post?: never;
96
+ delete?: never;
97
+ options?: never;
98
+ head?: never;
99
+ patch?: never;
100
+ trace?: never;
101
+ };
102
+ "/audit/{id}": {
103
+ parameters: {
104
+ query?: never;
105
+ header?: never;
106
+ path?: never;
107
+ cookie?: never;
108
+ };
109
+ /**
110
+ * Get one config-mutation audit entry
111
+ * @description Scope: `audit:read`.
112
+ */
113
+ get: operations["getConfigAudit"];
114
+ put?: never;
115
+ post?: never;
116
+ delete?: never;
117
+ options?: never;
118
+ head?: never;
119
+ patch?: never;
120
+ trace?: never;
121
+ };
82
122
  "/auth/validate": {
83
123
  parameters: {
84
124
  query?: never;
@@ -1114,7 +1154,7 @@ export interface paths {
1114
1154
  put?: never;
1115
1155
  /**
1116
1156
  * Trigger custom event
1117
- * @description Manually trigger a custom event.
1157
+ * @description Manually trigger a custom event. The effective payload ceiling is the NATS `max_payload` (1 MB by default), not OMNI_API_BODY_LIMIT_MB; larger events are rejected with 413. For large bodies, store the body elsewhere (e.g. object storage) and publish a reference to it.
1118
1158
  */
1119
1159
  post: operations["triggerEvent"];
1120
1160
  delete?: never;
@@ -1683,6 +1723,26 @@ export interface paths {
1683
1723
  patch?: never;
1684
1724
  trace?: never;
1685
1725
  };
1726
+ "/channels/capabilities": {
1727
+ parameters: {
1728
+ query?: never;
1729
+ header?: never;
1730
+ path?: never;
1731
+ cookie?: never;
1732
+ };
1733
+ /**
1734
+ * Channel capability matrix
1735
+ * @description Event types and guarantees (edits, deletes, idempotency) each loaded channel plugin declares. Declarations are verified against the channel code by a static test.
1736
+ */
1737
+ get: operations["listChannelCapabilities"];
1738
+ put?: never;
1739
+ post?: never;
1740
+ delete?: never;
1741
+ options?: never;
1742
+ head?: never;
1743
+ patch?: never;
1744
+ trace?: never;
1745
+ };
1686
1746
  "/events/schemas": {
1687
1747
  parameters: {
1688
1748
  query?: never;
@@ -3030,6 +3090,38 @@ export interface components {
3030
3090
  /** @description Optional success message */
3031
3091
  message?: string;
3032
3092
  };
3093
+ ConfigAuditLog: {
3094
+ /** Format: uuid */
3095
+ id: string;
3096
+ /** @description Acting API key id */
3097
+ apiKeyId: string | null;
3098
+ /** @description Acting API key name */
3099
+ apiKeyName: string | null;
3100
+ /** @description X-Omni-Actor header, e.g. cli:alice or claude-session:<id> */
3101
+ actor: string | null;
3102
+ requestId: string | null;
3103
+ /** @description Client IP (X-Forwarded-For / X-Real-IP / socket) */
3104
+ ipAddress: string | null;
3105
+ userAgent: string | null;
3106
+ method: string;
3107
+ path: string;
3108
+ statusCode: number;
3109
+ /** @description e.g. instance.create, instance.update, instance.connect */
3110
+ action: string;
3111
+ /** @description instance | agent | provider | route | automation | api_key | setting */
3112
+ targetType: string;
3113
+ targetId: string | null;
3114
+ changedFields: string[];
3115
+ /** @description Before/after per changed field. Secret-bearing values appear only as sha256:<prefix> fingerprints. */
3116
+ changes: {
3117
+ [key: string]: {
3118
+ before?: unknown;
3119
+ after?: unknown;
3120
+ };
3121
+ };
3122
+ /** Format: date-time */
3123
+ createdAt: string;
3124
+ };
3033
3125
  AuthValidateResponse: {
3034
3126
  data: {
3035
3127
  /** @description Whether the API key is valid */
@@ -3217,7 +3309,7 @@ export interface components {
3217
3309
  agentId?: string | null;
3218
3310
  /**
3219
3311
  * Format: uuid
3220
- * @description Provider ID (agent provider)
3312
+ * @description Provider ID of the assigned agent (read-only; set via the agent)
3221
3313
  */
3222
3314
  agentProviderId?: string | null;
3223
3315
  /** @description Agent timeout in seconds */
@@ -3921,6 +4013,10 @@ export interface components {
3921
4013
  avgAgentTimeMs: number | null;
3922
4014
  /** @description Sum of agent run cost (USD) stamped on events in range */
3923
4015
  totalCostUsd: number;
4016
+ /** @description Agent run cost (USD) grouped by event type, for events with a stamped cost */
4017
+ costByEventType: {
4018
+ [key: string]: number;
4019
+ };
3924
4020
  /** @description Count by content type */
3925
4021
  messageTypes: {
3926
4022
  [key: string]: number;
@@ -4471,6 +4567,8 @@ export interface components {
4471
4567
  hasSignatureSecret: boolean;
4472
4568
  /** @description Idempotency key derivation template */
4473
4569
  idempotencyKeyTemplate: string;
4570
+ /** @description Whether custom-template idempotency keys are shared across event types (opt-in collapsing) */
4571
+ idempotencyAcrossEventTypes: boolean;
4474
4572
  /** @description Redeliveries acked without creating a second event */
4475
4573
  totalDuplicates: number;
4476
4574
  /** @description Strict schema mode: deliveries resolving to an event type with no enabled registered schema are refused and dead-lettered with reason schema_not_registered */
@@ -4554,6 +4652,8 @@ export interface components {
4554
4652
  signatureSecret?: string | null;
4555
4653
  /** @description How the delivery-identity idempotency key is derived for this source. Placeholders: {source}, {sha256(body)}, {headers.<name>}, {payload.<dot.path>}. A delivery whose key is already journaled is acked (200, duplicate: true) without creating a second event. Defaults to "{source}:{sha256(body)}". This dedupes provider REDELIVERY, not semantic identity. */
4556
4654
  idempotencyKeyTemplate?: string;
4655
+ /** @description By default a custom idempotency key is prefixed with the resolved event type, so different event types for the same entity never collide. Set true to collapse keys across event types (a second type for the same rendered key is acked as a duplicate). Defaults to false. */
4656
+ idempotencyAcrossEventTypes?: boolean;
4557
4657
  /** @description Strict schema mode (RFC #925 G1 policy switch): when true, a delivery resolving to an event type with no enabled registered schema is refused and dead-lettered with reason schema_not_registered (manual retry only) instead of passing through. Defaults to false (opt-in pass-through). Recommended true for NEW sources — they have no legacy emitters to grandfather. */
4558
4658
  strictSchemas?: boolean;
4559
4659
  /** @description Semantic event-type extraction (e.g. header X-GitHub-Event: push emits custom.{source}.push). Null or absent keeps the legacy collapsed custom.webhook.{source} type for every delivery. */
@@ -4574,6 +4674,17 @@ export interface components {
4574
4674
  /** @description Dot-path to the event name in the payload (e.g. "event"); numeric segments index arrays. 1-200 characters */
4575
4675
  path: string;
4576
4676
  } | unknown;
4677
+ /** @description Supervised pull connector (#1186): run `command` (must live inside OMNI_POLL_COMMAND_DIR) every intervalSeconds; each JSON stdout line becomes an emitType event deduped by dedupKeyTemplate. Null makes the source push-only again. */
4678
+ pollConfig?: {
4679
+ command: string;
4680
+ intervalSeconds: number;
4681
+ emitType: string;
4682
+ /** @default {source}:{sha256(body)} */
4683
+ dedupKeyTemplate: string;
4684
+ env?: {
4685
+ [key: string]: string;
4686
+ };
4687
+ } | null;
4577
4688
  /**
4578
4689
  * @description Whether enabled
4579
4690
  * @default true
@@ -5591,6 +5702,20 @@ export interface components {
5591
5702
  deleted: number;
5592
5703
  };
5593
5704
  };
5705
+ ChannelCapabilities: {
5706
+ /** @description Channel type (e.g. whatsapp-baileys) */
5707
+ id: string;
5708
+ /** @description Human-readable channel name */
5709
+ name: string;
5710
+ /** @description Core event types the channel publishes; null when the plugin declares none */
5711
+ emits: string[] | null;
5712
+ /** @description true/false as established from the channel's code; 'unknown' when undeclared */
5713
+ edits: boolean | "unknown";
5714
+ /** @description true/false as established from the channel's code; 'unknown' when undeclared */
5715
+ deletes: boolean | "unknown";
5716
+ /** @description true/false as established from the channel's code; 'unknown' when undeclared */
5717
+ idempotency: boolean | "unknown";
5718
+ };
5594
5719
  EventSchema: {
5595
5720
  /**
5596
5721
  * Format: uuid
@@ -5674,6 +5799,8 @@ export interface components {
5674
5799
  }[] | null;
5675
5800
  /** @description Last acked journal_seq; delivery resumes strictly after it */
5676
5801
  cursor: number;
5802
+ /** @description true = competing consumers (pullers on this name split the stream); false = own cursor (fan-out) */
5803
+ shared: boolean;
5677
5804
  /** @description Highest journal_seq currently in the journal */
5678
5805
  head: number;
5679
5806
  /** @description head - cursor (all journal rows past the cursor, not only matches) */
@@ -5715,6 +5842,8 @@ export interface components {
5715
5842
  * @enum {string}
5716
5843
  */
5717
5844
  startFrom?: "now" | "beginning";
5845
+ /** @description Competing consumers (#1188). false (default) = fan-out: every consumer name has its own cursor and sees every event. true = N pullers on THIS name split the stream: each pull leases a page to one puller, ack(leaseId) releases it, an unacked lease is redelivered after leaseMs (at-least-once). */
5846
+ shared?: boolean;
5718
5847
  };
5719
5848
  ConsumerPullResult: {
5720
5849
  /** @description Consumer name */
@@ -5731,6 +5860,8 @@ export interface components {
5731
5860
  hasMore: boolean;
5732
5861
  /** @description A full scan window matched nothing; the stored cursor was advanced past it (#1128) */
5733
5862
  scanExhausted: boolean;
5863
+ /** @description Shared consumers only: ack this lease once the items are handled (absent when nothing delivered) */
5864
+ leaseId?: string;
5734
5865
  };
5735
5866
  Automation: {
5736
5867
  /**
@@ -5834,6 +5965,8 @@ export interface components {
5834
5965
  timeoutMs?: number;
5835
5966
  /** @description Store agent response as variable for chaining (e.g., "agentResponse") */
5836
5967
  responseAs?: string;
5968
+ /** @description Await the agent run (default true). False = return the runId once dispatched; outcome published as system.agent.run_completed. Incompatible with responseAs */
5969
+ waitForResponse?: boolean;
5837
5970
  };
5838
5971
  })[];
5839
5972
  /** @description Debounce config */
@@ -5855,6 +5988,8 @@ export interface components {
5855
5988
  priority: number;
5856
5989
  /** @description Transactional publication (G5, #988): buffer the run's emit_event publishes and flush them in order only when every action succeeded; a failed run publishes zero */
5857
5990
  transactionalEmissions: boolean;
5991
+ /** @description Loop guard opt-in (#1148): act on events sent by one of the tenant’s own instances */
5992
+ allowInstanceSenders: boolean;
5858
5993
  /** @description Per-automation concurrency limit (#1108). null = queued per instance with the engine default; set = a queue private to this automation, 1 being strict single-flight */
5859
5994
  maxConcurrency: number | null;
5860
5995
  /** @description Template over the event payload partitioning this automation’s queue (#1108), e.g. "{{payload.from.id}}" to serialize per chat; null = one queue for the whole automation */
@@ -5973,6 +6108,8 @@ export interface components {
5973
6108
  timeoutMs?: number;
5974
6109
  /** @description Store agent response as variable for chaining (e.g., "agentResponse") */
5975
6110
  responseAs?: string;
6111
+ /** @description Await the agent run (default true). False = return the runId once dispatched; outcome published as system.agent.run_completed. Incompatible with responseAs */
6112
+ waitForResponse?: boolean;
5976
6113
  };
5977
6114
  })[];
5978
6115
  /** @description Debounce config */
@@ -6003,6 +6140,11 @@ export interface components {
6003
6140
  * @default false
6004
6141
  */
6005
6142
  transactionalEmissions: boolean;
6143
+ /**
6144
+ * @description Loop guard opt-in (#1148): by default events sent by one of the tenant’s own instances (payload.senderInstanceId) are skipped. True = act on them anyway
6145
+ * @default false
6146
+ */
6147
+ allowInstanceSenders: boolean;
6006
6148
  /** @description Per-automation concurrency limit (#1108). Omit/null = today’s per-instance queueing with the engine default; 1 = strict single-flight, which is what a read-before-write action needs */
6007
6149
  maxConcurrency?: number | null;
6008
6150
  /** @description Template over the event payload partitioning this automation’s queue (#1108), e.g. "{{payload.from.id}}" to serialize per chat; omit/null = one queue for the whole automation */
@@ -6254,6 +6396,12 @@ export interface components {
6254
6396
  latencies: {
6255
6397
  /** @description T1 - T0 (ms) */
6256
6398
  channelProcessing?: number;
6399
+ /** @description T0a - T0 (ms) */
6400
+ platformDelivery?: number;
6401
+ /** @description T0b - T0a (ms) */
6402
+ mediaDownload?: number;
6403
+ /** @description T1 - T0b (ms) */
6404
+ inboundEnrichment?: number;
6257
6405
  /** @description T2 - T1 (ms) */
6258
6406
  eventPublish?: number;
6259
6407
  /** @description T3 - T2 (ms) */
@@ -6289,6 +6437,11 @@ export interface components {
6289
6437
  completedJourneys: number;
6290
6438
  /** @description Currently active journeys */
6291
6439
  activeJourneys: number;
6440
+ /** @description Completed journeys by terminal path: no agent (T4) vs agent dispatch (T5) */
6441
+ completedByPath: {
6442
+ noAgent: number;
6443
+ agent: number;
6444
+ };
6292
6445
  /** @description Percentile stats per latency stage */
6293
6446
  stages: {
6294
6447
  [key: string]: {
@@ -7714,6 +7867,167 @@ export interface operations {
7714
7867
  };
7715
7868
  };
7716
7869
  };
7870
+ listConfigAudit: {
7871
+ parameters: {
7872
+ query?: {
7873
+ targetType?: string;
7874
+ target?: string;
7875
+ actor?: string;
7876
+ since?: string;
7877
+ limit?: number;
7878
+ cursor?: string;
7879
+ };
7880
+ header?: never;
7881
+ path?: never;
7882
+ cookie?: never;
7883
+ };
7884
+ requestBody?: never;
7885
+ responses: {
7886
+ /** @description Audit entries, newest first */
7887
+ 200: {
7888
+ headers: {
7889
+ [name: string]: unknown;
7890
+ };
7891
+ content: {
7892
+ "application/json": {
7893
+ items: {
7894
+ /** Format: uuid */
7895
+ id: string;
7896
+ /** @description Acting API key id */
7897
+ apiKeyId: string | null;
7898
+ /** @description Acting API key name */
7899
+ apiKeyName: string | null;
7900
+ /** @description X-Omni-Actor header, e.g. cli:alice or claude-session:<id> */
7901
+ actor: string | null;
7902
+ requestId: string | null;
7903
+ /** @description Client IP (X-Forwarded-For / X-Real-IP / socket) */
7904
+ ipAddress: string | null;
7905
+ userAgent: string | null;
7906
+ method: string;
7907
+ path: string;
7908
+ statusCode: number;
7909
+ /** @description e.g. instance.create, instance.update, instance.connect */
7910
+ action: string;
7911
+ /** @description instance | agent | provider | route | automation | api_key | setting */
7912
+ targetType: string;
7913
+ targetId: string | null;
7914
+ changedFields: string[];
7915
+ /** @description Before/after per changed field. Secret-bearing values appear only as sha256:<prefix> fingerprints. */
7916
+ changes: {
7917
+ [key: string]: {
7918
+ before?: unknown;
7919
+ after?: unknown;
7920
+ };
7921
+ };
7922
+ /** Format: date-time */
7923
+ createdAt: string;
7924
+ }[];
7925
+ meta: {
7926
+ hasMore: boolean;
7927
+ cursor: string | null;
7928
+ };
7929
+ };
7930
+ };
7931
+ };
7932
+ /** @description Invalid query */
7933
+ 400: {
7934
+ headers: {
7935
+ [name: string]: unknown;
7936
+ };
7937
+ content: {
7938
+ "application/json": {
7939
+ error: {
7940
+ /**
7941
+ * @description Error code
7942
+ * @example NOT_FOUND
7943
+ */
7944
+ code: string;
7945
+ /** @description Human-readable error message */
7946
+ message: string;
7947
+ /** @description Additional error details */
7948
+ details?: unknown;
7949
+ };
7950
+ };
7951
+ };
7952
+ };
7953
+ };
7954
+ };
7955
+ getConfigAudit: {
7956
+ parameters: {
7957
+ query?: never;
7958
+ header?: never;
7959
+ path: {
7960
+ id: string;
7961
+ };
7962
+ cookie?: never;
7963
+ };
7964
+ requestBody?: never;
7965
+ responses: {
7966
+ /** @description Audit entry */
7967
+ 200: {
7968
+ headers: {
7969
+ [name: string]: unknown;
7970
+ };
7971
+ content: {
7972
+ "application/json": {
7973
+ data: {
7974
+ /** Format: uuid */
7975
+ id: string;
7976
+ /** @description Acting API key id */
7977
+ apiKeyId: string | null;
7978
+ /** @description Acting API key name */
7979
+ apiKeyName: string | null;
7980
+ /** @description X-Omni-Actor header, e.g. cli:alice or claude-session:<id> */
7981
+ actor: string | null;
7982
+ requestId: string | null;
7983
+ /** @description Client IP (X-Forwarded-For / X-Real-IP / socket) */
7984
+ ipAddress: string | null;
7985
+ userAgent: string | null;
7986
+ method: string;
7987
+ path: string;
7988
+ statusCode: number;
7989
+ /** @description e.g. instance.create, instance.update, instance.connect */
7990
+ action: string;
7991
+ /** @description instance | agent | provider | route | automation | api_key | setting */
7992
+ targetType: string;
7993
+ targetId: string | null;
7994
+ changedFields: string[];
7995
+ /** @description Before/after per changed field. Secret-bearing values appear only as sha256:<prefix> fingerprints. */
7996
+ changes: {
7997
+ [key: string]: {
7998
+ before?: unknown;
7999
+ after?: unknown;
8000
+ };
8001
+ };
8002
+ /** Format: date-time */
8003
+ createdAt: string;
8004
+ };
8005
+ };
8006
+ };
8007
+ };
8008
+ /** @description Not found */
8009
+ 404: {
8010
+ headers: {
8011
+ [name: string]: unknown;
8012
+ };
8013
+ content: {
8014
+ "application/json": {
8015
+ error: {
8016
+ /**
8017
+ * @description Error code
8018
+ * @example NOT_FOUND
8019
+ */
8020
+ code: string;
8021
+ /** @description Human-readable error message */
8022
+ message: string;
8023
+ /** @description Additional error details */
8024
+ details?: unknown;
8025
+ };
8026
+ };
8027
+ };
8028
+ };
8029
+ };
8030
+ };
7717
8031
  validateApiKey: {
7718
8032
  parameters: {
7719
8033
  query?: never;
@@ -8053,7 +8367,7 @@ export interface operations {
8053
8367
  agentId?: string | null;
8054
8368
  /**
8055
8369
  * Format: uuid
8056
- * @description Provider ID (agent provider)
8370
+ * @description Provider ID of the assigned agent (read-only; set via the agent)
8057
8371
  */
8058
8372
  agentProviderId?: string | null;
8059
8373
  /** @description Agent timeout in seconds */
@@ -8247,7 +8561,7 @@ export interface operations {
8247
8561
  agentId?: string | null;
8248
8562
  /**
8249
8563
  * Format: uuid
8250
- * @description Provider ID (agent provider)
8564
+ * @description Provider ID of the assigned agent (read-only; set via the agent)
8251
8565
  */
8252
8566
  agentProviderId?: string | null;
8253
8567
  /** @description Agent timeout in seconds */
@@ -8381,7 +8695,7 @@ export interface operations {
8381
8695
  agentId?: string | null;
8382
8696
  /**
8383
8697
  * Format: uuid
8384
- * @description Provider ID (agent provider)
8698
+ * @description Provider ID of the assigned agent (read-only; set via the agent)
8385
8699
  */
8386
8700
  agentProviderId?: string | null;
8387
8701
  /** @description Agent timeout in seconds */
@@ -8640,7 +8954,7 @@ export interface operations {
8640
8954
  agentId?: string | null;
8641
8955
  /**
8642
8956
  * Format: uuid
8643
- * @description Provider ID (agent provider)
8957
+ * @description Provider ID of the assigned agent (read-only; set via the agent)
8644
8958
  */
8645
8959
  agentProviderId?: string | null;
8646
8960
  /** @description Agent timeout in seconds */
@@ -10954,6 +11268,10 @@ export interface operations {
10954
11268
  avgAgentTimeMs: number | null;
10955
11269
  /** @description Sum of agent run cost (USD) stamped on events in range */
10956
11270
  totalCostUsd: number;
11271
+ /** @description Agent run cost (USD) grouped by event type, for events with a stamped cost */
11272
+ costByEventType: {
11273
+ [key: string]: number;
11274
+ };
10957
11275
  /** @description Count by content type */
10958
11276
  messageTypes: {
10959
11277
  [key: string]: number;
@@ -12355,6 +12673,8 @@ export interface operations {
12355
12673
  hasSignatureSecret: boolean;
12356
12674
  /** @description Idempotency key derivation template */
12357
12675
  idempotencyKeyTemplate: string;
12676
+ /** @description Whether custom-template idempotency keys are shared across event types (opt-in collapsing) */
12677
+ idempotencyAcrossEventTypes: boolean;
12358
12678
  /** @description Redeliveries acked without creating a second event */
12359
12679
  totalDuplicates: number;
12360
12680
  /** @description Strict schema mode: deliveries resolving to an event type with no enabled registered schema are refused and dead-lettered with reason schema_not_registered */
@@ -12452,6 +12772,8 @@ export interface operations {
12452
12772
  signatureSecret?: string | null;
12453
12773
  /** @description How the delivery-identity idempotency key is derived for this source. Placeholders: {source}, {sha256(body)}, {headers.<name>}, {payload.<dot.path>}. A delivery whose key is already journaled is acked (200, duplicate: true) without creating a second event. Defaults to "{source}:{sha256(body)}". This dedupes provider REDELIVERY, not semantic identity. */
12454
12774
  idempotencyKeyTemplate?: string;
12775
+ /** @description By default a custom idempotency key is prefixed with the resolved event type, so different event types for the same entity never collide. Set true to collapse keys across event types (a second type for the same rendered key is acked as a duplicate). Defaults to false. */
12776
+ idempotencyAcrossEventTypes?: boolean;
12455
12777
  /** @description Strict schema mode (RFC #925 G1 policy switch): when true, a delivery resolving to an event type with no enabled registered schema is refused and dead-lettered with reason schema_not_registered (manual retry only) instead of passing through. Defaults to false (opt-in pass-through). Recommended true for NEW sources — they have no legacy emitters to grandfather. */
12456
12778
  strictSchemas?: boolean;
12457
12779
  /** @description Semantic event-type extraction (e.g. header X-GitHub-Event: push emits custom.{source}.push). Null or absent keeps the legacy collapsed custom.webhook.{source} type for every delivery. */
@@ -12472,6 +12794,17 @@ export interface operations {
12472
12794
  /** @description Dot-path to the event name in the payload (e.g. "event"); numeric segments index arrays. 1-200 characters */
12473
12795
  path: string;
12474
12796
  } | unknown;
12797
+ /** @description Supervised pull connector (#1186): run `command` (must live inside OMNI_POLL_COMMAND_DIR) every intervalSeconds; each JSON stdout line becomes an emitType event deduped by dedupKeyTemplate. Null makes the source push-only again. */
12798
+ pollConfig?: {
12799
+ command: string;
12800
+ intervalSeconds: number;
12801
+ emitType: string;
12802
+ /** @default {source}:{sha256(body)} */
12803
+ dedupKeyTemplate?: string;
12804
+ env?: {
12805
+ [key: string]: string;
12806
+ };
12807
+ } | null;
12475
12808
  /**
12476
12809
  * @description Whether enabled
12477
12810
  * @default true
@@ -12548,6 +12881,8 @@ export interface operations {
12548
12881
  hasSignatureSecret: boolean;
12549
12882
  /** @description Idempotency key derivation template */
12550
12883
  idempotencyKeyTemplate: string;
12884
+ /** @description Whether custom-template idempotency keys are shared across event types (opt-in collapsing) */
12885
+ idempotencyAcrossEventTypes: boolean;
12551
12886
  /** @description Redeliveries acked without creating a second event */
12552
12887
  totalDuplicates: number;
12553
12888
  /** @description Strict schema mode: deliveries resolving to an event type with no enabled registered schema are refused and dead-lettered with reason schema_not_registered */
@@ -12698,6 +13033,8 @@ export interface operations {
12698
13033
  hasSignatureSecret: boolean;
12699
13034
  /** @description Idempotency key derivation template */
12700
13035
  idempotencyKeyTemplate: string;
13036
+ /** @description Whether custom-template idempotency keys are shared across event types (opt-in collapsing) */
13037
+ idempotencyAcrossEventTypes: boolean;
12701
13038
  /** @description Redeliveries acked without creating a second event */
12702
13039
  totalDuplicates: number;
12703
13040
  /** @description Strict schema mode: deliveries resolving to an event type with no enabled registered schema are refused and dead-lettered with reason schema_not_registered */
@@ -12866,6 +13203,8 @@ export interface operations {
12866
13203
  signatureSecret?: string | null;
12867
13204
  /** @description How the delivery-identity idempotency key is derived for this source. Placeholders: {source}, {sha256(body)}, {headers.<name>}, {payload.<dot.path>}. A delivery whose key is already journaled is acked (200, duplicate: true) without creating a second event. Defaults to "{source}:{sha256(body)}". This dedupes provider REDELIVERY, not semantic identity. */
12868
13205
  idempotencyKeyTemplate?: string;
13206
+ /** @description By default a custom idempotency key is prefixed with the resolved event type, so different event types for the same entity never collide. Set true to collapse keys across event types (a second type for the same rendered key is acked as a duplicate). Defaults to false. */
13207
+ idempotencyAcrossEventTypes?: boolean;
12869
13208
  /** @description Strict schema mode (RFC #925 G1 policy switch): when true, a delivery resolving to an event type with no enabled registered schema is refused and dead-lettered with reason schema_not_registered (manual retry only) instead of passing through. Defaults to false (opt-in pass-through). Recommended true for NEW sources — they have no legacy emitters to grandfather. */
12870
13209
  strictSchemas?: boolean;
12871
13210
  /** @description Semantic event-type extraction (e.g. header X-GitHub-Event: push emits custom.{source}.push). Null or absent keeps the legacy collapsed custom.webhook.{source} type for every delivery. */
@@ -12886,6 +13225,17 @@ export interface operations {
12886
13225
  /** @description Dot-path to the event name in the payload (e.g. "event"); numeric segments index arrays. 1-200 characters */
12887
13226
  path: string;
12888
13227
  } | unknown;
13228
+ /** @description Supervised pull connector (#1186): run `command` (must live inside OMNI_POLL_COMMAND_DIR) every intervalSeconds; each JSON stdout line becomes an emitType event deduped by dedupKeyTemplate. Null makes the source push-only again. */
13229
+ pollConfig?: {
13230
+ command: string;
13231
+ intervalSeconds: number;
13232
+ emitType: string;
13233
+ /** @default {source}:{sha256(body)} */
13234
+ dedupKeyTemplate?: string;
13235
+ env?: {
13236
+ [key: string]: string;
13237
+ };
13238
+ } | null;
12889
13239
  /**
12890
13240
  * @description Whether enabled
12891
13241
  * @default true
@@ -12962,6 +13312,8 @@ export interface operations {
12962
13312
  hasSignatureSecret: boolean;
12963
13313
  /** @description Idempotency key derivation template */
12964
13314
  idempotencyKeyTemplate: string;
13315
+ /** @description Whether custom-template idempotency keys are shared across event types (opt-in collapsing) */
13316
+ idempotencyAcrossEventTypes: boolean;
12965
13317
  /** @description Redeliveries acked without creating a second event */
12966
13318
  totalDuplicates: number;
12967
13319
  /** @description Strict schema mode: deliveries resolving to an event type with no enabled registered schema are refused and dead-lettered with reason schema_not_registered */
@@ -13349,6 +13701,27 @@ export interface operations {
13349
13701
  };
13350
13702
  };
13351
13703
  };
13704
+ /** @description Event payload exceeds NATS max_payload */
13705
+ 413: {
13706
+ headers: {
13707
+ [name: string]: unknown;
13708
+ };
13709
+ content: {
13710
+ "application/json": {
13711
+ error: {
13712
+ /**
13713
+ * @description Error code
13714
+ * @example NOT_FOUND
13715
+ */
13716
+ code: string;
13717
+ /** @description Human-readable error message */
13718
+ message: string;
13719
+ /** @description Additional error details */
13720
+ details?: unknown;
13721
+ };
13722
+ };
13723
+ };
13724
+ };
13352
13725
  };
13353
13726
  };
13354
13727
  listAccessRules: {
@@ -17078,6 +17451,41 @@ export interface operations {
17078
17451
  };
17079
17452
  };
17080
17453
  };
17454
+ listChannelCapabilities: {
17455
+ parameters: {
17456
+ query?: never;
17457
+ header?: never;
17458
+ path?: never;
17459
+ cookie?: never;
17460
+ };
17461
+ requestBody?: never;
17462
+ responses: {
17463
+ /** @description Capability matrix */
17464
+ 200: {
17465
+ headers: {
17466
+ [name: string]: unknown;
17467
+ };
17468
+ content: {
17469
+ "application/json": {
17470
+ items: {
17471
+ /** @description Channel type (e.g. whatsapp-baileys) */
17472
+ id: string;
17473
+ /** @description Human-readable channel name */
17474
+ name: string;
17475
+ /** @description Core event types the channel publishes; null when the plugin declares none */
17476
+ emits: string[] | null;
17477
+ /** @description true/false as established from the channel's code; 'unknown' when undeclared */
17478
+ edits: boolean | "unknown";
17479
+ /** @description true/false as established from the channel's code; 'unknown' when undeclared */
17480
+ deletes: boolean | "unknown";
17481
+ /** @description true/false as established from the channel's code; 'unknown' when undeclared */
17482
+ idempotency: boolean | "unknown";
17483
+ }[];
17484
+ };
17485
+ };
17486
+ };
17487
+ };
17488
+ };
17081
17489
  listEventSchemas: {
17082
17490
  parameters: {
17083
17491
  query?: {
@@ -17415,6 +17823,8 @@ export interface operations {
17415
17823
  }[] | null;
17416
17824
  /** @description Last acked journal_seq; delivery resumes strictly after it */
17417
17825
  cursor: number;
17826
+ /** @description true = competing consumers (pullers on this name split the stream); false = own cursor (fan-out) */
17827
+ shared: boolean;
17418
17828
  /** @description Highest journal_seq currently in the journal */
17419
17829
  head: number;
17420
17830
  /** @description head - cursor (all journal rows past the cursor, not only matches) */
@@ -17470,6 +17880,8 @@ export interface operations {
17470
17880
  * @enum {string}
17471
17881
  */
17472
17882
  startFrom?: "now" | "beginning";
17883
+ /** @description Competing consumers (#1188). false (default) = fan-out: every consumer name has its own cursor and sees every event. true = N pullers on THIS name split the stream: each pull leases a page to one puller, ack(leaseId) releases it, an unacked lease is redelivered after leaseMs (at-least-once). */
17884
+ shared?: boolean;
17473
17885
  };
17474
17886
  };
17475
17887
  };
@@ -17507,6 +17919,8 @@ export interface operations {
17507
17919
  }[] | null;
17508
17920
  /** @description Last acked journal_seq; delivery resumes strictly after it */
17509
17921
  cursor: number;
17922
+ /** @description true = competing consumers (pullers on this name split the stream); false = own cursor (fan-out) */
17923
+ shared: boolean;
17510
17924
  /** @description Highest journal_seq currently in the journal */
17511
17925
  head: number;
17512
17926
  /** @description head - cursor (all journal rows past the cursor, not only matches) */
@@ -17594,6 +18008,8 @@ export interface operations {
17594
18008
  }[] | null;
17595
18009
  /** @description Last acked journal_seq; delivery resumes strictly after it */
17596
18010
  cursor: number;
18011
+ /** @description true = competing consumers (pullers on this name split the stream); false = own cursor (fan-out) */
18012
+ shared: boolean;
17597
18013
  /** @description Highest journal_seq currently in the journal */
17598
18014
  head: number;
17599
18015
  /** @description head - cursor (all journal rows past the cursor, not only matches) */
@@ -17687,6 +18103,7 @@ export interface operations {
17687
18103
  query?: {
17688
18104
  limit?: number;
17689
18105
  waitMs?: number | null;
18106
+ leaseMs?: number;
17690
18107
  };
17691
18108
  header?: never;
17692
18109
  path: {
@@ -17717,6 +18134,8 @@ export interface operations {
17717
18134
  hasMore: boolean;
17718
18135
  /** @description A full scan window matched nothing; the stored cursor was advanced past it (#1128) */
17719
18136
  scanExhausted: boolean;
18137
+ /** @description Shared consumers only: ack this lease once the items are handled (absent when nothing delivered) */
18138
+ leaseId?: string;
17720
18139
  };
17721
18140
  };
17722
18141
  };
@@ -17756,7 +18175,12 @@ export interface operations {
17756
18175
  content: {
17757
18176
  "application/json": {
17758
18177
  /** @description The journal_seq to advance to (a pull result's "cursor"). Monotonic: equal = no-op, lower = 400 */
17759
- cursor: number | null;
18178
+ cursor?: number | null;
18179
+ /**
18180
+ * Format: uuid
18181
+ * @description Shared consumers: the pull result's leaseId (required instead of cursor)
18182
+ */
18183
+ leaseId?: string;
17760
18184
  };
17761
18185
  };
17762
18186
  };
@@ -17794,6 +18218,8 @@ export interface operations {
17794
18218
  }[] | null;
17795
18219
  /** @description Last acked journal_seq; delivery resumes strictly after it */
17796
18220
  cursor: number;
18221
+ /** @description true = competing consumers (pullers on this name split the stream); false = own cursor (fan-out) */
18222
+ shared: boolean;
17797
18223
  /** @description Highest journal_seq currently in the journal */
17798
18224
  head: number;
17799
18225
  /** @description head - cursor (all journal rows past the cursor, not only matches) */
@@ -18009,6 +18435,8 @@ export interface operations {
18009
18435
  timeoutMs?: number;
18010
18436
  /** @description Store agent response as variable for chaining (e.g., "agentResponse") */
18011
18437
  responseAs?: string;
18438
+ /** @description Await the agent run (default true). False = return the runId once dispatched; outcome published as system.agent.run_completed. Incompatible with responseAs */
18439
+ waitForResponse?: boolean;
18012
18440
  };
18013
18441
  })[];
18014
18442
  /** @description Debounce config */
@@ -18030,6 +18458,8 @@ export interface operations {
18030
18458
  priority: number;
18031
18459
  /** @description Transactional publication (G5, #988): buffer the run's emit_event publishes and flush them in order only when every action succeeded; a failed run publishes zero */
18032
18460
  transactionalEmissions: boolean;
18461
+ /** @description Loop guard opt-in (#1148): act on events sent by one of the tenant’s own instances */
18462
+ allowInstanceSenders: boolean;
18033
18463
  /** @description Per-automation concurrency limit (#1108). null = queued per instance with the engine default; set = a queue private to this automation, 1 being strict single-flight */
18034
18464
  maxConcurrency: number | null;
18035
18465
  /** @description Template over the event payload partitioning this automation’s queue (#1108), e.g. "{{payload.from.id}}" to serialize per chat; null = one queue for the whole automation */
@@ -18162,6 +18592,8 @@ export interface operations {
18162
18592
  timeoutMs?: number;
18163
18593
  /** @description Store agent response as variable for chaining (e.g., "agentResponse") */
18164
18594
  responseAs?: string;
18595
+ /** @description Await the agent run (default true). False = return the runId once dispatched; outcome published as system.agent.run_completed. Incompatible with responseAs */
18596
+ waitForResponse?: boolean;
18165
18597
  };
18166
18598
  })[];
18167
18599
  /** @description Debounce config */
@@ -18192,6 +18624,11 @@ export interface operations {
18192
18624
  * @default false
18193
18625
  */
18194
18626
  transactionalEmissions?: boolean;
18627
+ /**
18628
+ * @description Loop guard opt-in (#1148): by default events sent by one of the tenant’s own instances (payload.senderInstanceId) are skipped. True = act on them anyway
18629
+ * @default false
18630
+ */
18631
+ allowInstanceSenders?: boolean;
18195
18632
  /** @description Per-automation concurrency limit (#1108). Omit/null = today’s per-instance queueing with the engine default; 1 = strict single-flight, which is what a read-before-write action needs */
18196
18633
  maxConcurrency?: number | null;
18197
18634
  /** @description Template over the event payload partitioning this automation’s queue (#1108), e.g. "{{payload.from.id}}" to serialize per chat; omit/null = one queue for the whole automation */
@@ -18309,6 +18746,8 @@ export interface operations {
18309
18746
  timeoutMs?: number;
18310
18747
  /** @description Store agent response as variable for chaining (e.g., "agentResponse") */
18311
18748
  responseAs?: string;
18749
+ /** @description Await the agent run (default true). False = return the runId once dispatched; outcome published as system.agent.run_completed. Incompatible with responseAs */
18750
+ waitForResponse?: boolean;
18312
18751
  };
18313
18752
  })[];
18314
18753
  /** @description Debounce config */
@@ -18330,6 +18769,8 @@ export interface operations {
18330
18769
  priority: number;
18331
18770
  /** @description Transactional publication (G5, #988): buffer the run's emit_event publishes and flush them in order only when every action succeeded; a failed run publishes zero */
18332
18771
  transactionalEmissions: boolean;
18772
+ /** @description Loop guard opt-in (#1148): act on events sent by one of the tenant’s own instances */
18773
+ allowInstanceSenders: boolean;
18333
18774
  /** @description Per-automation concurrency limit (#1108). null = queued per instance with the engine default; set = a queue private to this automation, 1 being strict single-flight */
18334
18775
  maxConcurrency: number | null;
18335
18776
  /** @description Template over the event payload partitioning this automation’s queue (#1108), e.g. "{{payload.from.id}}" to serialize per chat; null = one queue for the whole automation */
@@ -18496,6 +18937,8 @@ export interface operations {
18496
18937
  timeoutMs?: number;
18497
18938
  /** @description Store agent response as variable for chaining (e.g., "agentResponse") */
18498
18939
  responseAs?: string;
18940
+ /** @description Await the agent run (default true). False = return the runId once dispatched; outcome published as system.agent.run_completed. Incompatible with responseAs */
18941
+ waitForResponse?: boolean;
18499
18942
  };
18500
18943
  })[];
18501
18944
  /** @description Debounce config */
@@ -18517,6 +18960,8 @@ export interface operations {
18517
18960
  priority: number;
18518
18961
  /** @description Transactional publication (G5, #988): buffer the run's emit_event publishes and flush them in order only when every action succeeded; a failed run publishes zero */
18519
18962
  transactionalEmissions: boolean;
18963
+ /** @description Loop guard opt-in (#1148): act on events sent by one of the tenant’s own instances */
18964
+ allowInstanceSenders: boolean;
18520
18965
  /** @description Per-automation concurrency limit (#1108). null = queued per instance with the engine default; set = a queue private to this automation, 1 being strict single-flight */
18521
18966
  maxConcurrency: number | null;
18522
18967
  /** @description Template over the event payload partitioning this automation’s queue (#1108), e.g. "{{payload.from.id}}" to serialize per chat; null = one queue for the whole automation */
@@ -18720,6 +19165,8 @@ export interface operations {
18720
19165
  timeoutMs?: number;
18721
19166
  /** @description Store agent response as variable for chaining (e.g., "agentResponse") */
18722
19167
  responseAs?: string;
19168
+ /** @description Await the agent run (default true). False = return the runId once dispatched; outcome published as system.agent.run_completed. Incompatible with responseAs */
19169
+ waitForResponse?: boolean;
18723
19170
  };
18724
19171
  })[];
18725
19172
  /** @description Debounce config */
@@ -18750,6 +19197,11 @@ export interface operations {
18750
19197
  * @default false
18751
19198
  */
18752
19199
  transactionalEmissions?: boolean;
19200
+ /**
19201
+ * @description Loop guard opt-in (#1148): by default events sent by one of the tenant’s own instances (payload.senderInstanceId) are skipped. True = act on them anyway
19202
+ * @default false
19203
+ */
19204
+ allowInstanceSenders?: boolean;
18753
19205
  /** @description Per-automation concurrency limit (#1108). Omit/null = today’s per-instance queueing with the engine default; 1 = strict single-flight, which is what a read-before-write action needs */
18754
19206
  maxConcurrency?: number | null;
18755
19207
  /** @description Template over the event payload partitioning this automation’s queue (#1108), e.g. "{{payload.from.id}}" to serialize per chat; omit/null = one queue for the whole automation */
@@ -18867,6 +19319,8 @@ export interface operations {
18867
19319
  timeoutMs?: number;
18868
19320
  /** @description Store agent response as variable for chaining (e.g., "agentResponse") */
18869
19321
  responseAs?: string;
19322
+ /** @description Await the agent run (default true). False = return the runId once dispatched; outcome published as system.agent.run_completed. Incompatible with responseAs */
19323
+ waitForResponse?: boolean;
18870
19324
  };
18871
19325
  })[];
18872
19326
  /** @description Debounce config */
@@ -18888,6 +19342,8 @@ export interface operations {
18888
19342
  priority: number;
18889
19343
  /** @description Transactional publication (G5, #988): buffer the run's emit_event publishes and flush them in order only when every action succeeded; a failed run publishes zero */
18890
19344
  transactionalEmissions: boolean;
19345
+ /** @description Loop guard opt-in (#1148): act on events sent by one of the tenant’s own instances */
19346
+ allowInstanceSenders: boolean;
18891
19347
  /** @description Per-automation concurrency limit (#1108). null = queued per instance with the engine default; set = a queue private to this automation, 1 being strict single-flight */
18892
19348
  maxConcurrency: number | null;
18893
19349
  /** @description Template over the event payload partitioning this automation’s queue (#1108), e.g. "{{payload.from.id}}" to serialize per chat; null = one queue for the whole automation */
@@ -19056,6 +19512,8 @@ export interface operations {
19056
19512
  timeoutMs?: number;
19057
19513
  /** @description Store agent response as variable for chaining (e.g., "agentResponse") */
19058
19514
  responseAs?: string;
19515
+ /** @description Await the agent run (default true). False = return the runId once dispatched; outcome published as system.agent.run_completed. Incompatible with responseAs */
19516
+ waitForResponse?: boolean;
19059
19517
  };
19060
19518
  })[];
19061
19519
  /** @description Debounce config */
@@ -19077,6 +19535,8 @@ export interface operations {
19077
19535
  priority: number;
19078
19536
  /** @description Transactional publication (G5, #988): buffer the run's emit_event publishes and flush them in order only when every action succeeded; a failed run publishes zero */
19079
19537
  transactionalEmissions: boolean;
19538
+ /** @description Loop guard opt-in (#1148): act on events sent by one of the tenant’s own instances */
19539
+ allowInstanceSenders: boolean;
19080
19540
  /** @description Per-automation concurrency limit (#1108). null = queued per instance with the engine default; set = a queue private to this automation, 1 being strict single-flight */
19081
19541
  maxConcurrency: number | null;
19082
19542
  /** @description Template over the event payload partitioning this automation’s queue (#1108), e.g. "{{payload.from.id}}" to serialize per chat; null = one queue for the whole automation */
@@ -19243,6 +19703,8 @@ export interface operations {
19243
19703
  timeoutMs?: number;
19244
19704
  /** @description Store agent response as variable for chaining (e.g., "agentResponse") */
19245
19705
  responseAs?: string;
19706
+ /** @description Await the agent run (default true). False = return the runId once dispatched; outcome published as system.agent.run_completed. Incompatible with responseAs */
19707
+ waitForResponse?: boolean;
19246
19708
  };
19247
19709
  })[];
19248
19710
  /** @description Debounce config */
@@ -19264,6 +19726,8 @@ export interface operations {
19264
19726
  priority: number;
19265
19727
  /** @description Transactional publication (G5, #988): buffer the run's emit_event publishes and flush them in order only when every action succeeded; a failed run publishes zero */
19266
19728
  transactionalEmissions: boolean;
19729
+ /** @description Loop guard opt-in (#1148): act on events sent by one of the tenant’s own instances */
19730
+ allowInstanceSenders: boolean;
19267
19731
  /** @description Per-automation concurrency limit (#1108). null = queued per instance with the engine default; set = a queue private to this automation, 1 being strict single-flight */
19268
19732
  maxConcurrency: number | null;
19269
19733
  /** @description Template over the event payload partitioning this automation’s queue (#1108), e.g. "{{payload.from.id}}" to serialize per chat; null = one queue for the whole automation */
@@ -19991,6 +20455,11 @@ export interface operations {
19991
20455
  completedJourneys: number;
19992
20456
  /** @description Currently active journeys */
19993
20457
  activeJourneys: number;
20458
+ /** @description Completed journeys by terminal path: no agent (T4) vs agent dispatch (T5) */
20459
+ completedByPath: {
20460
+ noAgent: number;
20461
+ agent: number;
20462
+ };
19994
20463
  /** @description Percentile stats per latency stage */
19995
20464
  stages: {
19996
20465
  [key: string]: {
@@ -20055,6 +20524,12 @@ export interface operations {
20055
20524
  latencies: {
20056
20525
  /** @description T1 - T0 (ms) */
20057
20526
  channelProcessing?: number;
20527
+ /** @description T0a - T0 (ms) */
20528
+ platformDelivery?: number;
20529
+ /** @description T0b - T0a (ms) */
20530
+ mediaDownload?: number;
20531
+ /** @description T1 - T0b (ms) */
20532
+ inboundEnrichment?: number;
20058
20533
  /** @description T2 - T1 (ms) */
20059
20534
  eventPublish?: number;
20060
20535
  /** @description T3 - T2 (ms) */