langwatch 1.18.0 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/agent/index.js +1 -1
  2. package/dist/agent/index.js.map +1 -1
  3. package/dist/agent/index.mjs +1 -1
  4. package/dist/agent/index.mjs.map +1 -1
  5. package/dist/{chunk-JJASOJOK.js → chunk-CSV7B7B5.js} +2 -2
  6. package/dist/{chunk-JJASOJOK.js.map → chunk-CSV7B7B5.js.map} +1 -1
  7. package/dist/{chunk-HY2N6TO5.mjs → chunk-PIYOJF6V.mjs} +2 -2
  8. package/dist/{chunk-MVQJMRM6.mjs → chunk-SY5HSL5G.mjs} +2 -2
  9. package/dist/{chunk-MVQJMRM6.mjs.map → chunk-SY5HSL5G.mjs.map} +1 -1
  10. package/dist/{chunk-UEJSGC3P.js → chunk-WGLVIV4J.js} +12 -12
  11. package/dist/{chunk-UEJSGC3P.js.map → chunk-WGLVIV4J.js.map} +1 -1
  12. package/dist/cli/bundle.js +265 -261
  13. package/dist/{implementation-CQ__V0Vc.d.mts → implementation-CeTvnq6e.d.mts} +1 -1
  14. package/dist/{implementation-BvX-7vox.d.ts → implementation-CsQrexpY.d.ts} +1 -1
  15. package/dist/index.d.mts +2 -2
  16. package/dist/index.d.ts +2 -2
  17. package/dist/index.js +63 -52
  18. package/dist/index.js.map +1 -1
  19. package/dist/index.mjs +32 -21
  20. package/dist/index.mjs.map +1 -1
  21. package/dist/observability-sdk/index.d.mts +3 -3
  22. package/dist/observability-sdk/index.d.ts +3 -3
  23. package/dist/observability-sdk/index.js +2 -2
  24. package/dist/observability-sdk/index.mjs +1 -1
  25. package/dist/observability-sdk/instrumentation/langchain/index.d.mts +1 -1
  26. package/dist/observability-sdk/instrumentation/langchain/index.d.ts +1 -1
  27. package/dist/observability-sdk/setup/node/index.js +3 -3
  28. package/dist/observability-sdk/setup/node/index.mjs +2 -2
  29. package/dist/{types-DfPAHmAh.d.mts → types-ofe1fAYQ.d.mts} +1597 -136
  30. package/dist/{types-CNEUr6Hm.d.ts → types-wuYJPoFb.d.ts} +1597 -136
  31. package/package.json +1 -1
  32. /package/dist/{chunk-HY2N6TO5.mjs.map → chunk-PIYOJF6V.mjs.map} +0 -0
@@ -1761,7 +1761,8 @@ interface paths {
1761
1761
  path?: never;
1762
1762
  cookie?: never;
1763
1763
  };
1764
- get?: never;
1764
+ /** @description List entries of a dataset (paginated). Same as GET /:slugOrId/records. */
1765
+ get: operations["getApiDatasetBySlugEntries"];
1765
1766
  put?: never;
1766
1767
  /** @description Add entries to a dataset */
1767
1768
  post: operations["postApiDatasetBySlugEntries"];
