@belvador/api 0.2.0 → 0.4.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.
@@ -138,6 +138,34 @@ export declare const OPERATIONS: {
138
138
  readonly node: null;
139
139
  readonly defaults: {};
140
140
  };
141
+ readonly "coverage.get": {
142
+ readonly method: "GET";
143
+ readonly path: "/v1/coverage";
144
+ readonly pathParams: readonly [];
145
+ readonly scope: "coverage:read";
146
+ readonly kind: "read";
147
+ readonly sensitivity: "normal";
148
+ readonly idempotency: "none";
149
+ readonly ifMatch: false;
150
+ readonly paged: false;
151
+ readonly status: 200;
152
+ readonly node: null;
153
+ readonly defaults: {};
154
+ };
155
+ readonly "coverage.set": {
156
+ readonly method: "PUT";
157
+ readonly path: "/v1/projects/{project_id}/coverage-expectations";
158
+ readonly pathParams: readonly ["project_id"];
159
+ readonly scope: "coverage:write";
160
+ readonly kind: "write";
161
+ readonly sensitivity: "normal";
162
+ readonly idempotency: "optional";
163
+ readonly ifMatch: false;
164
+ readonly paged: false;
165
+ readonly status: 200;
166
+ readonly node: null;
167
+ readonly defaults: {};
168
+ };
141
169
  readonly "destinations.create": {
142
170
  readonly method: "POST";
143
171
  readonly path: "/v1/destinations";
@@ -283,6 +311,132 @@ export declare const OPERATIONS: {
283
311
  };
284
312
  readonly defaults: {};
285
313
  };
314
+ readonly "incident_rules.delete": {
315
+ readonly method: "DELETE";
316
+ readonly path: "/v1/incident-rules/{rule_id}";
317
+ readonly pathParams: readonly ["rule_id"];
318
+ readonly scope: "alerts:write";
319
+ readonly kind: "write";
320
+ readonly sensitivity: "normal";
321
+ readonly idempotency: "none";
322
+ readonly ifMatch: false;
323
+ readonly paged: false;
324
+ readonly status: 200;
325
+ readonly node: null;
326
+ readonly defaults: {};
327
+ };
328
+ readonly "incident_rules.list": {
329
+ readonly method: "GET";
330
+ readonly path: "/v1/incident-rules";
331
+ readonly pathParams: readonly [];
332
+ readonly scope: "alerts:read";
333
+ readonly kind: "read";
334
+ readonly sensitivity: "normal";
335
+ readonly idempotency: "none";
336
+ readonly ifMatch: false;
337
+ readonly paged: false;
338
+ readonly status: 200;
339
+ readonly node: null;
340
+ readonly defaults: {};
341
+ };
342
+ readonly "incident_rules.save": {
343
+ readonly method: "POST";
344
+ readonly path: "/v1/incident-rules";
345
+ readonly pathParams: readonly [];
346
+ readonly scope: "alerts:write";
347
+ readonly kind: "write";
348
+ readonly sensitivity: "normal";
349
+ readonly idempotency: "optional";
350
+ readonly ifMatch: false;
351
+ readonly paged: false;
352
+ readonly status: 200;
353
+ readonly node: null;
354
+ readonly defaults: {};
355
+ };
356
+ readonly "incidents.acknowledge": {
357
+ readonly method: "POST";
358
+ readonly path: "/v1/incidents/{incident_id}/ack";
359
+ readonly pathParams: readonly ["incident_id"];
360
+ readonly scope: "incidents:write";
361
+ readonly kind: "write";
362
+ readonly sensitivity: "normal";
363
+ readonly idempotency: "optional";
364
+ readonly ifMatch: false;
365
+ readonly paged: false;
366
+ readonly status: 200;
367
+ readonly node: null;
368
+ readonly defaults: {};
369
+ };
370
+ readonly "incidents.get": {
371
+ readonly method: "GET";
372
+ readonly path: "/v1/incidents/{incident_id}";
373
+ readonly pathParams: readonly ["incident_id"];
374
+ readonly scope: "incidents:read";
375
+ readonly kind: "read";
376
+ readonly sensitivity: "normal";
377
+ readonly idempotency: "none";
378
+ readonly ifMatch: false;
379
+ readonly paged: false;
380
+ readonly status: 200;
381
+ readonly node: null;
382
+ readonly defaults: {};
383
+ };
384
+ readonly "incidents.list": {
385
+ readonly method: "GET";
386
+ readonly path: "/v1/incidents";
387
+ readonly pathParams: readonly [];
388
+ readonly scope: "incidents:read";
389
+ readonly kind: "read";
390
+ readonly sensitivity: "normal";
391
+ readonly idempotency: "none";
392
+ readonly ifMatch: false;
393
+ readonly paged: true;
394
+ readonly status: 200;
395
+ readonly node: null;
396
+ readonly defaults: {};
397
+ };
398
+ readonly "incidents.note": {
399
+ readonly method: "POST";
400
+ readonly path: "/v1/incidents/{incident_id}/notes";
401
+ readonly pathParams: readonly ["incident_id"];
402
+ readonly scope: "incidents:write";
403
+ readonly kind: "write";
404
+ readonly sensitivity: "normal";
405
+ readonly idempotency: "optional";
406
+ readonly ifMatch: false;
407
+ readonly paged: false;
408
+ readonly status: 200;
409
+ readonly node: null;
410
+ readonly defaults: {};
411
+ };
412
+ readonly "incidents.resolve": {
413
+ readonly method: "POST";
414
+ readonly path: "/v1/incidents/{incident_id}/resolve";
415
+ readonly pathParams: readonly ["incident_id"];
416
+ readonly scope: "incidents:write";
417
+ readonly kind: "write";
418
+ readonly sensitivity: "normal";
419
+ readonly idempotency: "optional";
420
+ readonly ifMatch: false;
421
+ readonly paged: false;
422
+ readonly status: 200;
423
+ readonly node: null;
424
+ readonly defaults: {};
425
+ };
426
+ readonly "incidents.update": {
427
+ readonly method: "PATCH";
428
+ readonly path: "/v1/incidents/{incident_id}";
429
+ readonly pathParams: readonly ["incident_id"];
430
+ readonly scope: "incidents:write";
431
+ readonly kind: "write";
432
+ readonly sensitivity: "normal";
433
+ readonly idempotency: "none";
434
+ readonly ifMatch: false;
435
+ readonly paged: false;
436
+ readonly status: 200;
437
+ readonly node: null;
438
+ readonly defaults: {};
439
+ };
286
440
  readonly "ingest_keys.create": {
287
441
  readonly method: "POST";
288
442
  readonly path: "/v1/projects/{project_id}/ingest-keys";
@@ -520,6 +674,62 @@ export declare const OPERATIONS: {
520
674
  };
521
675
  readonly defaults: {};
522
676
  };
