devhelm 0.7.0__tar.gz → 1.0.0__tar.gz

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 (52) hide show
  1. {devhelm-0.7.0 → devhelm-1.0.0}/PKG-INFO +1 -1
  2. {devhelm-0.7.0 → devhelm-1.0.0}/docs/openapi/monitoring-api.json +209 -17
  3. {devhelm-0.7.0 → devhelm-1.0.0}/pyproject.toml +1 -1
  4. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/_generated.py +121 -31
  5. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/types.py +11 -3
  6. {devhelm-0.7.0 → devhelm-1.0.0}/tests/test_negative_validation.py +12 -9
  7. {devhelm-0.7.0 → devhelm-1.0.0}/uv.lock +1 -1
  8. {devhelm-0.7.0 → devhelm-1.0.0}/.github/workflows/ci.yml +0 -0
  9. {devhelm-0.7.0 → devhelm-1.0.0}/.github/workflows/release.yml +0 -0
  10. {devhelm-0.7.0 → devhelm-1.0.0}/.github/workflows/spec-check.yml +0 -0
  11. {devhelm-0.7.0 → devhelm-1.0.0}/.gitignore +0 -0
  12. {devhelm-0.7.0 → devhelm-1.0.0}/LICENSE +0 -0
  13. {devhelm-0.7.0 → devhelm-1.0.0}/Makefile +0 -0
  14. {devhelm-0.7.0 → devhelm-1.0.0}/README.md +0 -0
  15. {devhelm-0.7.0 → devhelm-1.0.0}/scripts/inject_strict_config.py +0 -0
  16. {devhelm-0.7.0 → devhelm-1.0.0}/scripts/regen-from.sh +0 -0
  17. {devhelm-0.7.0 → devhelm-1.0.0}/scripts/release.sh +0 -0
  18. {devhelm-0.7.0 → devhelm-1.0.0}/scripts/typegen.sh +0 -0
  19. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/__init__.py +0 -0
  20. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/_errors.py +0 -0
  21. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/_http.py +0 -0
  22. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/_pagination.py +0 -0
  23. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/_validation.py +0 -0
  24. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/client.py +0 -0
  25. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/py.typed +0 -0
  26. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/__init__.py +0 -0
  27. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/alert_channels.py +0 -0
  28. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/api_keys.py +0 -0
  29. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/dependencies.py +0 -0
  30. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/deploy_lock.py +0 -0
  31. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/environments.py +0 -0
  32. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/forensics.py +0 -0
  33. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/incidents.py +0 -0
  34. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/maintenance_windows.py +0 -0
  35. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/monitors.py +0 -0
  36. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/notification_policies.py +0 -0
  37. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/resource_groups.py +0 -0
  38. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/secrets.py +0 -0
  39. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/status.py +0 -0
  40. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/status_pages.py +0 -0
  41. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/tags.py +0 -0
  42. {devhelm-0.7.0 → devhelm-1.0.0}/src/devhelm/resources/webhooks.py +0 -0
  43. {devhelm-0.7.0 → devhelm-1.0.0}/tests/__init__.py +0 -0
  44. {devhelm-0.7.0 → devhelm-1.0.0}/tests/run_sdk.py +0 -0
  45. {devhelm-0.7.0 → devhelm-1.0.0}/tests/test_client.py +0 -0
  46. {devhelm-0.7.0 → devhelm-1.0.0}/tests/test_errors.py +0 -0
  47. {devhelm-0.7.0 → devhelm-1.0.0}/tests/test_http.py +0 -0
  48. {devhelm-0.7.0 → devhelm-1.0.0}/tests/test_maintenance_windows.py +0 -0
  49. {devhelm-0.7.0 → devhelm-1.0.0}/tests/test_schemas.py +0 -0
  50. {devhelm-0.7.0 → devhelm-1.0.0}/tests/test_spec_parity.py +0 -0
  51. {devhelm-0.7.0 → devhelm-1.0.0}/tests/test_typing.py +0 -0
  52. {devhelm-0.7.0 → devhelm-1.0.0}/tests/test_validation_helpers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devhelm
3
- Version: 0.7.0
3
+ Version: 1.0.0
4
4
  Summary: DevHelm SDK for Python — typed client for monitors, incidents, alerting, and more
5
5
  Project-URL: Homepage, https://github.com/devhelmhq/sdk-python
6
6
  Project-URL: Repository, https://github.com/devhelmhq/sdk-python.git
@@ -166,8 +166,52 @@
166
166
  "Alert Channels"
167
167
  ],
168
168
  "summary": "List active alert channels for the authenticated org",
169
+ "description": "Supports filtering by `type` (channel integration), `managedBy` (creating surface), and `search` (case-insensitive contains on name). Unrecognised query parameters are silently ignored — pin to the documented set above.",
169
170
  "operationId": "list_14",