@@ -2296,7 +2297,7 @@ interface paths {
2296
2297
  put?: never;
2297
2298
  /**
2298
2299
  * Create a Slack alert trigger
2299
- * @description Create a trigger that posts to a Slack incoming webhook when traces match its filters. The `/api/triggers` family supersedes this narrower form, which stays for callers written against it.
2300
+ * @description Create a trigger that posts to Slack when traces match its filters, through a Slack connection (`slack_connection_id`, plus `slack_channel_id` for a bot) or an incoming webhook URL (`slack_webhook`), which is stored as a connection. The trigger stores no secret of its own. The `/api/triggers` family supersedes this narrower form, which stays for callers written against it.
2300
2301
  */
2301
2302
  post: operations["postApiTriggerSlack"];
2302
2303
  delete?: never;
@@ -4640,10 +4641,10 @@ interface paths {
4640
4641
  path?: never;
4641
4642
  cookie?: never;
4642
4643
  };
4643
- /** @description List all active triggers (automations) for the project */
4644
+ /** @description List the project's automations, newest first. Paused automations are included. */
4644
4645
  get: operations["getApiTriggers"];
4645
4646
  put?: never;
4646
- /** @description Create a new trigger (automation) */
4647
+ /** @description Create an automation. Send `customGraphId` + `graphAlert` for an alert on a metric, `report` for a scheduled report, or conditions for a trace automation. The delivery channel is fixed at creation. */
4647
4648
  post: operations["postApiTriggers"];
4648
4649
  delete?: never;
4649
4650
  options?: never;
@@ -4666,10 +4667,95 @@ interface paths {
4666
4667
  delete: operations["deleteApiTriggersById"];
4667
4668
  options?: never;
4668
4669
  head?: never;
4669
- /** @description Update a trigger (name, active state, message, filters) */
4670
+ /** @description Update an automation. Every field is optional and what is left out is left alone, except `actionParams`, which replaces the delivery configuration as a whole. The delivery channel cannot be changed. */
4670
4671
  patch: operations["patchApiTriggersById"];
4671
4672
  trace?: never;
4672
4673
  };
4674
+ "/api/triggers/{id}/fires": {
4675
+ parameters: {
4676
+ query?: never;
4677
+ header?: never;
4678
+ path?: never;
4679
+ cookie?: never;
4680
+ };
4681
+ /** @description What this automation has done: its fires, newest first. Metadata only — no trace ids and no trace content. Send `nextCursor` back as `cursor` to read the page after this one. */
4682
+ get: operations["getApiTriggersByIdFires"];
4683
+ put?: never;
4684
+ post?: never;
4685
+ delete?: never;
4686
+ options?: never;
4687
+ head?: never;
4688
+ patch?: never;
4689
+ trace?: never;
4690
+ };
4691
+ "/api/triggers/{id}/enable": {
4692
+ parameters: {
4693
+ query?: never;
4694
+ header?: never;
4695
+ path?: never;
4696
+ cookie?: never;
4697
+ };
4698
+ get?: never;
4699
+ put?: never;
4700
+ /** @description Resume an automation. A report's schedule is put back on the calendar. */
4701
+ post: operations["postApiTriggersByIdEnable"];
4702
+ delete?: never;
4703
+ options?: never;
4704
+ head?: never;
4705
+ patch?: never;
4706
+ trace?: never;
4707
+ };
4708
+ "/api/triggers/{id}/disable": {
4709
+ parameters: {
4710
+ query?: never;
4711
+ header?: never;
4712
+ path?: never;
4713
+ cookie?: never;
4714
+ };
4715
+ get?: never;
4716
+ put?: never;
4717
+ /** @description Pause an automation. A report stops claiming its schedule. */
4718
+ post: operations["postApiTriggersByIdDisable"];
4719
+ delete?: never;
4720
+ options?: never;
4721
+ head?: never;
4722
+ patch?: never;
4723
+ trace?: never;
4724
+ };
4725
+ "/api/triggers/{id}/test-fire": {
4726
+ parameters: {
4727
+ query?: never;
4728
+ header?: never;
4729
+ path?: never;
4730
+ cookie?: never;
4731
+ };
4732
+ get?: never;
4733
+ put?: never;
4734
+ /** @description Send this automation's message to the destination it is configured with, so you can confirm it arrives. Nothing is recorded as a fire. */
4735
+ post: operations["postApiTriggersByIdTestFire"];
4736
+ delete?: never;
4737
+ options?: never;
4738
+ head?: never;
4739
+ patch?: never;
4740
+ trace?: never;
4741
+ };
4742
+ "/api/slack-connections": {
4743
+ parameters: {
4744
+ query?: never;
4745
+ header?: never;
4746
+ path?: never;
4747
+ cookie?: never;
4748
+ };
4749
+ /** @description List the Slack connections this project can deliver through: its own and its organization's, by name. Never returns a token or webhook URL. */
4750
+ get: operations["getApiSlackConnections"];
4751
+ put?: never;
4752
+ post?: never;
4753
+ delete?: never;
4754
+ options?: never;
4755
+ head?: never;
4756
+ patch?: never;
4757
+ trace?: never;
4758
+ };
4673
4759
  "/api/webhooks/v1/endpoints": {
4674
4760
  parameters: {
4675
4761
  query?: never;
@@ -10667,6 +10753,21 @@ interface operations {
10667
10753
  };
10668
10754
  responses: never;
10669
10755
  };
10756
+ getApiDatasetBySlugEntries: {
10757
+ parameters: {
10758
+ query?: {
10759
+ page?: number;
10760
+ limit?: number;
10761
+ };
10762
+ header?: never;
10763
+ path: {
10764
+ slug: string;
10765
+ };
10766
+ cookie?: never;
10767
+ };
10768
+ requestBody?: never;
10769
+ responses: never;
10770
+ };
10670
10771
  postApiDatasetBySlugEntries: {
10671
10772
  parameters: {
10672
10773
  query?: never;
@@ -14356,9 +14457,13 @@ interface operations {
14356
14457
  "application/json": {
14357
14458
  /**
14358
14459
  * Format: uri
14359
- * @description Incoming webhook URL the alert is posted to
14460
+ * @description Incoming webhook URL the alert is posted to. It is stored as a Slack connection this project can use (an existing one holding the same URL, else a new project connection). Send this or `slack_connection_id`, not both.
14360
14461
  */
14361
- slack_webhook: string;
14462
+ slack_webhook?: string;
14463
+ /** @description The Slack connection the alert posts through: an organization connection or one of this project's, as `GET /api/slack-connections` and `langwatch slack-connection list` list them. Send this or `slack_webhook`, not both. */
14464
+ slack_connection_id?: string;
14465
+ /** @description The channel a bot connection posts in; required with one. Invite the LangWatch app to it first. */
14466
+ slack_channel_id?: string;
14362
14467
  /** @description How the trigger is listed in the app */
14363
14468
  name: string;
14364
14469
  /** @description Extra line included with each alert */
@@ -14628,6 +14733,25 @@ interface operations {
14628
14733
  };
14629
14734
  };
14630
14735
  };
14736
+ /** @description The connection is not one this project can use (`slack_integration_missing`), or a bot connection was named without `slack_channel_id` (`invalid_action_params`) */
14737
+ 422: {
14738
+ headers: {
14739
+ [name: string]: unknown;
14740
+ };
14741
+ content: {
14742
+ "application/json": {
14743
+ /** @description Stable failure code; branch on this */
14744
+ error: string;
14745
+ message?: string;
14746
+ /** @description Who the failure is attributable to: customer, platform, provider */
14747
+ fault?: string;
14748
+ tips?: string[];
14749
+ docsUrl?: string;
14750
+ } & {
14751
+ [key: string]: unknown;
14752
+ };
14753
+ };
14754
+ };
14631
14755
  };
14632
14756
  };
14633
14757
  postApiWorkflowsByWorkflowIdRun: {
@@ -26073,6 +26197,7 @@ interface operations {
26073
26197
  reasoning?: string;
26074
26198
  metCriteria: string[];
26075
26199
  unmetCriteria: string[];
26200
+ inconclusiveCriteria?: string[];
26076
26201
  error?: string;
26077
26202
  evaluations?: {
26078
26203
  evaluatorId: string;
@@ -32598,13 +32723,67 @@ interface operations {
32598
32723
  id: string;
32599
32724
  name: string;
32600
32725
  /** @enum {string} */
32601
- action: "SEND_EMAIL" | "ADD_TO_DATASET" | "ADD_TO_ANNOTATION_QUEUE" | "SEND_SLACK_MESSAGE";
32726
+ action: "SEND_EMAIL" | "ADD_TO_DATASET" | "ADD_TO_ANNOTATION_QUEUE" | "SEND_SLACK_MESSAGE" | "SEND_WEBHOOK";
32727
+ /** @description Where this automation delivers, with every credential value replaced by the `[redacted]` placeholder. Which channel is configured, which destination is set and which header names are in play all survive; the values never leave; a Slack automation names its connection by `slackIntegrationId` and carries no secret. Sending the placeholder back on an update keeps the stored value. The rule this automation fires by is not here — it is stated in `graphAlert` or `report`, and sending it in this field is refused. */
32602
32728
  actionParams: {
32603
32729
  [key: string]: unknown;
32604
32730
  };
32731
+ /** @description The rule an alert fires by. Null for anything that is not one. */
32732
+ graphAlert: {
32733
+ threshold: number;
32734
+ /** @enum {string} */
32735
+ operator: "gt" | "lt" | "gte" | "lte" | "eq";
32736
+ timePeriod: 1 | 5 | 15 | 30 | 60 | 1440;
32737
+ seriesName: string;
32738
+ } | null;
32739
+ /** @description What a report renders and when. Null for anything else. */
32740
+ report: {
32741
+ source: {
32742
+ /** @constant */
32743
+ kind: "dashboard";
32744
+ dashboardId: string;
32745
+ } | {
32746
+ /** @constant */
32747
+ kind: "customGraph";
32748
+ customGraphId: string;
32749
+ } | {
32750
+ /** @constant */
32751
+ kind: "traceQuery";
32752
+ /** @default {} */
32753
+ filters: {
32754
+ [key: string]: unknown;
32755
+ };
32756
+ metric?: string;
32757
+ /** @default 5 */
32758
+ topN: number;
32759
+ };
32760
+ schedule: {
32761
+ cron: string;
32762
+ timezone: string;
32763
+ };
32764
+ /** @default false */
32765
+ compareToPrevious: boolean;
32766
+ } | null;
32605
32767
  filters: {
32606
32768
  [key: string]: unknown;
32607
32769
  };
32770
+ filterQuery: string | null;
32771
+ /**
32772
+ * @description What this automation is about: matching traces, a metric crossing a threshold, or a schedule.
32773
+ * @enum {string}
32774
+ */
32775
+ kind: "AUTOMATION" | "ALERT" | "REPORT";
32776
+ customGraphId: string | null;
32777
+ notificationCadence: string | null;
32778
+ traceDebounceMs: number | null;
32779
+ /** @description The Liquid templates this automation's message is rendered from. Absent fields render the LangWatch default for the channel. */
32780
+ templates: {
32781
+ /** @enum {string|null} */
32782
+ slackTemplateType?: "string" | "block_kit" | null;
32783
+ slackTemplate?: string | null;
32784
+ emailSubjectTemplate?: string | null;
32785
+ emailBodyTemplate?: string | null;
32786
+ };
32608
32787
  active: boolean;
32609
32788
  message: string | null;
32610
32789
  /** @enum {string|null} */
@@ -32676,113 +32855,1212 @@ interface operations {
32676
32855
  requestBody: {
32677
32856
  content: {
32678
32857
  "application/json": {
32679
- name: string;
32680
- /** @enum {string} */
32681
- action: "SEND_EMAIL" | "ADD_TO_DATASET" | "ADD_TO_ANNOTATION_QUEUE" | "SEND_SLACK_MESSAGE";
32682
- /** @default {} */
32683
- actionParams?: {
32858
+ /** @constant */
32859
+ action: "SEND_EMAIL";
32860
+ /** @description Email delivery. */
32861
+ actionParams: {
32862
+ /** @description Who receives the email. Any address, not only teammates. */
32863
+ members: string[];
32864
+ } & {
32684
32865
  [key: string]: unknown;
32685
32866
  };
32867
+ name: string;
32686
32868
  filters?: {
32687
- [key: string]: unknown;
32869
+ [key: string]: string[] | {
32870
+ [key: string]: string[];
32871
+ } | {
32872
+ [key: string]: {
32873
+ [key: string]: string[];
32874
+ };
32875
+ };
32688
32876
  };
32877
+ /** @description The trace query this automation is about, in the syntax the traces view uses. When set it supersedes `filters`. */
32878
+ filterQuery?: string | null;
32689
32879
  message?: string;
32690
32880
  /** @enum {string} */
32691
32881
  alertType?: "CRITICAL" | "WARNING" | "INFO";
32692
- };
32693
- };
32694
- };
32695
- responses: {
32696
- /** @description Trigger created */
32697
- 201: {
32698
- headers: {
32699
- [name: string]: unknown;
32700
- };
32701
- content: {
32702
- "application/json": {
32703
- id: string;
32704
- name: string;
32882
+ /** @description Set to make this an alert on that graph. `graphAlert` and `alertType` are then required. */
32883
+ customGraphId?: string;
32884
+ /** @description The rule an alert fires by: series, operator, threshold, window. */
32885
+ graphAlert?: {
32886
+ threshold: number;
32705
32887
  /** @enum {string} */
32706
- action: "SEND_EMAIL" | "ADD_TO_DATASET" | "ADD_TO_ANNOTATION_QUEUE" | "SEND_SLACK_MESSAGE";
32707
- actionParams: {
32708
- [key: string]: unknown;
32888
+ operator: "gt" | "lt" | "gte" | "lte" | "eq";
32889
+ timePeriod: 1 | 5 | 15 | 30 | 60 | 1440;
32890
+ seriesName: string;
32891
+ };
32892
+ /** @description What a scheduled report renders and when it sends. */
32893
+ report?: {
32894
+ source: {
32895
+ /** @constant */
32896
+ kind: "dashboard";
32897
+ dashboardId: string;
32898
+ } | {
32899
+ /** @constant */
32900
+ kind: "customGraph";
32901
+ customGraphId: string;
32902
+ } | {
32903
+ /** @constant */
32904
+ kind: "traceQuery";
32905
+ /** @default {} */
32906
+ filters?: {
32907
+ [key: string]: unknown;
32908
+ };
32909
+ metric?: string;
32910
+ /** @default 5 */
32911
+ topN?: number;
32709
32912
  };
32710
- filters: {
32711
- [key: string]: unknown;
32913
+ schedule: {
32914
+ cron: string;
32915
+ timezone: string;
32712
32916
  };
32713
- active: boolean;
32714
- message: string | null;
32917
+ /** @default false */
32918
+ compareToPrevious?: boolean;
32919
+ };
32920
+ /** @description The Liquid templates this automation's message is rendered from. Absent fields render the LangWatch default for the channel. */
32921
+ templates?: {
32715
32922
  /** @enum {string|null} */
32716
- alertType: "CRITICAL" | "WARNING" | "INFO" | null;
32717
- createdAt: string;
32718
- updatedAt: string;
32719
- /** Format: uri */
32720
- platformUrl: string;
32923
+ slackTemplateType?: "string" | "block_kit" | null;
32924
+ slackTemplate?: string | null;
32925
+ emailSubjectTemplate?: string | null;
32926
+ emailBodyTemplate?: string | null;
32721
32927
  };
32722
- };
32723
- };
32724
- /** @description Bad Request */
32725
- 400: {
32726
- headers: {
32727
- [name: string]: unknown;
32728
- };
32729
- content: {
32730
- "application/json": {
32731
- error: string;
32732
- message?: string;
32928
+ /**
32929
+ * @description How often a notification automation is allowed to send. A new one starts on a five-minute digest, which is what keeps a broad condition from sending a message per matching trace.
32930
+ * @enum {string}
32931
+ */
32932
+ notificationCadence?: "immediate" | "5min_digest" | "15min_digest" | "hourly_digest";
32933
+ /** @description How long to wait for a trace to settle before the conditions are read. */
32934
+ traceDebounceMs?: number;
32935
+ } | {
32936
+ /** @constant */
32937
+ action: "SEND_SLACK_MESSAGE";
32938
+ /** @description Slack delivery through a Slack connection (`slackIntegrationId`), plus `slackChannelId` when the connection is a bot. */
32939
+ actionParams: {
32940
+ /** @description The Slack connection this automation posts through: an organization connection or one of this project's, listed under Settings, Integrations, Slack. A bot connection also needs `slackChannelId`; a webhook connection needs nothing else. Preferred over `slackWebhook` and `slackBotToken`, and what a read returns in their place. */
32941
+ slackIntegrationId?: string;
32942
+ /**
32943
+ * @description How the message reaches Slack. `webhook` posts to an incoming webhook URL, `bot` posts as the LangWatch Slack app. With `slackIntegrationId` it follows the connection's kind. Absent without a connection means `webhook`.
32944
+ * @enum {string}
32945
+ */
32946
+ slackDelivery?: "webhook" | "bot";
32947
+ /** @description Legacy, accepted for one release: an incoming webhook URL, for `webhook` delivery. It is stored as a Slack connection (an existing one holding the same URL, else a new project connection) and the automation keeps only that connection's id. Send `slackIntegrationId` instead. */
32948
+ slackWebhook?: string;
32949
+ /** @description The channel the bot posts in, for a bot connection or `bot` delivery. Invite the LangWatch app to it first. */
32950
+ slackChannelId?: string;
32951
+ /** @description Legacy, accepted for one release: a bot token, for `bot` delivery. It is stored as a Slack connection (an existing one holding the same token, else a new project connection) and never reads back. Send `slackIntegrationId` instead. */
32952
+ slackBotToken?: string;
32953
+ /** @description Legacy and ignored: no read returns it. An update that retypes no secret moves an automation's own stored secret into a connection. */
32954
+ slackBotTokenSet?: boolean;
32955
+ } & {
32956
+ [key: string]: unknown;
32733
32957
  };
32734
- };
32735
- };
32736
- /** @description Unauthorized */
32737
- 401: {
32738
- headers: {
32739
- [name: string]: unknown;
32740
- };
32741
- content: {
32742
- "application/json": {
32743
- error: string;
32744
- message?: string;
32958
+ name: string;
32959
+ filters?: {
32960
+ [key: string]: string[] | {
32961
+ [key: string]: string[];
32962
+ } | {
32963
+ [key: string]: {
32964
+ [key: string]: string[];
32965
+ };
32966
+ };
32745
32967
  };
32746
- };
32747
- };
32748
- /** @description Unprocessable Entity */
32749
- 422: {
32750
- headers: {
32751
- [name: string]: unknown;
32752
- };
32753
- content: {
32754
- "application/json": {
32755
- error: string;
32756
- message?: string;
32968
+ /** @description The trace query this automation is about, in the syntax the traces view uses. When set it supersedes `filters`. */
32969
+ filterQuery?: string | null;
32970
+ message?: string;
32971
+ /** @enum {string} */
32972
+ alertType?: "CRITICAL" | "WARNING" | "INFO";
32973
+ /** @description Set to make this an alert on that graph. `graphAlert` and `alertType` are then required. */
32974
+ customGraphId?: string;
32975
+ /** @description The rule an alert fires by: series, operator, threshold, window. */
32976
+ graphAlert?: {
32977
+ threshold: number;
32978
+ /** @enum {string} */
32979
+ operator: "gt" | "lt" | "gte" | "lte" | "eq";
32980
+ timePeriod: 1 | 5 | 15 | 30 | 60 | 1440;
32981
+ seriesName: string;
32757
32982
  };
32758
- };
32759
- };
32760
- /** @description Internal Server Error */
32761
- 500: {
32762
- headers: {
32763
- [name: string]: unknown;
32764
- };
32765
- content: {
32766
- "application/json": {
32767
- error: string;
32768
- message?: string;
32983
+ /** @description What a scheduled report renders and when it sends. */
32984
+ report?: {
32985
+ source: {
32986
+ /** @constant */
32987
+ kind: "dashboard";
32988
+ dashboardId: string;
32989
+ } | {
32990
+ /** @constant */
32991
+ kind: "customGraph";
32992
+ customGraphId: string;
32993
+ } | {
32994
+ /** @constant */
32995
+ kind: "traceQuery";
32996
+ /** @default {} */
32997
+ filters?: {
32998
+ [key: string]: unknown;
32999
+ };
33000
+ metric?: string;
33001
+ /** @default 5 */
33002
+ topN?: number;
33003
+ };
33004
+ schedule: {
33005
+ cron: string;
33006
+ timezone: string;
33007
+ };
33008
+ /** @default false */
33009
+ compareToPrevious?: boolean;
32769
33010
  };
32770
- };
32771
- };
32772
- };
32773
- };
32774
- getApiTriggersById: {
32775
- parameters: {
32776
- query?: never;
32777
- header?: never;
32778
- path: {
32779
- id: string;
32780
- };
32781
- cookie?: never;
32782
- };
33011
+ /** @description The Liquid templates this automation's message is rendered from. Absent fields render the LangWatch default for the channel. */
33012
+ templates?: {
33013
+ /** @enum {string|null} */
33014
+ slackTemplateType?: "string" | "block_kit" | null;
33015
+ slackTemplate?: string | null;
33016
+ emailSubjectTemplate?: string | null;
33017
+ emailBodyTemplate?: string | null;
33018
+ };
33019
+ /**
33020
+ * @description How often a notification automation is allowed to send. A new one starts on a five-minute digest, which is what keeps a broad condition from sending a message per matching trace.
33021
+ * @enum {string}
33022
+ */
33023
+ notificationCadence?: "immediate" | "5min_digest" | "15min_digest" | "hourly_digest";
33024
+ /** @description How long to wait for a trace to settle before the conditions are read. */
33025
+ traceDebounceMs?: number;
33026
+ } | {
33027
+ /** @constant */
33028
+ action: "SEND_WEBHOOK";
33029
+ /** @description Delivery to a customer endpoint over HTTP, with a body in any media type. */
33030
+ actionParams: {
33031
+ /** @description Where the request goes. https only, and not a private host. */
33032
+ url: string;
33033
+ /**
33034
+ * @description The HTTP method. Absent means POST.
33035
+ * @enum {string}
33036
+ */
33037
+ method?: "POST" | "PUT" | "PATCH";
33038
+ /** @description Static headers sent with every delivery. The values are credentials: they read back as the placeholder, and sending the placeholder back keeps the stored ones. Changing `url` means sending the values again in the same request. */
33039
+ headers?: {
33040
+ [key: string]: string;
33041
+ };
33042
+ /** @description A Liquid template for the body. Absent sends the standard LangWatch envelope for a JSON content type, and an empty body for any other. */
33043
+ bodyTemplate?: string | null;
33044
+ /** @description The `Content-Type` the delivery announces, which also decides how the body is treated: `application/json` (and any `+json` type) is checked and re-serialised; any other media type sends the rendered template verbatim. Absent means `application/json`. */
33045
+ contentType?: string;
33046
+ /** @description Signs every delivery so the receiver can verify it came from LangWatch. A credential: it reads back as the placeholder, and sending the placeholder back keeps the stored one. */
33047
+ signingSecret?: string | null;
33048
+ } & {
33049
+ [key: string]: unknown;
33050
+ };
33051
+ name: string;
33052
+ filters?: {
33053
+ [key: string]: string[] | {
33054
+ [key: string]: string[];
33055
+ } | {
33056
+ [key: string]: {
33057
+ [key: string]: string[];
33058
+ };
33059
+ };
33060
+ };
33061
+ /** @description The trace query this automation is about, in the syntax the traces view uses. When set it supersedes `filters`. */
33062
+ filterQuery?: string | null;
33063
+ message?: string;
33064
+ /** @enum {string} */
33065
+ alertType?: "CRITICAL" | "WARNING" | "INFO";
33066
+ /** @description Set to make this an alert on that graph. `graphAlert` and `alertType` are then required. */
33067
+ customGraphId?: string;
33068
+ /** @description The rule an alert fires by: series, operator, threshold, window. */
33069
+ graphAlert?: {
33070
+ threshold: number;
33071
+ /** @enum {string} */
33072
+ operator: "gt" | "lt" | "gte" | "lte" | "eq";
33073
+ timePeriod: 1 | 5 | 15 | 30 | 60 | 1440;
33074
+ seriesName: string;
33075
+ };
33076
+ /** @description What a scheduled report renders and when it sends. */
33077
+ report?: {
33078
+ source: {
33079
+ /** @constant */
33080
+ kind: "dashboard";
33081
+ dashboardId: string;
33082
+ } | {
33083
+ /** @constant */
33084
+ kind: "customGraph";
33085
+ customGraphId: string;
33086
+ } | {
33087
+ /** @constant */
33088
+ kind: "traceQuery";
33089
+ /** @default {} */
33090
+ filters?: {
33091
+ [key: string]: unknown;
33092
+ };
33093
+ metric?: string;
33094
+ /** @default 5 */
33095
+ topN?: number;
33096
+ };
33097
+ schedule: {
33098
+ cron: string;
33099
+ timezone: string;
33100
+ };
33101
+ /** @default false */
33102
+ compareToPrevious?: boolean;
33103
+ };
33104
+ /** @description The Liquid templates this automation's message is rendered from. Absent fields render the LangWatch default for the channel. */
33105
+ templates?: {
33106
+ /** @enum {string|null} */
33107
+ slackTemplateType?: "string" | "block_kit" | null;
33108
+ slackTemplate?: string | null;
33109
+ emailSubjectTemplate?: string | null;
33110
+ emailBodyTemplate?: string | null;
33111
+ };
33112
+ /**
33113
+ * @description How often a notification automation is allowed to send. A new one starts on a five-minute digest, which is what keeps a broad condition from sending a message per matching trace.
33114
+ * @enum {string}
33115
+ */
33116
+ notificationCadence?: "immediate" | "5min_digest" | "15min_digest" | "hourly_digest";
33117
+ /** @description How long to wait for a trace to settle before the conditions are read. */
33118
+ traceDebounceMs?: number;
33119
+ } | {
33120
+ /** @constant */
33121
+ action: "ADD_TO_DATASET";
33122
+ /** @description Append matched traces to a dataset. */
33123
+ actionParams: {
33124
+ /** @description The dataset matched traces are appended to. */
33125
+ datasetId: string;
33126
+ /** @description How a trace becomes a row in that dataset. */
33127
+ datasetMapping: {
33128
+ mapping: {
33129
+ [key: string]: unknown;
33130
+ };
33131
+ expansions?: string[];
33132
+ };
33133
+ } & {
33134
+ [key: string]: unknown;
33135
+ };
33136
+ name: string;
33137
+ filters?: {
33138
+ [key: string]: string[] | {
33139
+ [key: string]: string[];
33140
+ } | {
33141
+ [key: string]: {
33142
+ [key: string]: string[];
33143
+ };
33144
+ };
33145
+ };
33146
+ /** @description The trace query this automation is about, in the syntax the traces view uses. When set it supersedes `filters`. */
33147
+ filterQuery?: string | null;
33148
+ message?: string;
33149
+ /** @enum {string} */
33150
+ alertType?: "CRITICAL" | "WARNING" | "INFO";
33151
+ /** @description Set to make this an alert on that graph. `graphAlert` and `alertType` are then required. */
33152
+ customGraphId?: string;
33153
+ /** @description The rule an alert fires by: series, operator, threshold, window. */
33154
+ graphAlert?: {
33155
+ threshold: number;
33156
+ /** @enum {string} */
33157
+ operator: "gt" | "lt" | "gte" | "lte" | "eq";
33158
+ timePeriod: 1 | 5 | 15 | 30 | 60 | 1440;
33159
+ seriesName: string;
33160
+ };
33161
+ /** @description What a scheduled report renders and when it sends. */
33162
+ report?: {
33163
+ source: {
33164
+ /** @constant */
33165
+ kind: "dashboard";
33166
+ dashboardId: string;
33167
+ } | {
33168
+ /** @constant */
33169
+ kind: "customGraph";
33170
+ customGraphId: string;
33171
+ } | {
33172
+ /** @constant */
33173
+ kind: "traceQuery";
33174
+ /** @default {} */
33175
+ filters?: {
33176
+ [key: string]: unknown;
33177
+ };
33178
+ metric?: string;
33179
+ /** @default 5 */
33180
+ topN?: number;
33181
+ };
33182
+ schedule: {
33183
+ cron: string;
33184
+ timezone: string;
33185
+ };
33186
+ /** @default false */
33187
+ compareToPrevious?: boolean;
33188
+ };
33189
+ /** @description The Liquid templates this automation's message is rendered from. Absent fields render the LangWatch default for the channel. */
33190
+ templates?: {
33191
+ /** @enum {string|null} */
33192
+ slackTemplateType?: "string" | "block_kit" | null;
33193
+ slackTemplate?: string | null;
33194
+ emailSubjectTemplate?: string | null;
33195
+ emailBodyTemplate?: string | null;
33196
+ };
33197
+ /**
33198
+ * @description How often a notification automation is allowed to send. A new one starts on a five-minute digest, which is what keeps a broad condition from sending a message per matching trace.
33199
+ * @enum {string}
33200
+ */
33201
+ notificationCadence?: "immediate" | "5min_digest" | "15min_digest" | "hourly_digest";
33202
+ /** @description How long to wait for a trace to settle before the conditions are read. */
33203
+ traceDebounceMs?: number;
33204
+ } | {
33205
+ /** @constant */
33206
+ action: "ADD_TO_ANNOTATION_QUEUE";
33207
+ /** @description Queue matched traces for a person to label. */
33208
+ actionParams: {
33209
+ /** @description Who the queued items go to. */
33210
+ annotators: {
33211
+ id: string;
33212
+ name: string;
33213
+ }[];
33214
+ } & {
33215
+ [key: string]: unknown;
33216
+ };
33217
+ name: string;
33218
+ filters?: {
33219
+ [key: string]: string[] | {
33220
+ [key: string]: string[];
33221
+ } | {
33222
+ [key: string]: {
33223
+ [key: string]: string[];
33224
+ };
33225
+ };
33226
+ };
33227
+ /** @description The trace query this automation is about, in the syntax the traces view uses. When set it supersedes `filters`. */
33228
+ filterQuery?: string | null;
33229
+ message?: string;
33230
+ /** @enum {string} */
33231
+ alertType?: "CRITICAL" | "WARNING" | "INFO";
33232
+ /** @description Set to make this an alert on that graph. `graphAlert` and `alertType` are then required. */
33233
+ customGraphId?: string;
33234
+ /** @description The rule an alert fires by: series, operator, threshold, window. */
33235
+ graphAlert?: {
33236
+ threshold: number;
33237
+ /** @enum {string} */
33238
+ operator: "gt" | "lt" | "gte" | "lte" | "eq";
33239
+ timePeriod: 1 | 5 | 15 | 30 | 60 | 1440;
33240
+ seriesName: string;
33241
+ };
33242
+ /** @description What a scheduled report renders and when it sends. */
33243
+ report?: {
33244
+ source: {
33245
+ /** @constant */
33246
+ kind: "dashboard";
33247
+ dashboardId: string;
33248
+ } | {
33249
+ /** @constant */
33250
+ kind: "customGraph";
33251
+ customGraphId: string;
33252
+ } | {
33253
+ /** @constant */
33254
+ kind: "traceQuery";
33255
+ /** @default {} */
33256
+ filters?: {
33257
+ [key: string]: unknown;
33258
+ };
33259
+ metric?: string;
33260
+ /** @default 5 */
33261
+ topN?: number;
33262
+ };
33263
+ schedule: {
33264
+ cron: string;
33265
+ timezone: string;
33266
+ };
33267
+ /** @default false */
33268
+ compareToPrevious?: boolean;
33269
+ };
33270
+ /** @description The Liquid templates this automation's message is rendered from. Absent fields render the LangWatch default for the channel. */
33271
+ templates?: {
33272
+ /** @enum {string|null} */
33273
+ slackTemplateType?: "string" | "block_kit" | null;
33274
+ slackTemplate?: string | null;
33275
+ emailSubjectTemplate?: string | null;
33276
+ emailBodyTemplate?: string | null;
33277
+ };
33278
+ /**
33279
+ * @description How often a notification automation is allowed to send. A new one starts on a five-minute digest, which is what keeps a broad condition from sending a message per matching trace.
33280
+ * @enum {string}
33281
+ */
33282
+ notificationCadence?: "immediate" | "5min_digest" | "15min_digest" | "hourly_digest";
33283
+ /** @description How long to wait for a trace to settle before the conditions are read. */
33284
+ traceDebounceMs?: number;
33285
+ };
33286
+ };
33287
+ };
33288
+ responses: {
33289
+ /** @description Trigger created */
33290
+ 201: {
33291
+ headers: {
33292
+ [name: string]: unknown;
33293
+ };
33294
+ content: {
33295
+ "application/json": {
33296
+ id: string;
33297
+ name: string;
33298
+ /** @enum {string} */
33299
+ action: "SEND_EMAIL" | "ADD_TO_DATASET" | "ADD_TO_ANNOTATION_QUEUE" | "SEND_SLACK_MESSAGE" | "SEND_WEBHOOK";
33300
+ /** @description Where this automation delivers, with every credential value replaced by the `[redacted]` placeholder. Which channel is configured, which destination is set and which header names are in play all survive; the values never leave; a Slack automation names its connection by `slackIntegrationId` and carries no secret. Sending the placeholder back on an update keeps the stored value. The rule this automation fires by is not here — it is stated in `graphAlert` or `report`, and sending it in this field is refused. */
33301
+ actionParams: {
33302
+ [key: string]: unknown;
33303
+ };
33304
+ /** @description The rule an alert fires by. Null for anything that is not one. */
33305
+ graphAlert: {
33306
+ threshold: number;
33307
+ /** @enum {string} */
33308
+ operator: "gt" | "lt" | "gte" | "lte" | "eq";
33309
+ timePeriod: 1 | 5 | 15 | 30 | 60 | 1440;
33310
+ seriesName: string;
33311
+ } | null;
33312
+ /** @description What a report renders and when. Null for anything else. */
33313
+ report: {
33314
+ source: {
33315
+ /** @constant */
33316
+ kind: "dashboard";
33317
+ dashboardId: string;
33318
+ } | {
33319
+ /** @constant */
33320
+ kind: "customGraph";
33321
+ customGraphId: string;
33322
+ } | {
33323
+ /** @constant */
33324
+ kind: "traceQuery";
33325
+ /** @default {} */
33326
+ filters: {
33327
+ [key: string]: unknown;
33328
+ };
33329
+ metric?: string;
33330
+ /** @default 5 */
33331
+ topN: number;
33332
+ };
33333
+ schedule: {
33334
+ cron: string;
33335
+ timezone: string;
33336
+ };
33337
+ /** @default false */
33338
+ compareToPrevious: boolean;
33339
+ } | null;
33340
+ filters: {
33341
+ [key: string]: unknown;
33342
+ };
33343
+ filterQuery: string | null;
33344
+ /**
33345
+ * @description What this automation is about: matching traces, a metric crossing a threshold, or a schedule.
33346
+ * @enum {string}
33347
+ */
33348
+ kind: "AUTOMATION" | "ALERT" | "REPORT";
33349
+ customGraphId: string | null;
33350
+ notificationCadence: string | null;
33351
+ traceDebounceMs: number | null;
33352
+ /** @description The Liquid templates this automation's message is rendered from. Absent fields render the LangWatch default for the channel. */
33353
+ templates: {
33354
+ /** @enum {string|null} */
33355
+ slackTemplateType?: "string" | "block_kit" | null;
33356
+ slackTemplate?: string | null;
33357
+ emailSubjectTemplate?: string | null;
33358
+ emailBodyTemplate?: string | null;
33359
+ };
33360
+ active: boolean;
33361
+ message: string | null;
33362
+ /** @enum {string|null} */
33363
+ alertType: "CRITICAL" | "WARNING" | "INFO" | null;
33364
+ createdAt: string;
33365
+ updatedAt: string;
33366
+ /** Format: uri */
33367
+ platformUrl: string;
33368
+ };
33369
+ };
33370
+ };
33371
+ /** @description Bad Request */
33372
+ 400: {
33373
+ headers: {
33374
+ [name: string]: unknown;
33375
+ };
33376
+ content: {
33377
+ "application/json": {
33378
+ error: string;
33379
+ message?: string;
33380
+ };
33381
+ };
33382
+ };
33383
+ /** @description Unauthorized */
33384
+ 401: {
33385
+ headers: {
33386
+ [name: string]: unknown;
33387
+ };
33388
+ content: {
33389
+ "application/json": {
33390
+ error: string;
33391
+ message?: string;
33392
+ };
33393
+ };
33394
+ };
33395
+ /** @description Unprocessable Entity */
33396
+ 422: {
33397
+ headers: {
33398
+ [name: string]: unknown;
33399
+ };
33400
+ content: {
33401
+ "application/json": {
33402
+ error: string;
33403
+ message?: string;
33404
+ };
33405
+ };
33406
+ };
33407
+ /** @description Internal Server Error */
33408
+ 500: {
33409
+ headers: {
33410
+ [name: string]: unknown;
33411
+ };
33412
+ content: {
33413
+ "application/json": {
33414
+ error: string;
33415
+ message?: string;
33416
+ };
33417
+ };
33418
+ };
33419
+ };
33420
+ };
33421
+ getApiTriggersById: {
33422
+ parameters: {
33423
+ query?: never;
33424
+ header?: never;
33425
+ path: {
33426
+ id: string;
33427
+ };
33428
+ cookie?: never;
33429
+ };
33430
+ requestBody?: never;
33431
+ responses: {
33432
+ /** @description Success */
33433
+ 200: {
33434
+ headers: {
33435
+ [name: string]: unknown;
33436
+ };
33437
+ content: {
33438
+ "application/json": {
33439
+ id: string;
33440
+ name: string;
33441
+ /** @enum {string} */
33442
+ action: "SEND_EMAIL" | "ADD_TO_DATASET" | "ADD_TO_ANNOTATION_QUEUE" | "SEND_SLACK_MESSAGE" | "SEND_WEBHOOK";
33443
+ /** @description Where this automation delivers, with every credential value replaced by the `[redacted]` placeholder. Which channel is configured, which destination is set and which header names are in play all survive; the values never leave; a Slack automation names its connection by `slackIntegrationId` and carries no secret. Sending the placeholder back on an update keeps the stored value. The rule this automation fires by is not here — it is stated in `graphAlert` or `report`, and sending it in this field is refused. */
33444
+ actionParams: {
33445
+ [key: string]: unknown;
33446
+ };
33447
+ /** @description The rule an alert fires by. Null for anything that is not one. */
33448
+ graphAlert: {
33449
+ threshold: number;
33450
+ /** @enum {string} */
33451
+ operator: "gt" | "lt" | "gte" | "lte" | "eq";
33452
+ timePeriod: 1 | 5 | 15 | 30 | 60 | 1440;
33453
+ seriesName: string;
33454
+ } | null;
33455
+ /** @description What a report renders and when. Null for anything else. */
33456
+ report: {
33457
+ source: {
33458
+ /** @constant */
33459
+ kind: "dashboard";
33460
+ dashboardId: string;
33461
+ } | {
33462
+ /** @constant */
33463
+ kind: "customGraph";
33464
+ customGraphId: string;
33465
+ } | {
33466
+ /** @constant */
33467
+ kind: "traceQuery";
33468
+ /** @default {} */
33469
+ filters: {
33470
+ [key: string]: unknown;
33471
+ };
33472
+ metric?: string;
33473
+ /** @default 5 */
33474
+ topN: number;
33475
+ };
33476
+ schedule: {
33477
+ cron: string;
33478
+ timezone: string;
33479
+ };
33480
+ /** @default false */
33481
+ compareToPrevious: boolean;
33482
+ } | null;
33483
+ filters: {
33484
+ [key: string]: unknown;
33485
+ };
33486
+ filterQuery: string | null;
33487
+ /**
33488
+ * @description What this automation is about: matching traces, a metric crossing a threshold, or a schedule.
33489
+ * @enum {string}
33490
+ */
33491
+ kind: "AUTOMATION" | "ALERT" | "REPORT";
33492
+ customGraphId: string | null;
33493
+ notificationCadence: string | null;
33494
+ traceDebounceMs: number | null;
33495
+ /** @description The Liquid templates this automation's message is rendered from. Absent fields render the LangWatch default for the channel. */
33496
+ templates: {
33497
+ /** @enum {string|null} */
33498
+ slackTemplateType?: "string" | "block_kit" | null;
33499
+ slackTemplate?: string | null;
33500
+ emailSubjectTemplate?: string | null;
33501
+ emailBodyTemplate?: string | null;
33502
+ };
33503
+ active: boolean;
33504
+ message: string | null;
33505
+ /** @enum {string|null} */
33506
+ alertType: "CRITICAL" | "WARNING" | "INFO" | null;
33507
+ createdAt: string;
33508
+ updatedAt: string;
33509
+ /** Format: uri */
33510
+ platformUrl: string;
33511
+ };
33512
+ };
33513
+ };
33514
+ /** @description Bad Request */
33515
+ 400: {
33516
+ headers: {
33517
+ [name: string]: unknown;
33518
+ };
33519
+ content: {
33520
+ "application/json": {
33521
+ error: string;
33522
+ message?: string;
33523
+ };
33524
+ };
33525
+ };
33526
+ /** @description Unauthorized */
33527
+ 401: {
33528
+ headers: {
33529
+ [name: string]: unknown;
33530
+ };
33531
+ content: {
33532
+ "application/json": {
33533
+ error: string;
33534
+ message?: string;
33535
+ };
33536
+ };
33537
+ };
33538
+ /** @description Trigger not found */
33539
+ 404: {
33540
+ headers: {
33541
+ [name: string]: unknown;
33542
+ };
33543
+ content: {
33544
+ "application/json": {
33545
+ error: string;
33546
+ message?: string;
33547
+ };
33548
+ };
33549
+ };
33550
+ /** @description Unprocessable Entity */
33551
+ 422: {
33552
+ headers: {
33553
+ [name: string]: unknown;
33554
+ };
33555
+ content: {
33556
+ "application/json": {
33557
+ error: string;
33558
+ message?: string;
33559
+ };
33560
+ };
33561
+ };
33562
+ /** @description Internal Server Error */
33563
+ 500: {
33564
+ headers: {
33565
+ [name: string]: unknown;
33566
+ };
33567
+ content: {
33568
+ "application/json": {
33569
+ error: string;
33570
+ message?: string;
33571
+ };
33572
+ };
33573
+ };
33574
+ };
33575
+ };
33576
+ deleteApiTriggersById: {
33577
+ parameters: {
33578
+ query?: never;
33579
+ header?: never;
33580
+ path: {
33581
+ id: string;
33582
+ };
33583
+ cookie?: never;
33584
+ };
33585
+ requestBody?: never;
33586
+ responses: {
33587
+ /** @description Trigger deleted */
33588
+ 200: {
33589
+ headers: {
33590
+ [name: string]: unknown;
33591
+ };
33592
+ content: {
33593
+ "application/json": {
33594
+ id: string;
33595
+ deleted: boolean;
33596
+ };
33597
+ };
33598
+ };
33599
+ /** @description Bad Request */
33600
+ 400: {
33601
+ headers: {
33602
+ [name: string]: unknown;
33603
+ };
33604
+ content: {
33605
+ "application/json": {
33606
+ error: string;
33607
+ message?: string;
33608
+ };
33609
+ };
33610
+ };
33611
+ /** @description Unauthorized */
33612
+ 401: {
33613
+ headers: {
33614
+ [name: string]: unknown;
33615
+ };
33616
+ content: {
33617
+ "application/json": {
33618
+ error: string;
33619
+ message?: string;
33620
+ };
33621
+ };
33622
+ };
33623
+ /** @description Trigger not found */
33624
+ 404: {
33625
+ headers: {
33626
+ [name: string]: unknown;
33627
+ };
33628
+ content: {
33629
+ "application/json": {
33630
+ error: string;
33631
+ message?: string;
33632
+ };
33633
+ };
33634
+ };
33635
+ /** @description Unprocessable Entity */
33636
+ 422: {
33637
+ headers: {
33638
+ [name: string]: unknown;
33639
+ };
33640
+ content: {
33641
+ "application/json": {
33642
+ error: string;
33643
+ message?: string;
33644
+ };
33645
+ };
33646
+ };
33647
+ /** @description Internal Server Error */
33648
+ 500: {
33649
+ headers: {
33650
+ [name: string]: unknown;
33651
+ };
33652
+ content: {
33653
+ "application/json": {
33654
+ error: string;
33655
+ message?: string;
33656
+ };
33657
+ };
33658
+ };
33659
+ };
33660
+ };
33661
+ patchApiTriggersById: {
33662
+ parameters: {
33663
+ query?: never;
33664
+ header?: never;
33665
+ path: {
33666
+ id: string;
33667
+ };
33668
+ cookie?: never;
33669
+ };
33670
+ requestBody: {
33671
+ content: {
33672
+ "application/json": {
33673
+ name?: string;
33674
+ active?: boolean;
33675
+ message?: string | null;
33676
+ /** @enum {string|null} */
33677
+ alertType?: "CRITICAL" | "WARNING" | "INFO" | null;
33678
+ filters?: {
33679
+ [key: string]: string[] | {
33680
+ [key: string]: string[];
33681
+ } | {
33682
+ [key: string]: {
33683
+ [key: string]: string[];
33684
+ };
33685
+ };
33686
+ };
33687
+ /** @description The trace query this automation is about, in the syntax the traces view uses. When set it supersedes `filters`. */
33688
+ filterQuery?: string | null;
33689
+ /** @enum {string} */
33690
+ action?: "SEND_EMAIL" | "ADD_TO_DATASET" | "ADD_TO_ANNOTATION_QUEUE" | "SEND_SLACK_MESSAGE" | "SEND_WEBHOOK";
33691
+ /** @description Replaces the delivery configuration as a whole rather than merging into it: send the fields this automation should have from now on, and anything left out is removed — omit `headers` and it delivers with none, omit `signingSecret` and its deliveries are no longer signed. The one exception is a credential the read hid: send back the `[redacted]` placeholder and the stored credential is kept (a Slack automation not yet on a connection has its stored secret moved into one), so reading an automation, changing one field and writing the whole object back is safe. Only this channel's fields are accepted; anything else is refused rather than dropped, and the rule this automation fires by belongs in `graphAlert` or `report`. */
33692
+ actionParams?: ({
33693
+ /** @description Who receives the email. Any address, not only teammates. */
33694
+ members: string[];
33695
+ } & {
33696
+ [key: string]: unknown;
33697
+ }) | ({
33698
+ /** @description The Slack connection this automation posts through: an organization connection or one of this project's, listed under Settings, Integrations, Slack. A bot connection also needs `slackChannelId`; a webhook connection needs nothing else. Preferred over `slackWebhook` and `slackBotToken`, and what a read returns in their place. */
33699
+ slackIntegrationId?: string;
33700
+ /**
33701
+ * @description How the message reaches Slack. `webhook` posts to an incoming webhook URL, `bot` posts as the LangWatch Slack app. With `slackIntegrationId` it follows the connection's kind. Absent without a connection means `webhook`.
33702
+ * @enum {string}
33703
+ */
33704
+ slackDelivery?: "webhook" | "bot";
33705
+ /** @description Legacy, accepted for one release: an incoming webhook URL, for `webhook` delivery. It is stored as a Slack connection (an existing one holding the same URL, else a new project connection) and the automation keeps only that connection's id. Send `slackIntegrationId` instead. */
33706
+ slackWebhook?: string;
33707
+ /** @description The channel the bot posts in, for a bot connection or `bot` delivery. Invite the LangWatch app to it first. */
33708
+ slackChannelId?: string;
33709
+ /** @description Legacy, accepted for one release: a bot token, for `bot` delivery. It is stored as a Slack connection (an existing one holding the same token, else a new project connection) and never reads back. Send `slackIntegrationId` instead. */
33710
+ slackBotToken?: string;
33711
+ /** @description Legacy and ignored: no read returns it. An update that retypes no secret moves an automation's own stored secret into a connection. */
33712
+ slackBotTokenSet?: boolean;
33713
+ } & {
33714
+ [key: string]: unknown;
33715
+ }) | ({
33716
+ /** @description Where the request goes. https only, and not a private host. */
33717
+ url: string;
33718
+ /**
33719
+ * @description The HTTP method. Absent means POST.
33720
+ * @enum {string}
33721
+ */
33722
+ method?: "POST" | "PUT" | "PATCH";
33723
+ /** @description Static headers sent with every delivery. The values are credentials: they read back as the placeholder, and sending the placeholder back keeps the stored ones. Changing `url` means sending the values again in the same request. */
33724
+ headers?: {
33725
+ [key: string]: string;
33726
+ };
33727
+ /** @description A Liquid template for the body. Absent sends the standard LangWatch envelope for a JSON content type, and an empty body for any other. */
33728
+ bodyTemplate?: string | null;
33729
+ /** @description The `Content-Type` the delivery announces, which also decides how the body is treated: `application/json` (and any `+json` type) is checked and re-serialised; any other media type sends the rendered template verbatim. Absent means `application/json`. */
33730
+ contentType?: string;
33731
+ /** @description Signs every delivery so the receiver can verify it came from LangWatch. A credential: it reads back as the placeholder, and sending the placeholder back keeps the stored one. */
33732
+ signingSecret?: string | null;
33733
+ } & {
33734
+ [key: string]: unknown;
33735
+ }) | ({
33736
+ /** @description The dataset matched traces are appended to. */
33737
+ datasetId: string;
33738
+ /** @description How a trace becomes a row in that dataset. */
33739
+ datasetMapping: {
33740
+ mapping: {
33741
+ [key: string]: unknown;
33742
+ };
33743
+ expansions?: string[];
33744
+ };
33745
+ } & {
33746
+ [key: string]: unknown;
33747
+ }) | ({
33748
+ /** @description Who the queued items go to. */
33749
+ annotators: {
33750
+ id: string;
33751
+ name: string;
33752
+ }[];
33753
+ } & {
33754
+ [key: string]: unknown;
33755
+ });
33756
+ /** @description The rule this alert fires by. Only for an automation that is one. */
33757
+ graphAlert?: {
33758
+ threshold: number;
33759
+ /** @enum {string} */
33760
+ operator: "gt" | "lt" | "gte" | "lte" | "eq";
33761
+ timePeriod: 1 | 5 | 15 | 30 | 60 | 1440;
33762
+ seriesName: string;
33763
+ };
33764
+ /** @description What this report renders and when. Only for one that is a report. */
33765
+ report?: {
33766
+ source: {
33767
+ /** @constant */
33768
+ kind: "dashboard";
33769
+ dashboardId: string;
33770
+ } | {
33771
+ /** @constant */
33772
+ kind: "customGraph";
33773
+ customGraphId: string;
33774
+ } | {
33775
+ /** @constant */
33776
+ kind: "traceQuery";
33777
+ /** @default {} */
33778
+ filters?: {
33779
+ [key: string]: unknown;
33780
+ };
33781
+ metric?: string;
33782
+ /** @default 5 */
33783
+ topN?: number;
33784
+ };
33785
+ schedule: {
33786
+ cron: string;
33787
+ timezone: string;
33788
+ };
33789
+ /** @default false */
33790
+ compareToPrevious?: boolean;
33791
+ };
33792
+ /** @description The Liquid templates this automation's message is rendered from. Absent fields render the LangWatch default for the channel. */
33793
+ templates?: {
33794
+ /** @enum {string|null} */
33795
+ slackTemplateType?: "string" | "block_kit" | null;
33796
+ slackTemplate?: string | null;
33797
+ emailSubjectTemplate?: string | null;
33798
+ emailBodyTemplate?: string | null;
33799
+ };
33800
+ /**
33801
+ * @description How often a notification automation is allowed to send. A new one starts on a five-minute digest, which is what keeps a broad condition from sending a message per matching trace.
33802
+ * @enum {string}
33803
+ */
33804
+ notificationCadence?: "immediate" | "5min_digest" | "15min_digest" | "hourly_digest";
33805
+ /** @description How long to wait for a trace to settle before the conditions are read. */
33806
+ traceDebounceMs?: number;
33807
+ };
33808
+ };
33809
+ };
33810
+ responses: {
33811
+ /** @description Trigger updated */
33812
+ 200: {
33813
+ headers: {
33814
+ [name: string]: unknown;
33815
+ };
33816
+ content: {
33817
+ "application/json": {
33818
+ id: string;
33819
+ name: string;
33820
+ /** @enum {string} */
33821
+ action: "SEND_EMAIL" | "ADD_TO_DATASET" | "ADD_TO_ANNOTATION_QUEUE" | "SEND_SLACK_MESSAGE" | "SEND_WEBHOOK";
33822
+ /** @description Where this automation delivers, with every credential value replaced by the `[redacted]` placeholder. Which channel is configured, which destination is set and which header names are in play all survive; the values never leave; a Slack automation names its connection by `slackIntegrationId` and carries no secret. Sending the placeholder back on an update keeps the stored value. The rule this automation fires by is not here — it is stated in `graphAlert` or `report`, and sending it in this field is refused. */
33823
+ actionParams: {
33824
+ [key: string]: unknown;
33825
+ };
33826
+ /** @description The rule an alert fires by. Null for anything that is not one. */
33827
+ graphAlert: {
33828
+ threshold: number;
33829
+ /** @enum {string} */
33830
+ operator: "gt" | "lt" | "gte" | "lte" | "eq";
33831
+ timePeriod: 1 | 5 | 15 | 30 | 60 | 1440;
33832
+ seriesName: string;
33833
+ } | null;
33834
+ /** @description What a report renders and when. Null for anything else. */
33835
+ report: {
33836
+ source: {
33837
+ /** @constant */
33838
+ kind: "dashboard";
33839
+ dashboardId: string;
33840
+ } | {
33841
+ /** @constant */
33842
+ kind: "customGraph";
33843
+ customGraphId: string;
33844
+ } | {
33845
+ /** @constant */
33846
+ kind: "traceQuery";
33847
+ /** @default {} */
33848
+ filters: {
33849
+ [key: string]: unknown;
33850
+ };
33851
+ metric?: string;
33852
+ /** @default 5 */
33853
+ topN: number;
33854
+ };
33855
+ schedule: {
33856
+ cron: string;
33857
+ timezone: string;
33858
+ };
33859
+ /** @default false */
33860
+ compareToPrevious: boolean;
33861
+ } | null;
33862
+ filters: {
33863
+ [key: string]: unknown;
33864
+ };
33865
+ filterQuery: string | null;
33866
+ /**
33867
+ * @description What this automation is about: matching traces, a metric crossing a threshold, or a schedule.
33868
+ * @enum {string}
33869
+ */
33870
+ kind: "AUTOMATION" | "ALERT" | "REPORT";
33871
+ customGraphId: string | null;
33872
+ notificationCadence: string | null;
33873
+ traceDebounceMs: number | null;
33874
+ /** @description The Liquid templates this automation's message is rendered from. Absent fields render the LangWatch default for the channel. */
33875
+ templates: {
33876
+ /** @enum {string|null} */
33877
+ slackTemplateType?: "string" | "block_kit" | null;
33878
+ slackTemplate?: string | null;
33879
+ emailSubjectTemplate?: string | null;
33880
+ emailBodyTemplate?: string | null;
33881
+ };
33882
+ active: boolean;
33883
+ message: string | null;
33884
+ /** @enum {string|null} */
33885
+ alertType: "CRITICAL" | "WARNING" | "INFO" | null;
33886
+ createdAt: string;
33887
+ updatedAt: string;
33888
+ /** Format: uri */
33889
+ platformUrl: string;
33890
+ };
33891
+ };
33892
+ };
33893
+ /** @description Bad Request */
33894
+ 400: {
33895
+ headers: {
33896
+ [name: string]: unknown;
33897
+ };
33898
+ content: {
33899
+ "application/json": {
33900
+ error: string;
33901
+ message?: string;
33902
+ };
33903
+ };
33904
+ };
33905
+ /** @description Unauthorized */
33906
+ 401: {
33907
+ headers: {
33908
+ [name: string]: unknown;
33909
+ };
33910
+ content: {
33911
+ "application/json": {
33912
+ error: string;
33913
+ message?: string;
33914
+ };
33915
+ };
33916
+ };
33917
+ /** @description Trigger not found */
33918
+ 404: {
33919
+ headers: {
33920
+ [name: string]: unknown;
33921
+ };
33922
+ content: {
33923
+ "application/json": {
33924
+ error: string;
33925
+ message?: string;
33926
+ };
33927
+ };
33928
+ };
33929
+ /** @description Unprocessable Entity */
33930
+ 422: {
33931
+ headers: {
33932
+ [name: string]: unknown;
33933
+ };
33934
+ content: {
33935
+ "application/json": {
33936
+ error: string;
33937
+ message?: string;
33938
+ };
33939
+ };
33940
+ };
33941
+ /** @description Internal Server Error */
33942
+ 500: {
33943
+ headers: {
33944
+ [name: string]: unknown;
33945
+ };
33946
+ content: {
33947
+ "application/json": {
33948
+ error: string;
33949
+ message?: string;
33950
+ };
33951
+ };
33952
+ };
33953
+ };
33954
+ };
33955
+ getApiTriggersByIdFires: {
33956
+ parameters: {
33957
+ query?: {
33958
+ limit?: number;
33959
+ /** @description The `nextCursor` from the previous page. Omit for the newest fires. */
33960
+ cursor?: string;
33961
+ };
33962
+ header?: never;
33963
+ path: {
33964
+ id: string;
33965
+ };
33966
+ cookie?: never;
33967
+ };
32783
33968
  requestBody?: never;
32784
33969
  responses: {
32785
33970
  /** @description Success */
33971
+ 200: {
33972
+ headers: {
33973
+ [name: string]: unknown;
33974
+ };
33975
+ content: {
33976
+ "application/json": {
33977
+ /** @description One page of fires, newest first. */
33978
+ fires: {
33979
+ id: string;
33980
+ triggerId: string;
33981
+ customGraphId: string | null;
33982
+ firedAt: string;
33983
+ resolvedAt: string | null;
33984
+ }[];
33985
+ /** @description Pass as `cursor` to read the page after this one. Null on the last page. */
33986
+ nextCursor: string | null;
33987
+ };
33988
+ };
33989
+ };
33990
+ /** @description Bad Request */
33991
+ 400: {
33992
+ headers: {
33993
+ [name: string]: unknown;
33994
+ };
33995
+ content: {
33996
+ "application/json": {
33997
+ error: string;
33998
+ message?: string;
33999
+ };
34000
+ };
34001
+ };
34002
+ /** @description Unauthorized */
34003
+ 401: {
34004
+ headers: {
34005
+ [name: string]: unknown;
34006
+ };
34007
+ content: {
34008
+ "application/json": {
34009
+ error: string;
34010
+ message?: string;
34011
+ };
34012
+ };
34013
+ };
34014
+ /** @description Trigger not found */
34015
+ 404: {
34016
+ headers: {
34017
+ [name: string]: unknown;
34018
+ };
34019
+ content: {
34020
+ "application/json": {
34021
+ error: string;
34022
+ message?: string;
34023
+ };
34024
+ };
34025
+ };
34026
+ /** @description Unprocessable Entity */
34027
+ 422: {
34028
+ headers: {
34029
+ [name: string]: unknown;
34030
+ };
34031
+ content: {
34032
+ "application/json": {
34033
+ error: string;
34034
+ message?: string;
34035
+ };
34036
+ };
34037
+ };
34038
+ /** @description Internal Server Error */
34039
+ 500: {
34040
+ headers: {
34041
+ [name: string]: unknown;
34042
+ };
34043
+ content: {
34044
+ "application/json": {
34045
+ error: string;
34046
+ message?: string;
34047
+ };
34048
+ };
34049
+ };
34050
+ };
34051
+ };
34052
+ postApiTriggersByIdEnable: {
34053
+ parameters: {
34054
+ query?: never;
34055
+ header?: never;
34056
+ path: {
34057
+ id: string;
34058
+ };
34059
+ cookie?: never;
34060
+ };
34061
+ requestBody?: never;
34062
+ responses: {
34063
+ /** @description Trigger resumed */
32786
34064
  200: {
32787
34065
  headers: {
32788
34066
  [name: string]: unknown;
@@ -32792,13 +34070,67 @@ interface operations {
32792
34070
  id: string;
32793
34071
  name: string;
32794
34072
  /** @enum {string} */
32795
- action: "SEND_EMAIL" | "ADD_TO_DATASET" | "ADD_TO_ANNOTATION_QUEUE" | "SEND_SLACK_MESSAGE";
34073
+ action: "SEND_EMAIL" | "ADD_TO_DATASET" | "ADD_TO_ANNOTATION_QUEUE" | "SEND_SLACK_MESSAGE" | "SEND_WEBHOOK";
34074
+ /** @description Where this automation delivers, with every credential value replaced by the `[redacted]` placeholder. Which channel is configured, which destination is set and which header names are in play all survive; the values never leave; a Slack automation names its connection by `slackIntegrationId` and carries no secret. Sending the placeholder back on an update keeps the stored value. The rule this automation fires by is not here — it is stated in `graphAlert` or `report`, and sending it in this field is refused. */
32796
34075
  actionParams: {
32797
34076
  [key: string]: unknown;
32798
34077
  };
34078
+ /** @description The rule an alert fires by. Null for anything that is not one. */
34079
+ graphAlert: {
34080
+ threshold: number;
34081
+ /** @enum {string} */
34082
+ operator: "gt" | "lt" | "gte" | "lte" | "eq";
34083
+ timePeriod: 1 | 5 | 15 | 30 | 60 | 1440;
34084
+ seriesName: string;
34085
+ } | null;
34086
+ /** @description What a report renders and when. Null for anything else. */
34087
+ report: {
34088
+ source: {
34089
+ /** @constant */
34090
+ kind: "dashboard";
34091
+ dashboardId: string;
34092
+ } | {
34093
+ /** @constant */
34094
+ kind: "customGraph";
34095
+ customGraphId: string;
34096
+ } | {
34097
+ /** @constant */
34098
+ kind: "traceQuery";
34099
+ /** @default {} */
34100
+ filters: {
34101
+ [key: string]: unknown;
34102
+ };
34103
+ metric?: string;
34104
+ /** @default 5 */
34105
+ topN: number;
34106
+ };
34107
+ schedule: {
34108
+ cron: string;
34109
+ timezone: string;
34110
+ };
34111
+ /** @default false */
34112
+ compareToPrevious: boolean;
34113
+ } | null;
32799
34114
  filters: {
32800
34115
  [key: string]: unknown;
32801
34116
  };
34117
+ filterQuery: string | null;
34118
+ /**
34119
+ * @description What this automation is about: matching traces, a metric crossing a threshold, or a schedule.
34120
+ * @enum {string}
34121
+ */
34122
+ kind: "AUTOMATION" | "ALERT" | "REPORT";
34123
+ customGraphId: string | null;
34124
+ notificationCadence: string | null;
34125
+ traceDebounceMs: number | null;
34126
+ /** @description The Liquid templates this automation's message is rendered from. Absent fields render the LangWatch default for the channel. */
34127
+ templates: {
34128
+ /** @enum {string|null} */
34129
+ slackTemplateType?: "string" | "block_kit" | null;
34130
+ slackTemplate?: string | null;
34131
+ emailSubjectTemplate?: string | null;
34132
+ emailBodyTemplate?: string | null;
34133
+ };
32802
34134
  active: boolean;
32803
34135
  message: string | null;
32804
34136
  /** @enum {string|null} */
@@ -32872,7 +34204,7 @@ interface operations {
32872
34204
  };
32873
34205
  };
32874
34206
  };
32875
- deleteApiTriggersById: {
34207
+ postApiTriggersByIdDisable: {
32876
34208
  parameters: {
32877
34209
  query?: never;
32878
34210
  header?: never;
@@ -32883,7 +34215,7 @@ interface operations {
32883
34215
  };
32884
34216
  requestBody?: never;
32885
34217
  responses: {
32886
- /** @description Trigger deleted */
34218
+ /** @description Trigger paused */
32887
34219
  200: {
32888
34220
  headers: {
32889
34221
  [name: string]: unknown;
@@ -32891,7 +34223,77 @@ interface operations {
32891
34223
  content: {
32892
34224
  "application/json": {
32893
34225
  id: string;
32894
- deleted: boolean;
34226
+ name: string;
34227
+ /** @enum {string} */
34228
+ action: "SEND_EMAIL" | "ADD_TO_DATASET" | "ADD_TO_ANNOTATION_QUEUE" | "SEND_SLACK_MESSAGE" | "SEND_WEBHOOK";
34229
+ /** @description Where this automation delivers, with every credential value replaced by the `[redacted]` placeholder. Which channel is configured, which destination is set and which header names are in play all survive; the values never leave; a Slack automation names its connection by `slackIntegrationId` and carries no secret. Sending the placeholder back on an update keeps the stored value. The rule this automation fires by is not here — it is stated in `graphAlert` or `report`, and sending it in this field is refused. */
34230
+ actionParams: {
34231
+ [key: string]: unknown;
34232
+ };
34233
+ /** @description The rule an alert fires by. Null for anything that is not one. */
34234
+ graphAlert: {
34235
+ threshold: number;
34236
+ /** @enum {string} */
34237
+ operator: "gt" | "lt" | "gte" | "lte" | "eq";
34238
+ timePeriod: 1 | 5 | 15 | 30 | 60 | 1440;
34239
+ seriesName: string;
34240
+ } | null;
34241
+ /** @description What a report renders and when. Null for anything else. */
34242
+ report: {
34243
+ source: {
34244
+ /** @constant */
34245
+ kind: "dashboard";
34246
+ dashboardId: string;
34247
+ } | {
34248
+ /** @constant */
34249
+ kind: "customGraph";
34250
+ customGraphId: string;
34251
+ } | {
34252
+ /** @constant */
34253
+ kind: "traceQuery";
34254
+ /** @default {} */
34255
+ filters: {
34256
+ [key: string]: unknown;
34257
+ };
34258
+ metric?: string;
34259
+ /** @default 5 */
34260
+ topN: number;
34261
+ };
34262
+ schedule: {
34263
+ cron: string;
34264
+ timezone: string;
34265
+ };
34266
+ /** @default false */
34267
+ compareToPrevious: boolean;
34268
+ } | null;
34269
+ filters: {
34270
+ [key: string]: unknown;
34271
+ };
34272
+ filterQuery: string | null;
34273
+ /**
34274
+ * @description What this automation is about: matching traces, a metric crossing a threshold, or a schedule.
34275
+ * @enum {string}
34276
+ */
34277
+ kind: "AUTOMATION" | "ALERT" | "REPORT";
34278
+ customGraphId: string | null;
34279
+ notificationCadence: string | null;
34280
+ traceDebounceMs: number | null;
34281
+ /** @description The Liquid templates this automation's message is rendered from. Absent fields render the LangWatch default for the channel. */
34282
+ templates: {
34283
+ /** @enum {string|null} */
34284
+ slackTemplateType?: "string" | "block_kit" | null;
34285
+ slackTemplate?: string | null;
34286
+ emailSubjectTemplate?: string | null;
34287
+ emailBodyTemplate?: string | null;
34288
+ };
34289
+ active: boolean;
34290
+ message: string | null;
34291
+ /** @enum {string|null} */
34292
+ alertType: "CRITICAL" | "WARNING" | "INFO" | null;
34293
+ createdAt: string;
34294
+ updatedAt: string;
34295
+ /** Format: uri */
34296
+ platformUrl: string;
32895
34297
  };
32896
34298
  };
32897
34299
  };
@@ -32957,7 +34359,7 @@ interface operations {
32957
34359
  };
32958
34360
  };
32959
34361
  };
32960
- patchApiTriggersById: {
34362
+ postApiTriggersByIdTestFire: {
32961
34363
  parameters: {
32962
34364
  query?: never;
32963
34365
  header?: never;
@@ -32966,49 +34368,24 @@ interface operations {
32966
34368
  };
32967
34369
  cookie?: never;
32968
34370
  };
32969
- requestBody: {
32970
- content: {
32971
- "application/json": {
32972
- name?: string;
32973
- active?: boolean;
32974
- message?: string | null;
32975
- /** @enum {string|null} */
32976
- alertType?: "CRITICAL" | "WARNING" | "INFO" | null;
32977
- filters?: {
32978
- [key: string]: unknown;
32979
- };
32980
- actionParams?: {
32981
- [key: string]: unknown;
32982
- };
32983
- };
32984
- };
32985
- };
34371
+ requestBody?: never;
32986
34372
  responses: {
32987
- /** @description Trigger updated */
34373
+ /** @description Test fire sent */
32988
34374
  200: {
32989
34375
  headers: {
32990
34376
  [name: string]: unknown;
32991
34377
  };
32992
34378
  content: {
32993
34379
  "application/json": {
32994
- id: string;
32995
- name: string;
32996
34380
  /** @enum {string} */
32997
- action: "SEND_EMAIL" | "ADD_TO_DATASET" | "ADD_TO_ANNOTATION_QUEUE" | "SEND_SLACK_MESSAGE";
32998
- actionParams: {
32999
- [key: string]: unknown;
33000
- };
33001
- filters: {
33002
- [key: string]: unknown;
33003
- };
33004
- active: boolean;
33005
- message: string | null;
33006
- /** @enum {string|null} */
33007
- alertType: "CRITICAL" | "WARNING" | "INFO" | null;
33008
- createdAt: string;
33009
- updatedAt: string;
33010
- /** Format: uri */
33011
- platformUrl: string;
34381
+ channel: "email" | "slack" | "webhook";
34382
+ recipientCount: number;
34383
+ /** @description Whether the LangWatch default message was rendered because this automation states no template of its own. */
34384
+ usedDefault: boolean;
34385
+ missingVariables: string[];
34386
+ errors: string[];
34387
+ /** @description Webhook only: what the endpoint answered with. */
34388
+ httpStatus?: number;
33012
34389
  };
33013
34390
  };
33014
34391
  };
@@ -33074,6 +34451,90 @@ interface operations {
33074
34451
  };
33075
34452
  };
33076
34453
  };
34454
+ getApiSlackConnections: {
34455
+ parameters: {
34456
+ query?: never;
34457
+ header?: never;
34458
+ path?: never;
34459
+ cookie?: never;
34460
+ };
34461
+ requestBody?: never;
34462
+ responses: {
34463
+ /** @description Success */
34464
+ 200: {
34465
+ headers: {
34466
+ [name: string]: unknown;
34467
+ };
34468
+ content: {
34469
+ "application/json": {
34470
+ /** @description What an automation's `slackIntegrationId` names to post through this connection. */
34471
+ id: string;
34472
+ name: string;
34473
+ /**
34474
+ * @description `bot` posts as the LangWatch Slack app and needs a `slackChannelId` on the automation; `webhook` posts to its incoming webhook's channel.
34475
+ * @enum {string}
34476
+ */
34477
+ kind: "bot" | "webhook";
34478
+ /** @enum {string} */
34479
+ scopeType: "ORGANIZATION" | "PROJECT";
34480
+ scopeId: string;
34481
+ scopeName: string;
34482
+ /** @description The Slack workspace a bot connection posts into. */
34483
+ slackTeamName: string | null;
34484
+ createdAt: string;
34485
+ }[];
34486
+ };
34487
+ };
34488
+ /** @description Bad Request */
34489
+ 400: {
34490
+ headers: {
34491
+ [name: string]: unknown;
34492
+ };
34493
+ content: {
34494
+ "application/json": {
34495
+ error: string;
34496
+ message?: string;
34497
+ };
34498
+ };
34499
+ };
34500
+ /** @description Unauthorized */
34501
+ 401: {
34502
+ headers: {
34503
+ [name: string]: unknown;
34504
+ };
34505
+ content: {
34506
+ "application/json": {
34507
+ error: string;
34508
+ message?: string;
34509
+ };
34510
+ };
34511
+ };
34512
+ /** @description Unprocessable Entity */
34513
+ 422: {
34514
+ headers: {
34515
+ [name: string]: unknown;
34516
+ };
34517
+ content: {
34518
+ "application/json": {
34519
+ error: string;
34520
+ message?: string;
34521
+ };
34522
+ };
34523
+ };
34524
+ /** @description Internal Server Error */
34525
+ 500: {
34526
+ headers: {
34527
+ [name: string]: unknown;
34528
+ };
34529
+ content: {
34530
+ "application/json": {
34531
+ error: string;
34532
+ message?: string;
34533
+ };
34534
+ };
34535
+ };
34536
+ };
34537
+ };
33077
34538
  getApiWebhooksV1Endpoints: {
33078
34539
  parameters: {
33079
34540
  query?: never;