677
+ readonly "maintenance.create": {
678
+ readonly method: "POST";
679
+ readonly path: "/v1/maintenance-windows";
680
+ readonly pathParams: readonly [];
681
+ readonly scope: "monitors:write";
682
+ readonly kind: "write";
683
+ readonly sensitivity: "normal";
684
+ readonly idempotency: "required";
685
+ readonly ifMatch: false;
686
+ readonly paged: false;
687
+ readonly status: 201;
688
+ readonly node: null;
689
+ readonly defaults: {};
690
+ };
691
+ readonly "maintenance.delete": {
692
+ readonly method: "DELETE";
693
+ readonly path: "/v1/maintenance-windows/{window_id}";
694
+ readonly pathParams: readonly ["window_id"];
695
+ readonly scope: "monitors:write";
696
+ readonly kind: "write";
697
+ readonly sensitivity: "normal";
698
+ readonly idempotency: "none";
699
+ readonly ifMatch: false;
700
+ readonly paged: false;
701
+ readonly status: 200;
702
+ readonly node: null;
703
+ readonly defaults: {};
704
+ };
705
+ readonly "maintenance.list": {
706
+ readonly method: "GET";
707
+ readonly path: "/v1/maintenance-windows";
708
+ readonly pathParams: readonly [];
709
+ readonly scope: "monitors:read";
710
+ readonly kind: "read";
711
+ readonly sensitivity: "normal";
712
+ readonly idempotency: "none";
713
+ readonly ifMatch: false;
714
+ readonly paged: true;
715
+ readonly status: 200;
716
+ readonly node: null;
717
+ readonly defaults: {};
718
+ };
719
+ readonly "maintenance.update": {
720
+ readonly method: "PATCH";
721
+ readonly path: "/v1/maintenance-windows/{window_id}";
722
+ readonly pathParams: readonly ["window_id"];
723
+ readonly scope: "monitors:write";
724
+ readonly kind: "write";
725
+ readonly sensitivity: "normal";
726
+ readonly idempotency: "none";
727
+ readonly ifMatch: false;
728
+ readonly paged: false;
729
+ readonly status: 200;
730
+ readonly node: null;
731
+ readonly defaults: {};
732
+ };
523
733
  readonly "members.change_role": {
524
734
  readonly method: "PATCH";
525
735
  readonly path: "/v1/members/{user_id}";
@@ -562,6 +772,22 @@ export declare const OPERATIONS: {
562
772
  readonly node: null;
563
773
  readonly defaults: {};
564
774
  };
775
+ readonly "monitors.backtest": {
776
+ readonly method: "POST";
777
+ readonly path: "/v1/monitors/backtest";
778
+ readonly pathParams: readonly [];
779
+ readonly scope: "monitors:read";
780
+ readonly kind: "node";
781
+ readonly sensitivity: "normal";
782
+ readonly idempotency: "none";
783
+ readonly ifMatch: false;
784
+ readonly paged: false;
785
+ readonly status: 200;
786
+ readonly node: {
787
+ readonly path: "q/monitors/backtest";
788
+ };
789
+ readonly defaults: {};
790
+ };
565
791
  readonly "monitors.create": {
566
792
  readonly method: "POST";
567
793
  readonly path: "/v1/monitors";
@@ -632,6 +858,23 @@ export declare const OPERATIONS: {
632
858
  readonly node: null;
633
859
  readonly defaults: {};
634
860
  };
861
+ readonly "monitors.occurrences": {
862
+ readonly method: "GET";
863
+ readonly path: "/v1/monitors/{monitor_id}/occurrences";
864
+ readonly pathParams: readonly ["monitor_id"];
865
+ readonly scope: "monitors:read";
866
+ readonly kind: "node";
867
+ readonly sensitivity: "normal";
868
+ readonly idempotency: "none";
869
+ readonly ifMatch: false;
870
+ readonly paged: true;
871
+ readonly status: 200;
872
+ readonly node: {
873
+ readonly path: "q/monitors/{monitor_id}/occurrences";
874
+ readonly list: "occurrences";
875
+ };
876
+ readonly defaults: {};
877
+ };
635
878
  readonly "monitors.set_muted": {
636
879
  readonly method: "PUT";
637
880
  readonly path: "/v1/monitors/{monitor_id}/mute";
@@ -660,6 +903,22 @@ export declare const OPERATIONS: {
660
903
  readonly node: null;
661
904
  readonly defaults: {};
662
905
  };
906
+ readonly "monitors.signal": {
907
+ readonly method: "GET";
908
+ readonly path: "/v1/monitors/{monitor_id}/signal";
909
+ readonly pathParams: readonly ["monitor_id"];
910
+ readonly scope: "monitors:read";
911
+ readonly kind: "node";
912
+ readonly sensitivity: "normal";
913
+ readonly idempotency: "none";
914
+ readonly ifMatch: false;
915
+ readonly paged: false;
916
+ readonly status: 200;
917
+ readonly node: {
918
+ readonly path: "q/monitors/{monitor_id}/signal";
919
+ };
920
+ readonly defaults: {};
921
+ };
663
922
  readonly "monitors.update": {
664
923
  readonly method: "PATCH";
665
924
  readonly path: "/v1/monitors/{monitor_id}";
@@ -828,6 +1087,80 @@ export declare const OPERATIONS: {
828
1087
  readonly node: null;
829
1088
  readonly defaults: {};
830
1089
  };
1090
+ readonly "notification_policies.delete": {
1091
+ readonly method: "DELETE";
1092
+ readonly path: "/v1/notification-policies/{policy_id}";
1093
+ readonly pathParams: readonly ["policy_id"];
1094
+ readonly scope: "alerts:write";
1095
+ readonly kind: "write";
1096
+ readonly sensitivity: "normal";
1097
+ readonly idempotency: "none";
1098
+ readonly ifMatch: false;
1099
+ readonly paged: false;
1100
+ readonly status: 200;
1101
+ readonly node: null;
1102
+ readonly defaults: {};
1103
+ };
1104
+ readonly "notification_policies.list": {
1105
+ readonly method: "GET";
1106
+ readonly path: "/v1/notification-policies";
1107
+ readonly pathParams: readonly [];
1108
+ readonly scope: "alerts:read";
1109
+ readonly kind: "read";
1110
+ readonly sensitivity: "normal";
1111
+ readonly idempotency: "none";
1112
+ readonly ifMatch: false;
1113
+ readonly paged: false;
1114
+ readonly status: 200;
1115
+ readonly node: null;
1116
+ readonly defaults: {};
1117
+ };
1118
+ readonly "notification_policies.save": {
1119
+ readonly method: "POST";
1120
+ readonly path: "/v1/notification-policies";
1121
+ readonly pathParams: readonly [];
1122
+ readonly scope: "alerts:write";
1123
+ readonly kind: "write";
1124
+ readonly sensitivity: "normal";
1125
+ readonly idempotency: "optional";
1126
+ readonly ifMatch: false;
1127
+ readonly paged: false;
1128
+ readonly status: 200;
1129
+ readonly node: null;
1130
+ readonly defaults: {};
1131
+ };
1132
+ readonly "occurrences.cancel": {
1133
+ readonly method: "DELETE";
1134
+ readonly path: "/v1/occurrences/{monitor_slug}/{occurrence_id}";
1135
+ readonly pathParams: readonly ["monitor_slug", "occurrence_id"];
1136
+ readonly scope: "monitors:write";
1137
+ readonly kind: "node";
1138
+ readonly sensitivity: "normal";
1139
+ readonly idempotency: "none";
1140
+ readonly ifMatch: false;
1141
+ readonly paged: false;
1142
+ readonly status: 200;
1143
+ readonly node: {
1144
+ readonly path: "w/monitors/occurrences/cancel";
1145
+ };
1146
+ readonly defaults: {};
1147
+ };
1148
+ readonly "occurrences.create": {
1149
+ readonly method: "POST";
1150
+ readonly path: "/v1/occurrences";
1151
+ readonly pathParams: readonly [];
1152
+ readonly scope: "monitors:write";
1153
+ readonly kind: "node";
1154
+ readonly sensitivity: "normal";
1155
+ readonly idempotency: "none";
1156
+ readonly ifMatch: false;
1157
+ readonly paged: false;
1158
+ readonly status: 200;
1159
+ readonly node: {
1160
+ readonly path: "w/monitors/occurrences";
1161
+ };
1162
+ readonly defaults: {};
1163
+ };
831
1164
  readonly "ping_tokens.reset": {
832
1165
  readonly method: "POST";
833
1166
  readonly path: "/v1/monitors/{monitor_id}/ping-tokens/reset";
@@ -870,6 +1203,34 @@ export declare const OPERATIONS: {
870
1203
  readonly node: null;
871
1204
  readonly defaults: {};
872
1205
  };
1206
+ readonly "privacy.get": {
1207
+ readonly method: "GET";
1208
+ readonly path: "/v1/projects/{project_id}/privacy";
1209
+ readonly pathParams: readonly ["project_id"];
1210
+ readonly scope: "projects:read";
1211
+ readonly kind: "read";
1212
+ readonly sensitivity: "normal";
1213
+ readonly idempotency: "none";
1214
+ readonly ifMatch: false;
1215
+ readonly paged: false;
1216
+ readonly status: 200;
1217
+ readonly node: null;
1218
+ readonly defaults: {};
1219
+ };
1220
+ readonly "privacy.set": {
1221
+ readonly method: "PUT";
1222
+ readonly path: "/v1/projects/{project_id}/privacy";
1223
+ readonly pathParams: readonly ["project_id"];
1224
+ readonly scope: "privacy:write";
1225
+ readonly kind: "write";
1226
+ readonly sensitivity: "approval";
1227
+ readonly idempotency: "optional";
1228
+ readonly ifMatch: false;
1229
+ readonly paged: false;
1230
+ readonly status: 200;
1231
+ readonly node: null;
1232
+ readonly defaults: {};
1233
+ };
873
1234
  readonly "project_keys.create": {
874
1235
  readonly method: "POST";
875
1236
  readonly path: "/v1/projects/{project_id}/keys";
@@ -1030,7 +1391,7 @@ export declare const OPERATIONS: {
1030
1391
  readonly pathParams: readonly ["project_id", "group"];
1031
1392
  readonly scope: "privacy:write";
1032
1393
  readonly kind: "write";
1033
- readonly sensitivity: "normal";
1394
+ readonly sensitivity: "approval";
1034
1395
  readonly idempotency: "none";
1035
1396
  readonly ifMatch: false;
1036
1397
  readonly paged: false;
@@ -1559,8 +1920,9 @@ export interface OperationParams {
1559
1920
  is_enabled: boolean;
1560
1921
  notify_all: boolean;
1561
1922
  destination_ids: Array<string>;
1562
- monitor_kinds?: Array<"missed" | "failed" | "timeout" | "unknown">;
1923
+ monitor_kinds?: Array<"missed" | "failed" | "timeout" | "unknown" | "count" | "assertion" | "deadline" | "stalled">;
1563
1924
  slo_severities?: Array<"page" | "ticket">;
1925
+ policy_id?: string | null;
1564
1926
  };
1565
1927
  /** Turn a rule on or off. */
1566
1928
  "alert_rules.set_enabled": {
@@ -1583,9 +1945,26 @@ export interface OperationParams {
1583
1945
  limit?: number;
1584
1946
  cursor?: string;
1585
1947
  };
1586
- /** Start adding a Telegram, Slack, email or webhook destination; a person enters its secrets. */
1948
+ /** What each app is expected to send (surface × signal × environment) against what Belvador saw: `verified`, `stale`, `problem` or `unknown`, the verified rate, and signals seen but not declared. Same numbers as the Coverage page. */
1949
+ "coverage.get": {
1950
+ project_id?: number;
1951
+ environment?: string;
1952
+ };
1953
+ /** Replace a project's coverage expectations (one per environment × surface). `config_source: code` locks them in the app; send `ui` once to hand them back. Members and up. */
1954
+ "coverage.set": {
1955
+ project_id: number;
1956
+ config_source?: "ui" | "code";
1957
+ expectations: Array<{
1958
+ environment: string;
1959
+ surface: "browser" | "server" | "worker" | "job" | "edge_function" | "database" | "uptime";
1960
+ signals: Array<"errors" | "traces" | "logs" | "metrics" | "check_ins" | "web_vitals" | "probes">;
1961
+ stale_after_hours?: number;
1962
+ note?: string;
1963
+ }>;
1964
+ };
1965
+ /** Start adding a Telegram, Slack, email, webhook, PagerDuty or incident.io destination; a person enters its secrets. */
1587
1966
  "destinations.create": {
1588
- provider: "telegram" | "slack" | "email" | "webhook";
1967
+ provider: "telegram" | "slack" | "email" | "webhook" | "pagerduty" | "incident_io";
1589
1968
  name: string;
1590
1969
  project_ids: Array<number>;
1591
1970
  locale: "vi" | "en";
@@ -1632,6 +2011,58 @@ export interface OperationParams {
1632
2011
  issue_id: number;
1633
2012
  cursor?: string;
1634
2013
  };
2014
+ /** Delete an incident rule; open incidents stay as they are. */
2015
+ "incident_rules.delete": {
2016
+ rule_id: string;
2017
+ };
2018
+ /** Rules that turn alerts into incidents: match, grouping, window and recovery wait. */
2019
+ "incident_rules.list": Record<string, never>;
2020
+ /** Create (`rule_id` null) or replace an incident rule. Admins. */
2021
+ "incident_rules.save": {
2022
+ rule_id: string | null;
2023
+ input: {
2024
+ name: string;
2025
+ is_enabled: boolean;
2026
+ position?: number;
2027
+ project_ids: Array<number>;
2028
+ environments: Array<string>;
2029
+ kinds: Array<"monitor" | "uptime" | "slo" | "issue">;
2030
+ min_severity: "critical" | "high" | "medium" | "low";
2031
+ group_by: "monitor" | "project_env";
2032
+ window_minutes: number;
2033
+ recovery_hold_minutes: number;
2034
+ };
2035
+ };
2036
+ /** Take ownership of an open incident; stops its escalation. Members and up. */
2037
+ "incidents.acknowledge": {
2038
+ incident_id: string;
2039
+ };
2040
+ /** One incident with its linked alerts, timeline (notes included) and message deliveries (`accepted` = the provider took it; only a person acknowledges). */
2041
+ "incidents.get": {
2042
+ incident_id: string;
2043
+ };
2044
+ /** Incidents (INC-n): state, severity and peak, owner, linked alert count; newest first. */
2045
+ "incidents.list": {
2046
+ limit?: number;
2047
+ cursor?: string;
2048
+ state?: "active" | "resolved" | "all";
2049
+ };
2050
+ /** Add a note to the incident timeline (plain text, ≤ 2,000 characters). */
2051
+ "incidents.note": {
2052
+ incident_id: string;
2053
+ note: string;
2054
+ };
2055
+ /** Close an incident by hand with a reason (1–500 characters); it is labelled "not verified". */
2056
+ "incidents.resolve": {
2057
+ incident_id: string;
2058
+ note: string;
2059
+ };
2060
+ /** Rename an incident or assign it to a member (`owner_user_id: null` clears it). */
2061
+ "incidents.update": {
2062
+ incident_id: string;
2063
+ title?: string;
2064
+ owner_user_id?: string | null;
2065
+ };
1635
2066
  /** Create an OTLP ingest key (`bvi_`). */
1636
2067
  "ingest_keys.create": {
1637
2068
  project_id: number;
@@ -1780,6 +2211,59 @@ export interface OperationParams {
1780
2211
  order?: "asc" | "desc";
1781
2212
  cursor?: string;
1782
2213
  };
2214
+ /** Hold back monitor notifications during a one-off or weekly window (workspace, projects or monitors); monitors keep evaluating and recording. */
2215
+ "maintenance.create": Record<string, never> & ((Record<string, unknown>) & ({
2216
+ kind: "once";
2217
+ starts_at: string;
2218
+ scope: "workspace" | "project" | "monitor";
2219
+ project_ids: Array<number>;
2220
+ monitor_ids: Array<string>;
2221
+ timezone: string;
2222
+ duration_minutes: number;
2223
+ reason: string;
2224
+ } | {
2225
+ kind: "weekly";
2226
+ weekdays: Array<number>;
2227
+ start_time: string;
2228
+ scope: "workspace" | "project" | "monitor";
2229
+ project_ids: Array<number>;
2230
+ monitor_ids: Array<string>;
2231
+ timezone: string;
2232
+ duration_minutes: number;
2233
+ reason: string;
2234
+ }));
2235
+ /** Delete a maintenance window; notifications resume at once. */
2236
+ "maintenance.delete": {
2237
+ window_id: string;
2238
+ };
2239
+ /** Maintenance windows and whether each is active now. */
2240
+ "maintenance.list": {
2241
+ limit?: number;
2242
+ cursor?: string;
2243
+ };
2244
+ /** Replace a maintenance window's scope, times and reason. */
2245
+ "maintenance.update": {
2246
+ window_id: string;
2247
+ } & ((Record<string, unknown>) & ({
2248
+ kind: "once";
2249
+ starts_at: string;
2250
+ scope: "workspace" | "project" | "monitor";
2251
+ project_ids: Array<number>;
2252
+ monitor_ids: Array<string>;
2253
+ timezone: string;
2254
+ duration_minutes: number;
2255
+ reason: string;
2256
+ } | {
2257
+ kind: "weekly";
2258
+ weekdays: Array<number>;
2259
+ start_time: string;
2260
+ scope: "workspace" | "project" | "monitor";
2261
+ project_ids: Array<number>;
2262
+ monitor_ids: Array<string>;
2263
+ timezone: string;
2264
+ duration_minutes: number;
2265
+ reason: string;
2266
+ }));
1783
2267
  /** Change a member's role. */
1784
2268
  "members.change_role": {
1785
2269
  user_id: string;
@@ -1794,10 +2278,55 @@ export interface OperationParams {
1794
2278
  "members.remove": {
1795
2279
  user_id: string;
1796
2280
  };
1797
- /** Create a cron or heartbeat monitor. A heartbeat monitor returns its ping token once. */
1798
- "monitors.create": {
2281
+ /** How often count/assertion settings would have alerted over the last 30 days of stored data (same rule as the live evaluator). */
2282
+ "monitors.backtest": {
2283
+ project: number;
2284
+ settings: {
2285
+ type: "count";
2286
+ selector: {
2287
+ signal: "event" | "check_in" | "span" | "log";
2288
+ match: Array<{
2289
+ key: string;
2290
+ op: "eq" | "ne" | "lt" | "le" | "gt" | "ge" | "in" | "exists" | "not_exists" | "prefix";
2291
+ value?: string | number | boolean | Array<string>;
2292
+ }>;
2293
+ };
2294
+ window_minutes: number;
2295
+ comparator: "lt" | "gt" | "outside";
2296
+ threshold: number;
2297
+ threshold_high: number | null;
2298
+ missing_data: "alert" | "keep" | "resolve" | "treat_as_zero";
2299
+ environments: Array<string>;
2300
+ severity: "critical" | "high" | "medium" | "low";
2301
+ recovery_threshold: number;
2302
+ } | {
2303
+ type: "assertion";
2304
+ selector: {
2305
+ signal: "event" | "check_in" | "span" | "log";
2306
+ match: Array<{
2307
+ key: string;
2308
+ op: "eq" | "ne" | "lt" | "le" | "gt" | "ge" | "in" | "exists" | "not_exists" | "prefix";
2309
+ value?: string | number | boolean | Array<string>;
2310
+ }>;
2311
+ };
2312
+ assert: Array<{
2313
+ key: string;
2314
+ op: "eq" | "ne" | "lt" | "le" | "gt" | "ge" | "in" | "exists" | "not_exists" | "prefix";
2315
+ value?: string | number | boolean | Array<string>;
2316
+ }>;
2317
+ window_minutes: number;
2318
+ threshold: number;
2319
+ missing_data: "alert" | "keep" | "resolve" | "treat_as_zero";
2320
+ environments: Array<string>;
2321
+ severity: "critical" | "high" | "medium" | "low";
2322
+ recovery_threshold: number;
2323
+ };
2324
+ };
2325
+ /** Create a cron or heartbeat monitor, or a signal monitor (`settings.type`: count, assertion, deadline, progress). A heartbeat monitor returns its ping token once. */
2326
+ "monitors.create": Record<string, never> & (({
1799
2327
  project_id: number;
1800
2328
  slug: string;
2329
+ }) & ({
1801
2330
  name: string;
1802
2331
  mode?: "check_in" | "heartbeat";
1803
2332
  kind: "crontab" | "interval" | "on_demand";
@@ -1815,7 +2344,62 @@ export interface OperationParams {
1815
2344
  failure_threshold: number;
1816
2345
  recovery_threshold: number;
1817
2346
  expected_environments: Array<string>;
1818
- };
2347
+ } | {
2348
+ name: string;
2349
+ settings: {
2350
+ type: "count";
2351
+ selector: {
2352
+ signal: "event" | "check_in" | "span" | "log";
2353
+ match: Array<{
2354
+ key: string;
2355
+ op: "eq" | "ne" | "lt" | "le" | "gt" | "ge" | "in" | "exists" | "not_exists" | "prefix";
2356
+ value?: string | number | boolean | Array<string>;
2357
+ }>;
2358
+ };
2359
+ window_minutes: number;
2360
+ comparator: "lt" | "gt" | "outside";
2361
+ threshold: number;
2362
+ threshold_high: number | null;
2363
+ missing_data: "alert" | "keep" | "resolve" | "treat_as_zero";
2364
+ environments: Array<string>;
2365
+ severity: "critical" | "high" | "medium" | "low";
2366
+ recovery_threshold: number;
2367
+ } | {
2368
+ type: "assertion";
2369
+ selector: {
2370
+ signal: "event" | "check_in" | "span" | "log";
2371
+ match: Array<{
2372
+ key: string;
2373
+ op: "eq" | "ne" | "lt" | "le" | "gt" | "ge" | "in" | "exists" | "not_exists" | "prefix";
2374
+ value?: string | number | boolean | Array<string>;
2375
+ }>;
2376
+ };
2377
+ assert: Array<{
2378
+ key: string;
2379
+ op: "eq" | "ne" | "lt" | "le" | "gt" | "ge" | "in" | "exists" | "not_exists" | "prefix";
2380
+ value?: string | number | boolean | Array<string>;
2381
+ }>;
2382
+ window_minutes: number;
2383
+ threshold: number;
2384
+ missing_data: "alert" | "keep" | "resolve" | "treat_as_zero";
2385
+ environments: Array<string>;
2386
+ severity: "critical" | "high" | "medium" | "low";
2387
+ recovery_threshold: number;
2388
+ } | {
2389
+ type: "deadline";
2390
+ occurrence_grace_minutes: number;
2391
+ progress_timeout_minutes: number | null;
2392
+ environments: Array<string>;
2393
+ severity: "critical" | "high" | "medium" | "low";
2394
+ recovery_threshold: number;
2395
+ } | {
2396
+ type: "progress";
2397
+ progress_timeout_minutes: number;
2398
+ environments: Array<string>;
2399
+ severity: "critical" | "high" | "medium" | "low";
2400
+ recovery_threshold: number;
2401
+ };
2402
+ }));
1819
2403
  /** Delete a monitor; `confirm_slug` must repeat its slug. */
1820
2404
  "monitors.delete": {
1821
2405
  monitor_id: string;
@@ -1829,11 +2413,19 @@ export interface OperationParams {
1829
2413
  "monitors.get": {
1830
2414
  monitor_id: string;
1831
2415
  };
1832
- /** Cron and heartbeat monitors. */
2416
+ /** Monitors of every type (cron, heartbeat, count, assertion, deadline, progress); `type` narrows the list. */
1833
2417
  "monitors.list": {
1834
2418
  limit?: number;
1835
2419
  cursor?: string;
1836
2420
  project_id?: number;
2421
+ type?: "job" | "count" | "assertion" | "deadline" | "progress";
2422
+ };
2423
+ /** Occurrences of a deadline monitor (pending, on time, late, missed, failed, cancelled), newest due first. */
2424
+ "monitors.occurrences": {
2425
+ monitor_id: string;
2426
+ state?: "open" | "finished" | "all";
2427
+ environment?: string;
2428
+ cursor?: string;
1837
2429
  };
1838
2430
  /** Mute or unmute a monitor's alerts. */
1839
2431
  "monitors.set_muted": {
@@ -1845,9 +2437,15 @@ export interface OperationParams {
1845
2437
  monitor_id: string;
1846
2438
  until: string | "forever" | null;
1847
2439
  };
1848
- /** Replace a monitor's schedule, margins and thresholds. */
2440
+ /** A signal monitor's minute counts (count/assertion) for up to 24 h per environment, and its open runs (progress, deadline). */
2441
+ "monitors.signal": {
2442
+ monitor_id: string;
2443
+ hours?: number;
2444
+ };
2445
+ /** Replace a monitor's schedule, margins and thresholds, or a signal monitor's settings (the type stays). */
1849
2446
  "monitors.update": {
1850
2447
  monitor_id: string;
2448
+ } & ((Record<string, unknown>) & ({
1851
2449
  name: string;
1852
2450
  mode?: "check_in" | "heartbeat";
1853
2451
  kind: "crontab" | "interval" | "on_demand";
@@ -1865,7 +2463,62 @@ export interface OperationParams {
1865
2463
  failure_threshold: number;
1866
2464
  recovery_threshold: number;
1867
2465
  expected_environments: Array<string>;
1868
- };
2466
+ } | {
2467
+ name: string;
2468
+ settings: {
2469
+ type: "count";
2470
+ selector: {
2471
+ signal: "event" | "check_in" | "span" | "log";
2472
+ match: Array<{
2473
+ key: string;
2474
+ op: "eq" | "ne" | "lt" | "le" | "gt" | "ge" | "in" | "exists" | "not_exists" | "prefix";
2475
+ value?: string | number | boolean | Array<string>;
2476
+ }>;
2477
+ };
2478
+ window_minutes: number;
2479
+ comparator: "lt" | "gt" | "outside";
2480
+ threshold: number;
2481
+ threshold_high: number | null;
2482
+ missing_data: "alert" | "keep" | "resolve" | "treat_as_zero";
2483
+ environments: Array<string>;
2484
+ severity: "critical" | "high" | "medium" | "low";
2485
+ recovery_threshold: number;
2486
+ } | {
2487
+ type: "assertion";
2488
+ selector: {
2489
+ signal: "event" | "check_in" | "span" | "log";
2490
+ match: Array<{
2491
+ key: string;
2492
+ op: "eq" | "ne" | "lt" | "le" | "gt" | "ge" | "in" | "exists" | "not_exists" | "prefix";
2493
+ value?: string | number | boolean | Array<string>;
2494
+ }>;
2495
+ };
2496
+ assert: Array<{
2497
+ key: string;
2498
+ op: "eq" | "ne" | "lt" | "le" | "gt" | "ge" | "in" | "exists" | "not_exists" | "prefix";
2499
+ value?: string | number | boolean | Array<string>;
2500
+ }>;
2501
+ window_minutes: number;
2502
+ threshold: number;
2503
+ missing_data: "alert" | "keep" | "resolve" | "treat_as_zero";
2504
+ environments: Array<string>;
2505
+ severity: "critical" | "high" | "medium" | "low";
2506
+ recovery_threshold: number;
2507
+ } | {
2508
+ type: "deadline";
2509
+ occurrence_grace_minutes: number;
2510
+ progress_timeout_minutes: number | null;
2511
+ environments: Array<string>;
2512
+ severity: "critical" | "high" | "medium" | "low";
2513
+ recovery_threshold: number;
2514
+ } | {
2515
+ type: "progress";
2516
+ progress_timeout_minutes: number;
2517
+ environments: Array<string>;
2518
+ severity: "critical" | "high" | "medium" | "low";
2519
+ recovery_threshold: number;
2520
+ };
2521
+ }));
1869
2522
  /** Start a backup now (at most once per 10 minutes). */
1870
2523
  "node.backup_now": Record<string, never>;
1871
2524
  /** Cancel a scheduled node deletion. */
@@ -1909,6 +2562,48 @@ export interface OperationParams {
1909
2562
  "node.upgrade": {
1910
2563
  node_id: string;
1911
2564
  };
2565
+ /** Delete a policy (not the default); its rules fall back to the default policy. */
2566
+ "notification_policies.delete": {
2567
+ policy_id: string;
2568
+ };
2569
+ /** Notification policies: quiet hours, digest, fallback chain and escalation. */
2570
+ "notification_policies.list": Record<string, never>;
2571
+ /** Create (`policy_id` null) or replace a policy. Critical and high are never held; chains use existing destinations only. Admins. */
2572
+ "notification_policies.save": {
2573
+ policy_id: string | null;
2574
+ is_default: boolean;
2575
+ input: {
2576
+ name: string;
2577
+ timezone: string;
2578
+ quiet_hours: {
2579
+ days: Array<number>;
2580
+ start: string;
2581
+ end: string;
2582
+ } | null;
2583
+ quiet_severities: Array<"medium" | "low">;
2584
+ digest: "off" | "hourly" | "daily";
2585
+ digest_at: string | null;
2586
+ digest_severities: Array<"medium" | "low">;
2587
+ fallback: Array<string>;
2588
+ escalate_after_minutes: number | null;
2589
+ escalation: Array<string>;
2590
+ };
2591
+ };
2592
+ /** Cancel a pending occurrence (the app moved or dropped the job); a cancelled occurrence never alerts. */
2593
+ "occurrences.cancel": {
2594
+ monitor_slug: string;
2595
+ occurrence_id: string;
2596
+ project: number;
2597
+ environment?: string;
2598
+ };
2599
+ /** Register one run a deadline monitor expects (`due_at` within 35 days); the same id again moves its due time while it is pending. */
2600
+ "occurrences.create": {
2601
+ project: number;
2602
+ monitor_slug: string;
2603
+ occurrence_id: string;
2604
+ due_at: string;
2605
+ environment?: string;
2606
+ };
1912
2607
  /** Suspected leak: stop every live ping token and issue a new one. */
1913
2608
  "ping_tokens.reset": {
1914
2609
  monitor_id: string;
@@ -1922,6 +2617,27 @@ export interface OperationParams {
1922
2617
  monitor_id: string;
1923
2618
  grace_hours: number;
1924
2619
  };
2620
+ /** A project's privacy policy (mode, rules, strict allowlist, version), the built-in detectors that are off, whether user ids are pseudonymised, the last 20 versions and what the node applies and counted in the last 24 h. */
2621
+ "privacy.get": {
2622
+ project_id: number;
2623
+ };
2624
+ /** Replace a project's privacy policy (rules are applied in order on the node before anything is stored). Always needs an admin's approval; loosening (a rule removed or changed, strict off, allowlist grown) also needs their fresh authenticator code and emails owners. */
2625
+ "privacy.set": {
2626
+ project_id: number;
2627
+ expected_version: number;
2628
+ mode: "standard" | "strict";
2629
+ rules: Array<{
2630
+ id: string;
2631
+ selector: string;
2632
+ type: "pattern" | "anything" | "creditcard" | "ip" | "email" | "phone_e164";
2633
+ method: "remove" | "replace" | "mask" | "hash";
2634
+ pattern?: string;
2635
+ ignore_case?: boolean;
2636
+ replace_with?: string;
2637
+ enabled?: boolean;
2638
+ }>;
2639
+ allowlist: Array<string>;
2640
+ };
1925
2641
  /** Add a DSN key. */
1926
2642
  "project_keys.create": {
1927
2643
  project_id: number;