170
171
  "parameters": [
172
+ {
173
+ "name": "type",
174
+ "in": "query",
175
+ "description": "Filter by channel integration type (e.g. SLACK, WEBHOOK, EMAIL)",
176
+ "required": false,
177
+ "schema": {
178
+ "type": "string",
179
+ "enum": [
180
+ "email",
181
+ "webhook",
182
+ "slack",
183
+ "pagerduty",
184
+ "opsgenie",
185
+ "teams",
186
+ "discord"
187
+ ]
188
+ }
189
+ },
190
+ {
191
+ "name": "managedBy",
192
+ "in": "query",
193
+ "description": "Filter by managed-by source (DASHBOARD, CLI, TERRAFORM, MCP, API)",
194
+ "required": false,
195
+ "schema": {
196
+ "type": "string",
197
+ "enum": [
198
+ "DASHBOARD",
199
+ "CLI",
200
+ "TERRAFORM",
201
+ "MCP",
202
+ "API"
203
+ ]
204
+ }
205
+ },
206
+ {
207
+ "name": "search",
208
+ "in": "query",
209
+ "description": "Case-insensitive contains-match on the channel name",
210
+ "required": false,
211
+ "schema": {
212
+ "type": "string"
213
+ }
214
+ },
171
215
  {
172
216
  "name": "pageable",
173
217
  "in": "query",
@@ -6374,17 +6418,27 @@
6374
6418
  "Monitors"
6375
6419
  ],
6376
6420
  "summary": "List monitors for the authenticated org",
6421
+ "description": "Supports filtering by `enabled`, `status` (alias active|paused for enabled), `type`, `managedBy`, `tag` / `tags`, `search`, and `environmentId`. Unrecognised query parameters are silently ignored (Spring's default binding behaviour) — pin to the documented set above.",
6377
6422
  "operationId": "list_8",
6378
6423
  "parameters": [
6379
6424
  {
6380
6425
  "name": "enabled",
6381
6426
  "in": "query",
6382
- "description": "Filter by enabled state",
6427
+ "description": "Filter by enabled state (true/false)",
6383
6428
  "required": false,
6384
6429
  "schema": {
6385
6430
  "type": "boolean"
6386
6431
  }
6387
6432
  },
6433
+ {
6434
+ "name": "status",
6435
+ "in": "query",
6436
+ "description": "Lifecycle status alias: 'active' (enabled=true) or 'paused' (enabled=false). Ignored when ?enabled is also supplied.",
6437
+ "required": false,
6438
+ "schema": {
6439
+ "type": "string"
6440
+ }
6441
+ },
6388
6442
  {
6389
6443
  "name": "type",
6390
6444
  "in": "query",
@@ -6421,7 +6475,16 @@
6421
6475
  {
6422
6476
  "name": "tags",
6423
6477
  "in": "query",
6424
- "description": "Filter by tag names, comma-separated (e.g. prod,critical)",
6478
+ "description": "Filter by tag names, comma-separated (e.g. prod,critical); OR semantics",
6479
+ "required": false,
6480
+ "schema": {
6481
+ "type": "string"
6482
+ }
6483
+ },
6484
+ {
6485
+ "name": "tag",
6486
+ "in": "query",
6487
+ "description": "Filter by a single tag name (alias for ?tags=); merged with ?tags using OR semantics",
6425
6488
  "required": false,
6426
6489
  "schema": {
6427
6490
  "type": "string"
@@ -21729,6 +21792,18 @@
21729
21792
  "description": "SHA-256 hash of the channel config; use for change detection",
21730
21793
  "nullable": true
21731
21794
  },
21795
+ "managedBy": {
21796
+ "type": "string",
21797
+ "description": "Source that created/owns this channel: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on channels created before this attribution column existed.",
21798
+ "nullable": true,
21799
+ "enum": [
21800
+ "DASHBOARD",
21801
+ "CLI",
21802
+ "TERRAFORM",
21803
+ "MCP",
21804
+ "API"
21805
+ ]
21806
+ },
21732
21807
  "lastDeliveryAt": {
21733
21808
  "type": "string",
21734
21809
  "description": "Timestamp of the most recent delivery attempt",
@@ -22929,6 +23004,18 @@
22929
23004
  "$ref": "#/components/schemas/WebhookChannelConfig"
22930
23005
  }
22931
23006
  ]
23007
+ },
23008
+ "managedBy": {
23009
+ "type": "string",
23010
+ "description": "Source creating this channel: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.",
23011
+ "nullable": true,
23012
+ "enum": [
23013
+ "DASHBOARD",
23014
+ "CLI",
23015
+ "TERRAFORM",
23016
+ "MCP",
23017
+ "API"
23018
+ ]
22932
23019
  }
22933
23020
  }
22934
23021
  },
@@ -23189,12 +23276,14 @@
23189
23276
  "maxLength": 100,
23190
23277
  "minLength": 0,
23191
23278
  "type": "string",
23192
- "description": "iCal RRULE for recurring windows (max 100 chars); null for one-time",
23279
+ "description": "Reserved: iCal RRULE for recurring windows (stored but not yet honored)",
23193
23280
  "nullable": true
23194
23281
  },
23195
23282
  "reason": {
23283
+ "maxLength": 500,
23284
+ "minLength": 0,
23196
23285
  "type": "string",
23197
- "description": "Human-readable reason for the maintenance",
23286
+ "description": "Human-readable reason for the maintenance (max 500 chars)",
23198
23287
  "nullable": true
23199
23288
  },
23200
23289
  "suppressAlerts": {
@@ -23241,7 +23330,6 @@
23241
23330
  "CreateMonitorRequest": {
23242
23331
  "required": [
23243
23332
  "config",
23244
- "managedBy",
23245
23333
  "name",
23246
23334
  "type"
23247
23335
  ],
@@ -23288,8 +23376,10 @@
23288
23376
  ]
23289
23377
  },
23290
23378
  "frequencySeconds": {
23379
+ "maximum": 86400,
23380
+ "minimum": 10,
23291
23381
  "type": "integer",
23292
- "description": "Check frequency in seconds (30–86400); null defaults to plan minimum (60s on most paid plans)",
23382
+ "description": "Check frequency in seconds (10–86400); null defaults to plan minimum (60s on most paid plans)",
23293
23383
  "format": "int32",
23294
23384
  "nullable": true
23295
23385
  },
@@ -23300,16 +23390,17 @@
23300
23390
  },
23301
23391
  "regions": {
23302
23392
  "type": "array",
23303
- "description": "Probe regions to run checks from, e.g. us-east, eu-west",
23393
+ "description": "Probe regions to run checks from. Allowed values are deployment-dependent; production: us-east, us-west, eu-west, ap-south.",
23304
23394
  "nullable": true,
23305
23395
  "items": {
23306
23396
  "type": "string",
23307
- "description": "Probe regions to run checks from, e.g. us-east, eu-west"
23397
+ "description": "Probe regions to run checks from. Allowed values are deployment-dependent; production: us-east, us-west, eu-west, ap-south."
23308
23398
  }
23309
23399
  },
23310
23400
  "managedBy": {
23311
23401
  "type": "string",
23312
- "description": "Source that created/owns this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API. Use the value matching your surface so audit logs, drift detection, and analytics attribute correctly.",
23402
+ "description": "Source that created/owns this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted; set to your surface so audit logs, drift detection, and analytics attribute correctly.",
23403
+ "nullable": true,
23313
23404
  "enum": [
23314
23405
  "DASHBOARD",
23315
23406
  "CLI",
@@ -23510,6 +23601,18 @@
23510
23601
  "description": "Recovery cooldown in minutes after group incident resolves (0–60)",
23511
23602
  "format": "int32",
23512
23603
  "nullable": true
23604
+ },
23605
+ "managedBy": {
23606
+ "type": "string",
23607
+ "description": "Source creating this group: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.",
23608
+ "nullable": true,
23609
+ "enum": [
23610
+ "DASHBOARD",
23611
+ "CLI",
23612
+ "TERRAFORM",
23613
+ "MCP",
23614
+ "API"
23615
+ ]
23513
23616
  }
23514
23617
  },
23515
23618
  "description": "Request body for creating a resource group"
@@ -23811,6 +23914,18 @@
23811
23914
  "REVIEW",
23812
23915
  "AUTOMATIC"
23813
23916
  ]
23917
+ },
23918
+ "managedBy": {
23919
+ "type": "string",
23920
+ "description": "Source creating this page: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.",
23921
+ "nullable": true,
23922
+ "enum": [
23923
+ "DASHBOARD",
23924
+ "CLI",
23925
+ "TERRAFORM",
23926
+ "MCP",
23927
+ "API"
23928
+ ]
23814
23929
  }
23815
23930
  }
23816
23931
  },
@@ -26436,7 +26551,7 @@
26436
26551
  },
26437
26552
  "repeatRule": {
26438
26553
  "type": "string",
26439
- "description": "iCal RRULE for recurring windows; null for one-time",
26554
+ "description": "Reserved: iCal RRULE for recurring windows (stored but not yet honored)",
26440
26555
  "nullable": true
26441
26556
  },
26442
26557
  "reason": {
@@ -27271,6 +27386,18 @@
27271
27386
  "description": "Alert channel IDs linked to this monitor; populated on single-monitor responses",
27272
27387
  "format": "uuid"
27273
27388
  }
27389
+ },
27390
+ "currentStatus": {
27391
+ "type": "string",
27392
+ "description": "Current operational state — UP, DOWN, DEGRADED, PAUSED, or UNKNOWN if no probe data yet",
27393
+ "nullable": true,
27394
+ "enum": [
27395
+ "up",
27396
+ "degraded",
27397
+ "down",
27398
+ "paused",
27399
+ "unknown"
27400
+ ]
27274
27401
  }
27275
27402
  },
27276
27403
  "description": "Full monitor representation"
@@ -28461,6 +28588,18 @@
28461
28588
  "$ref": "#/components/schemas/ResourceGroupMemberDto"
28462
28589
  }
28463
28590
  },
28591
+ "managedBy": {
28592
+ "type": "string",
28593
+ "description": "Source that created/owns this group: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on groups created before this attribution column existed.",
28594
+ "nullable": true,
28595
+ "enum": [
28596
+ "DASHBOARD",
28597
+ "CLI",
28598
+ "TERRAFORM",
28599
+ "MCP",
28600
+ "API"
28601
+ ]
28602
+ },
28464
28603
  "createdAt": {
28465
28604
  "type": "string",
28466
28605
  "description": "Timestamp when the group was created",
@@ -28721,6 +28860,7 @@
28721
28860
  "up",
28722
28861
  "degraded",
28723
28862
  "down",
28863
+ "paused",
28724
28864
  "unknown"
28725
28865
  ]
28726
28866
  },
@@ -31056,6 +31196,18 @@
31056
31196
  "UNDER_MAINTENANCE"
31057
31197
  ]
31058
31198
  },
31199
+ "managedBy": {
31200
+ "type": "string",
31201
+ "description": "Source that created/owns this status page: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on pages created before this attribution column existed.",
31202
+ "nullable": true,
31203
+ "enum": [
31204
+ "DASHBOARD",
31205
+ "CLI",
31206
+ "TERRAFORM",
31207
+ "MCP",
31208
+ "API"
31209
+ ]
31210
+ },
31059
31211
  "createdAt": {
31060
31212
  "type": "string",
31061
31213
  "format": "date-time"
@@ -32999,6 +33151,18 @@
32999
33151
  "$ref": "#/components/schemas/WebhookChannelConfig"
33000
33152
  }
33001
33153
  ]
33154
+ },
33155
+ "managedBy": {
33156
+ "type": "string",
33157
+ "description": "New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value.",
33158
+ "nullable": true,
33159
+ "enum": [
33160
+ "DASHBOARD",
33161
+ "CLI",
33162
+ "TERRAFORM",
33163
+ "MCP",
33164
+ "API"
33165
+ ]
33002
33166
  }
33003
33167
  }
33004
33168
  },
@@ -33239,7 +33403,7 @@
33239
33403
  "properties": {
33240
33404
  "monitorId": {
33241
33405
  "type": "string",
33242
- "description": "Monitor to attach this maintenance window to; null preserves current",
33406
+ "description": "Monitor this window applies to; null switches the window to org-wide",
33243
33407
  "format": "uuid",
33244
33408
  "nullable": true
33245
33409
  },
@@ -33257,17 +33421,19 @@
33257
33421
  "maxLength": 100,
33258
33422
  "minLength": 0,
33259
33423
  "type": "string",
33260
- "description": "Updated iCal RRULE; null clears the repeat rule",
33424
+ "description": "Reserved: iCal RRULE for recurring windows (stored but not yet honored); null clears it",
33261
33425
  "nullable": true
33262
33426
  },
33263
33427
  "reason": {
33428
+ "maxLength": 500,
33429
+ "minLength": 0,
33264
33430
  "type": "string",
33265
- "description": "Updated reason; null clears the existing reason",
33431
+ "description": "Updated reason (max 500 chars); null clears the existing reason",
33266
33432
  "nullable": true
33267
33433
  },
33268
33434
  "suppressAlerts": {
33269
33435
  "type": "boolean",
33270
- "description": "Whether to suppress alerts; null preserves current",
33436
+ "description": "Whether to suppress alerts during this window; null defaults to true",
33271
33437
  "nullable": true
33272
33438
  }
33273
33439
  }
@@ -33330,8 +33496,10 @@
33330
33496
  ]
33331
33497
  },
33332
33498
  "frequencySeconds": {
33499
+ "maximum": 86400,
33500
+ "minimum": 10,
33333
33501
  "type": "integer",
33334
- "description": "New check frequency in seconds (30–86400); null preserves current",
33502
+ "description": "New check frequency in seconds (10–86400); null preserves current",
33335
33503
  "format": "int32",
33336
33504
  "nullable": true
33337
33505
  },
@@ -33342,11 +33510,11 @@
33342
33510
  },
33343
33511
  "regions": {
33344
33512
  "type": "array",
33345
- "description": "New probe regions; null preserves current",
33513
+ "description": "New probe regions; null preserves current. Allowed values are deployment-dependent.",
33346
33514
  "nullable": true,
33347
33515
  "items": {
33348
33516
  "type": "string",
33349
- "description": "New probe regions; null preserves current"
33517
+ "description": "New probe regions; null preserves current. Allowed values are deployment-dependent."
33350
33518
  }
33351
33519
  },
33352
33520
  "managedBy": {
@@ -33605,6 +33773,18 @@
33605
33773
  "description": "Recovery cooldown in minutes; null clears",
33606
33774
  "format": "int32",
33607
33775
  "nullable": true
33776
+ },
33777
+ "managedBy": {
33778
+ "type": "string",
33779
+ "description": "New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value.",
33780
+ "nullable": true,
33781
+ "enum": [
33782
+ "DASHBOARD",
33783
+ "CLI",
33784
+ "TERRAFORM",
33785
+ "MCP",
33786
+ "API"
33787
+ ]
33608
33788
  }
33609
33789
  },
33610
33790
  "description": "Request body for updating a resource group"
@@ -33809,6 +33989,18 @@
33809
33989
  "REVIEW",
33810
33990
  "AUTOMATIC"
33811
33991
  ]
33992
+ },
33993
+ "managedBy": {
33994
+ "type": "string",
33995
+ "description": "New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value.",
33996
+ "nullable": true,
33997
+ "enum": [
33998
+ "DASHBOARD",
33999
+ "CLI",
34000
+ "TERRAFORM",
34001
+ "MCP",
34002
+ "API"
34003
+ ]
33812
34004
  }
33813
34005
  }
33814
34006
  },
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "devhelm"
3
- version = "0.7.0"
3
+ version = "1.0.0"
4
4
  description = "DevHelm SDK for Python — typed client for monitors, incidents, alerting, and more"
5
5
  authors = [{ name = "DevHelm", email = "hello@devhelm.io" }]
6
6
  license = "MIT"
@@ -155,6 +155,14 @@ class ChannelType(StrEnum):
155
155
  discord = "discord"
156
156
 
157
157
 
158
+ class ManagedBy(StrEnum):
159
+ dashboard = "DASHBOARD"
160
+ cli = "CLI"
161
+ terraform = "TERRAFORM"
162
+ mcp = "MCP"
163
+ api = "API"
164
+
165
+
158
166
  class AlertChannelDto(BaseModel):
159
167
  model_config = ConfigDict(extra="forbid", populate_by_name=True)
160
168
  id: Annotated[UUID, Field(description="Unique alert channel identifier")]
@@ -186,6 +194,13 @@ class AlertChannelDto(BaseModel):
186
194
  description="SHA-256 hash of the channel config; use for change detection",
187
195
  ),
188
196
  ] = None
197
+ managed_by: Annotated[
198
+ ManagedBy | None,
199
+ Field(
200
+ alias="managedBy",
201
+ description="Source that created/owns this channel: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on channels created before this attribution column existed.",
202
+ ),
203
+ ] = None
189
204
  last_delivery_at: Annotated[
190
205
  AwareDatetime | None,
191
206
  Field(
@@ -814,13 +829,18 @@ class CreateMaintenanceWindowRequest(BaseModel):
814
829
  str | None,
815
830
  Field(
816
831
  alias="repeatRule",
817
- description="iCal RRULE for recurring windows (max 100 chars); null for one-time",
832
+ description="Reserved: iCal RRULE for recurring windows (stored but not yet honored)",
818
833
  max_length=100,
819
834
  min_length=0,
820
835
  ),
821
836
  ] = None
822
837
  reason: Annotated[
823
- str | None, Field(description="Human-readable reason for the maintenance")
838
+ str | None,
839
+ Field(
840
+ description="Human-readable reason for the maintenance (max 500 chars)",
841
+ max_length=500,
842
+ min_length=0,
843
+ ),
824
844
  ] = None
825
845
  suppress_alerts: Annotated[
826
846
  bool | None,
@@ -865,14 +885,6 @@ class Type(StrEnum):
865
885
  heartbeat = "HEARTBEAT"
866
886
 
867
887
 
868
- class ManagedBy(StrEnum):
869
- dashboard = "DASHBOARD"
870
- cli = "CLI"
871
- terraform = "TERRAFORM"
872
- mcp = "MCP"
873
- api = "API"
874
-
875
-
876
888
  class HealthThresholdType(StrEnum):
877
889
  count = "COUNT" # type: ignore[assignment]
878
890
  percentage = "PERCENTAGE"
@@ -2528,7 +2540,7 @@ class MaintenanceWindowDto(BaseModel):
2528
2540
  str | None,
2529
2541
  Field(
2530
2542
  alias="repeatRule",
2531
- description="iCal RRULE for recurring windows; null for one-time",
2543
+ description="Reserved: iCal RRULE for recurring windows (stored but not yet honored)",
2532
2544
  ),
2533
2545
  ] = None
2534
2546
  reason: Annotated[
@@ -2813,6 +2825,14 @@ class Type3(StrEnum):
2813
2825
  heartbeat = "HEARTBEAT"
2814
2826
 
2815
2827
 
2828
+ class CurrentStatus(StrEnum):
2829
+ up = "up"
2830
+ degraded = "degraded"
2831
+ down = "down"
2832
+ paused = "paused"
2833
+ unknown = "unknown"
2834
+
2835
+
2816
2836
  class MonitorReference(BaseModel):
2817
2837
  model_config = ConfigDict(extra="forbid", populate_by_name=True)
2818
2838
  id: Annotated[UUID, Field(description="Monitor identifier")]
@@ -3600,13 +3620,6 @@ class ResponseTimeWarnAssertion(BaseModel):
3600
3620
  ]
3601
3621
 
3602
3622
 
3603
- class CurrentStatus(StrEnum):
3604
- up = "up"
3605
- degraded = "degraded"
3606
- down = "down"
3607
- unknown = "unknown"
3608
-
3609
-
3610
3623
  class ResultSummaryDto(BaseModel):
3611
3624
  model_config = ConfigDict(extra="forbid", populate_by_name=True)
3612
3625
  current_status: Annotated[
@@ -4597,7 +4610,7 @@ class Type5(StrEnum):
4597
4610
  static = "STATIC"
4598
4611
 
4599
4612
 
4600
- class CurrentStatus1(StrEnum):
4613
+ class CurrentStatus2(StrEnum):
4601
4614
  operational = "OPERATIONAL"
4602
4615
  degraded_performance = "DEGRADED_PERFORMANCE"
4603
4616
  partial_outage = "PARTIAL_OUTAGE"
@@ -4615,7 +4628,7 @@ class StatusPageComponentDto(BaseModel):
4615
4628
  type: Type5
4616
4629
  monitor_id: Annotated[UUID | None, Field(alias="monitorId")] = None
4617
4630
  resource_group_id: Annotated[UUID | None, Field(alias="resourceGroupId")] = None
4618
- current_status: Annotated[CurrentStatus1, Field(alias="currentStatus")]
4631
+ current_status: Annotated[CurrentStatus2, Field(alias="currentStatus")]
4619
4632
  show_uptime: Annotated[bool, Field(alias="showUptime")]
4620
4633
  display_order: Annotated[int, Field(alias="displayOrder")]
4621
4634
  page_order: Annotated[int, Field(alias="pageOrder")]
@@ -4699,6 +4712,13 @@ class StatusPageDto(BaseModel):
4699
4712
  component_count: Annotated[int | None, Field(alias="componentCount")] = None
4700
4713
  subscriber_count: Annotated[int | None, Field(alias="subscriberCount")] = None
4701
4714
  overall_status: Annotated[OverallStatus | None, Field(alias="overallStatus")] = None
4715
+ managed_by: Annotated[
4716
+ ManagedBy | None,
4717
+ Field(
4718
+ alias="managedBy",
4719
+ description="Source that created/owns this status page: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on pages created before this attribution column existed.",
4720
+ ),
4721
+ ] = None
4702
4722
  created_at: Annotated[AwareDatetime, Field(alias="createdAt")]
4703
4723
  updated_at: Annotated[AwareDatetime, Field(alias="updatedAt")]
4704
4724
 
@@ -5419,7 +5439,7 @@ class UpdateMaintenanceWindowRequest(BaseModel):
5419
5439
  UUID | None,
5420
5440
  Field(
5421
5441
  alias="monitorId",
5422
- description="Monitor to attach this maintenance window to; null preserves current",
5442
+ description="Monitor this window applies to; null switches the window to org-wide",
5423
5443
  ),
5424
5444
  ] = None
5425
5445
  starts_at: Annotated[
@@ -5433,19 +5453,24 @@ class UpdateMaintenanceWindowRequest(BaseModel):
5433
5453
  str | None,
5434
5454
  Field(
5435
5455
  alias="repeatRule",
5436
- description="Updated iCal RRULE; null clears the repeat rule",
5456
+ description="Reserved: iCal RRULE for recurring windows (stored but not yet honored); null clears it",
5437
5457
  max_length=100,
5438
5458
  min_length=0,
5439
5459
  ),
5440
5460
  ] = None
5441
5461
  reason: Annotated[
5442
- str | None, Field(description="Updated reason; null clears the existing reason")
5462
+ str | None,
5463
+ Field(
5464
+ description="Updated reason (max 500 chars); null clears the existing reason",
5465
+ max_length=500,
5466
+ min_length=0,
5467
+ ),
5443
5468
  ] = None
5444
5469
  suppress_alerts: Annotated[
5445
5470
  bool | None,
5446
5471
  Field(
5447
5472
  alias="suppressAlerts",
5448
- description="Whether to suppress alerts; null preserves current",
5473
+ description="Whether to suppress alerts during this window; null defaults to true",
5449
5474
  ),
5450
5475
  ] = None
5451
5476
 
@@ -5591,6 +5616,13 @@ class UpdateResourceGroupRequest(BaseModel):
5591
5616
  le=60,
5592
5617
  ),
5593
5618
  ] = None
5619
+ managed_by: Annotated[
5620
+ ManagedBy | None,
5621
+ Field(
5622
+ alias="managedBy",
5623
+ description="New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value.",
5624
+ ),
5625
+ ] = None
5594
5626
 
5595
5627
 
5596
5628
  class UpdateSecretRequest(BaseModel):
@@ -5774,6 +5806,13 @@ class UpdateStatusPageRequest(BaseModel):
5774
5806
  description="Incident mode: MANUAL, REVIEW, or AUTOMATIC; null preserves current",
5775
5807
  ),
5776
5808
  ] = None
5809
+ managed_by: Annotated[
5810
+ ManagedBy | None,
5811
+ Field(
5812
+ alias="managedBy",
5813
+ description="New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value.",
5814
+ ),
5815
+ ] = None
5777
5816
 
5778
5817
 
5779
5818
  class UpdateTagRequest(BaseModel):
@@ -6195,6 +6234,13 @@ class CreateAlertChannelRequest(BaseModel):
6195
6234
  | WebhookChannelConfig,
6196
6235
  Field(discriminator="channel_type"),
6197
6236
  ]
6237
+ managed_by: Annotated[
6238
+ ManagedBy | None,
6239
+ Field(
6240
+ alias="managedBy",
6241
+ description="Source creating this channel: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.",
6242
+ ),
6243
+ ] = None
6198
6244
 
6199
6245
 
6200
6246
  class CreateAssertionRequest(BaseModel):
@@ -6275,7 +6321,9 @@ class CreateMonitorRequest(BaseModel):
6275
6321
  int | None,
6276
6322
  Field(
6277
6323
  alias="frequencySeconds",
6278
- description="Check frequency in seconds (30–86400); null defaults to plan minimum (60s on most paid plans)",
6324
+ description="Check frequency in seconds (10–86400); null defaults to plan minimum (60s on most paid plans)",
6325
+ ge=10,
6326
+ le=86400,
6279
6327
  ),
6280
6328
  ] = None
6281
6329
  enabled: Annotated[
@@ -6283,15 +6331,17 @@ class CreateMonitorRequest(BaseModel):
6283
6331
  ] = None
6284
6332
  regions: Annotated[
6285
6333
  list[str] | None,
6286
- Field(description="Probe regions to run checks from, e.g. us-east, eu-west"),
6334
+ Field(
6335
+ description="Probe regions to run checks from. Allowed values are deployment-dependent; production: us-east, us-west, eu-west, ap-south."
6336
+ ),
6287
6337
  ] = None
6288
6338
  managed_by: Annotated[
6289
- ManagedBy,
6339
+ ManagedBy | None,
6290
6340
  Field(
6291
6341
  alias="managedBy",
6292
- description="Source that created/owns this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API. Use the value matching your surface so audit logs, drift detection, and analytics attribute correctly.",
6342
+ description="Source that created/owns this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted; set to your surface so audit logs, drift detection, and analytics attribute correctly.",
6293
6343
  ),
6294
- ]
6344
+ ] = None
6295
6345
  environment_id: Annotated[
6296
6346
  UUID | None,
6297
6347
  Field(
@@ -6409,6 +6459,13 @@ class CreateResourceGroupRequest(BaseModel):
6409
6459
  le=60,
6410
6460
  ),
6411
6461
  ] = None
6462
+ managed_by: Annotated[
6463
+ ManagedBy | None,
6464
+ Field(
6465
+ alias="managedBy",
6466
+ description="Source creating this group: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.",
6467
+ ),
6468
+ ] = None
6412
6469
 
6413
6470
 
6414
6471
  class CreateStatusPageRequest(BaseModel):
@@ -6455,6 +6512,13 @@ class CreateStatusPageRequest(BaseModel):
6455
6512
  description="Incident mode: MANUAL, REVIEW, or AUTOMATIC (default: AUTOMATIC)",
6456
6513
  ),
6457
6514
  ] = None
6515
+ managed_by: Annotated[
6516
+ ManagedBy | None,
6517
+ Field(
6518
+ alias="managedBy",
6519
+ description="Source creating this page: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.",
6520
+ ),
6521
+ ] = None
6458
6522
 
6459
6523
 
6460
6524
  class CursorPageServiceCatalogDto(BaseModel):
@@ -6896,6 +6960,13 @@ class MonitorDto(BaseModel):
6896
6960
  description="Alert channel IDs linked to this monitor; populated on single-monitor responses",
6897
6961
  ),
6898
6962
  ] = None
6963
+ current_status: Annotated[
6964
+ CurrentStatus | None,
6965
+ Field(
6966
+ alias="currentStatus",
6967
+ description="Current operational state — UP, DOWN, DEGRADED, PAUSED, or UNKNOWN if no probe data yet",
6968
+ ),
6969
+ ] = None
6899
6970
 
6900
6971
 
6901
6972
  class MonitorTestRequest(BaseModel):
@@ -7075,6 +7146,13 @@ class ResourceGroupDto(BaseModel):
7075
7146
  description="Member list with individual statuses; populated on detail GET only"
7076
7147
  ),
7077
7148
  ] = None
7149
+ managed_by: Annotated[
7150
+ ManagedBy | None,
7151
+ Field(
7152
+ alias="managedBy",
7153
+ description="Source that created/owns this group: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on groups created before this attribution column existed.",
7154
+ ),
7155
+ ] = None
7078
7156
  created_at: Annotated[
7079
7157
  AwareDatetime,
7080
7158
  Field(alias="createdAt", description="Timestamp when the group was created"),
@@ -7475,6 +7553,13 @@ class UpdateAlertChannelRequest(BaseModel):
7475
7553
  | WebhookChannelConfig,
7476
7554
  Field(discriminator="channel_type"),
7477
7555
  ]
7556
+ managed_by: Annotated[
7557
+ ManagedBy | None,
7558
+ Field(
7559
+ alias="managedBy",
7560
+ description="New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value.",
7561
+ ),
7562
+ ] = None
7478
7563
 
7479
7564
 
7480
7565
  class UpdateMonitorRequest(BaseModel):
@@ -7500,7 +7585,9 @@ class UpdateMonitorRequest(BaseModel):
7500
7585
  int | None,
7501
7586
  Field(
7502
7587
  alias="frequencySeconds",
7503
- description="New check frequency in seconds (30–86400); null preserves current",
7588
+ description="New check frequency in seconds (10–86400); null preserves current",
7589
+ ge=10,
7590
+ le=86400,
7504
7591
  ),
7505
7592
  ] = None
7506
7593
  enabled: Annotated[
@@ -7508,7 +7595,10 @@ class UpdateMonitorRequest(BaseModel):
7508
7595
  Field(description="Enable or disable the monitor; null preserves current"),
7509
7596
  ] = None
7510
7597
  regions: Annotated[
7511
- list[str] | None, Field(description="New probe regions; null preserves current")
7598
+ list[str] | None,
7599
+ Field(
7600
+ description="New probe regions; null preserves current. Allowed values are deployment-dependent."
7601
+ ),
7512
7602
  ] = None
7513
7603
  managed_by: Annotated[
7514
7604
  ManagedBy | None,
@@ -143,11 +143,19 @@ from devhelm._generated import (
143
143
  )
144
144
  from devhelm._generated import (
145
145
  #
146
- # CurrentStatus enums
147
- CurrentStatus as MonitorCurrentStatus, # ResultSummaryDto.current_status
146
+ # CurrentStatus enums.
147
+ #
148
+ # NOTE on suffix stability: datamodel-code-generator names inline enums by
149
+ # iteration order (CurrentStatus, CurrentStatus1, …). Adding another DTO
150
+ # with a `currentStatus` field can shift the suffixes. As of mono v0.13+
151
+ # `CurrentStatus` is shared by `MonitorDto.currentStatus` and
152
+ # `ResultSummaryDto.currentStatus` (deduped — identical value sets), and
153
+ # `CurrentStatus2` belongs to `StatusPageComponentDto.currentStatus`
154
+ # (different value set: OPERATIONAL/DEGRADED_PERFORMANCE/...).
155
+ CurrentStatus as MonitorCurrentStatus, # MonitorDto.current_status + ResultSummaryDto.current_status
148
156
  )
149
157
  from devhelm._generated import (
150
- CurrentStatus1 as StatusPageComponentCurrentStatus, # StatusPageComponentDto.current_status
158
+ CurrentStatus2 as StatusPageComponentCurrentStatus, # StatusPageComponentDto.current_status
151
159
  )
152
160
  from devhelm._generated import (
153
161
  #
@@ -546,15 +546,18 @@ class TestCreateMonitorRequestNegative:
546
546
  {"name": "X", "type": "HTTP", "managedBy": "DASHBOARD"}
547
547
  )
548
548
 
549
- def test_missing_managed_by(self) -> None:
550
- with pytest.raises(ValidationError, match="managedBy"):
551
- CreateMonitorRequest.model_validate(
552
- {
553
- "name": "X",
554
- "type": "HTTP",
555
- "config": {"url": "https://x.com", "method": "GET"},
556
- }
557
- )
549
+ def test_managed_by_optional_defaults_server_side(self) -> None:
550
+ # As of mono v0.13, managedBy is optional on Create requests and
551
+ # defaults to API server-side. The SDK should accept payloads
552
+ # without it.
553
+ req = CreateMonitorRequest.model_validate(
554
+ {
555
+ "name": "X",
556
+ "type": "HTTP",
557
+ "config": {"url": "https://x.com", "method": "GET"},
558
+ }
559
+ )
560
+ assert req.managed_by is None
558
561
 
559
562
  def test_invalid_type_enum(self) -> None:
560
563
  with pytest.raises(ValidationError):
@@ -315,7 +315,7 @@ wheels = [
315
315
 
316
316
  [[package]]
317
317
  name = "devhelm"
318
- version = "0.7.0"
318
+ version = "1.0.0"
319
319
  source = { editable = "." }
320
320
  dependencies = [
321
321
  { name = "httpx" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes