infrawrench-sdk 0.26.0 → 0.28.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2d2602cdedc66b61d3b3bad751fb661d7e437c502c5144c9ec9cd814d86eb894
4
- data.tar.gz: 39e5b7420a43d1de53ef24f23397d6a709ef55359150a05eaf1628996197aa25
3
+ metadata.gz: edc3a7dbc71d1e8a2dd3b550bc9f6a12c756099844446736c876b038517db51b
4
+ data.tar.gz: 9ba35c615b9ffe37cf2fbf7959253f40c4ca8755f74a1766706499800c59e3ce
5
5
  SHA512:
6
- metadata.gz: 1903b58cb24c797955629ed23a4f63622be421c10ce59a989fbfbf704f7a88f6e2f651a839e364f0c804d1446b43d788063ce8469758ecfb250db7123bbb1753
7
- data.tar.gz: 8b6f32ed8a863ebfdc267678d1cb2667da2a6e16caf67cc16f24ebafb1bc51d1716c9604d41a847c0403e5477fb098d220cfff13713a521050dbe4bb9f6f06b1
6
+ metadata.gz: ce60e4429633e19bf757cd0fabf572b7a8412362affe398b409a4293fe7aca6cbf20ee17744367f8c1810c4ad8f0f947583ed31d79ce13355407e2374e6c5ed3
7
+ data.tar.gz: 5c50424f9363ad95e86aa8e3197aa69411d90aa1ffa9df66bac0be5f8e9378befb0f5ab55151d88c4d9bff8651d9260b218b4ef1f0a5b405b13b1b6a8af17f45
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # infrawrench-sdk
2
2
 
3
- Generated Ruby client for the Infrawrench API (API version `0.26.0`).
3
+ Generated Ruby client for the Infrawrench API (API version `0.28.0`).
4
4
 
5
5
  **Do not edit this gem by hand** — it is regenerated from `openapi.json` and is
6
6
  not checked into the repository. Run
@@ -41,7 +41,7 @@ Every method takes an optional trailing `request_options:` hash (`:headers`,
41
41
  Responses are the plain `Hash`/`Array` that `JSON.parse` returns, with String
42
42
  keys spelled exactly as the wire spells them. There are no model classes — see
43
43
  [`sig/infrawrench/sdk.rbs`](./sig/infrawrench/sdk.rbs) for the shape of every one of the
44
- 246 schemas, as RBS type aliases that steep and TypeProf can read.
44
+ 257 schemas, as RBS type aliases that steep and TypeProf can read.
45
45
 
46
46
  Non-2xx responses raise `Infrawrench::ApiError`, which carries `#status`,
47
47
  the parsed `#body`, and the machine-readable `#code` when the API sends one —
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # infrawrench-sdk v0.26.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v0.28.0 | MIT | Copyright (c) 2026 Infrawrench LLC
4
4
  # https://github.com/Infrawrench/Infrawrench
5
5
  #
6
- # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 0.26.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 0.28.0).
7
7
  #
8
8
  # DO NOT EDIT. Regenerate with:
9
9
  # pnpm --filter @infrawrench/web generate:sdk
@@ -17,8 +17,8 @@ require_relative "lib/infrawrench/version"
17
17
  Gem::Specification.new do |spec|
18
18
  spec.name = "infrawrench-sdk"
19
19
  spec.version = Infrawrench::VERSION
20
- spec.summary = "Generated Ruby client for the Infrawrench API (v0.26.0)."
21
- spec.description = "Generated Ruby client for the Infrawrench API (v0.26.0). Covers the published API surface only — operations marked x-internal in the spec are not generated. No runtime dependencies."
20
+ spec.summary = "Generated Ruby client for the Infrawrench API (v0.28.0)."
21
+ spec.description = "Generated Ruby client for the Infrawrench API (v0.28.0). Covers the published API surface only — operations marked x-internal in the spec are not generated. No runtime dependencies."
22
22
  spec.authors = ["Infrawrench LLC", "Astrid Gealer"]
23
23
  spec.email = ["astrid@infrawrench.com"]
24
24
  spec.homepage = "https://infrawrench.com/docs/team-and-billing/client-sdks"
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # infrawrench-sdk v0.26.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v0.28.0 | MIT | Copyright (c) 2026 Infrawrench LLC
4
4
  # https://github.com/Infrawrench/Infrawrench
5
5
  #
6
- # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 0.26.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 0.28.0).
7
7
  #
8
8
  # DO NOT EDIT. Regenerate with:
9
9
  # pnpm --filter @infrawrench/web generate:sdk
@@ -1269,12 +1269,78 @@ module Infrawrench
1269
1269
  end
1270
1270
  end
1271
1271
 
1272
+ # `client.changes.alert_settings`
1273
+ class ChangesAlertSettingsNamespace
1274
+ # @api private
1275
+ # @param transport [Transport]
1276
+ def initialize(transport)
1277
+ @transport = transport
1278
+ end
1279
+
1280
+ # Get the organization's resource-drift alert filter
1281
+ #
1282
+ # Drift notifications are batched: at most one message per organization per
1283
+ # `cooldownMinutes`, covering every change since the previous one. These
1284
+ # settings decide which changes count and how often a message may go out.
1285
+ # Who receives it is the `resourceDrift` opt-in on push preferences, Slack
1286
+ # channels and Teams webhooks — off by default on all three.
1287
+ #
1288
+ # GET /api/org/{orgId}/changes/alert-settings
1289
+ #
1290
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
1291
+ # constructed with.
1292
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
1293
+ # @return [Hash] Parsed JSON, shaped as `DriftAlertSettings` — see
1294
+ # `sig/infrawrench/sdk.rbs`.
1295
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
1296
+ def get(org_id: nil, request_options: nil)
1297
+ @transport.request(
1298
+ http_method: "GET",
1299
+ path: "/api/org/{orgId}/changes/alert-settings",
1300
+ path_params: { "orgId" => org_id },
1301
+ request_options: request_options
1302
+ )
1303
+ end
1304
+
1305
+ # Update the organization's resource-drift alert filter
1306
+ #
1307
+ # Every field is optional so a single toggle can be saved on its own.
1308
+ # `cooldownMinutes` is floored at 5: below the poller's own cycle the
1309
+ # notification rate would follow the sync rate again, which is what the
1310
+ # batching exists to prevent.
1311
+ #
1312
+ # PUT /api/org/{orgId}/changes/alert-settings
1313
+ #
1314
+ # Raises on 400: Bad request
1315
+ #
1316
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
1317
+ # constructed with.
1318
+ # @param body [Hash, nil] Request body, shaped as `DriftAlertSettingsUpdate`.
1319
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
1320
+ # @return [Hash] Parsed JSON, shaped as `DriftAlertSettings` — see
1321
+ # `sig/infrawrench/sdk.rbs`.
1322
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
1323
+ def update(org_id: nil, body: nil, request_options: nil)
1324
+ @transport.request(
1325
+ http_method: "PUT",
1326
+ path: "/api/org/{orgId}/changes/alert-settings",
1327
+ path_params: { "orgId" => org_id },
1328
+ body: body,
1329
+ request_options: request_options
1330
+ )
1331
+ end
1332
+ end
1333
+
1272
1334
  # `client.changes`
1273
1335
  class ChangesNamespace
1336
+ # @return [ChangesAlertSettingsNamespace] `client.changes.alert_settings`
1337
+ attr_reader :alert_settings
1338
+
1274
1339
  # @api private
1275
1340
  # @param transport [Transport]
1276
1341
  def initialize(transport)
1277
1342
  @transport = transport
1343
+ @alert_settings = ChangesAlertSettingsNamespace.new(@transport)
1278
1344
  end
1279
1345
 
1280
1346
  # Org-wide change timeline (paginated, filterable)
@@ -1449,20 +1515,97 @@ module Infrawrench
1449
1515
  end
1450
1516
  end
1451
1517
 
1518
+ # `client.costs.anomaly_settings`
1519
+ class CostsAnomalySettingsNamespace
1520
+ # @api private
1521
+ # @param transport [Transport]
1522
+ def initialize(transport)
1523
+ @transport = transport
1524
+ end
1525
+
1526
+ # Get the organization's anomaly detection thresholds
1527
+ #
1528
+ # The tunable part of cost anomaly detection. Everything else about the
1529
+ # model — the 28-day baseline, the 7-day notification cooldown, the minimum
1530
+ # history a baseline needs — is fixed. An organization that has never
1531
+ # changed a threshold reads back the defaults. The response also carries the
1532
+ # derived, read-only `smsConfigured`.
1533
+ #
1534
+ # _Requires permission: `costs:read`._
1535
+ #
1536
+ # GET /api/org/{orgId}/costs/anomaly-settings
1537
+ #
1538
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
1539
+ # constructed with.
1540
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
1541
+ # @return [Hash] Parsed JSON, shaped as `CostAnomalySettingsView` — see
1542
+ # `sig/infrawrench/sdk.rbs`.
1543
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
1544
+ def get(org_id: nil, request_options: nil)
1545
+ @transport.request(
1546
+ http_method: "GET",
1547
+ path: "/api/org/{orgId}/costs/anomaly-settings",
1548
+ path_params: { "orgId" => org_id },
1549
+ request_options: request_options
1550
+ )
1551
+ end
1552
+
1553
+ # Update the organization's anomaly detection thresholds
1554
+ #
1555
+ # Takes effect on the next detection pass (which runs after each cost
1556
+ # collection). Anomalies already stored are not re-judged. All four fields
1557
+ # are required — this is a PUT of the whole settings object, not a patch —
1558
+ # and `smsAlerts` deliberately has no server-side default, so a client that
1559
+ # omits it is rejected rather than silently switching an organization's SMS
1560
+ # paging back off. `smsConfigured` is derived and is not accepted here.
1561
+ #
1562
+ # _Requires permission: `costs:write`._
1563
+ #
1564
+ # PUT /api/org/{orgId}/costs/anomaly-settings
1565
+ #
1566
+ # Raises on 400: Bad request
1567
+ #
1568
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
1569
+ # constructed with.
1570
+ # @param body [Hash] Request body, shaped as `CostAnomalySettings`.
1571
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
1572
+ # @return [Hash] Parsed JSON, shaped as `CostAnomalySettingsView` — see
1573
+ # `sig/infrawrench/sdk.rbs`.
1574
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
1575
+ def update(body:, org_id: nil, request_options: nil)
1576
+ @transport.request(
1577
+ http_method: "PUT",
1578
+ path: "/api/org/{orgId}/costs/anomaly-settings",
1579
+ path_params: { "orgId" => org_id },
1580
+ body: body,
1581
+ request_options: request_options
1582
+ )
1583
+ end
1584
+ end
1585
+
1452
1586
  # `client.costs`
1453
1587
  class CostsNamespace
1588
+ # @return [CostsAnomalySettingsNamespace] `client.costs.anomaly_settings`
1589
+ attr_reader :anomaly_settings
1590
+
1454
1591
  # @api private
1455
1592
  # @param transport [Transport]
1456
1593
  def initialize(transport)
1457
1594
  @transport = transport
1595
+ @anomaly_settings = CostsAnomalySettingsNamespace.new(@transport)
1458
1596
  end
1459
1597
 
1460
1598
  # List recently detected cost anomalies
1461
1599
  #
1462
- # Spend anomalies detected by the daily background pass: days where a
1463
- # provider's or service's spend exceeded its trailing 28-day baseline by a
1464
- # statistical threshold (mean + N·stddev, with an absolute floor to ignore
1465
- # penny-scale noise). Newest day first, capped at 200 rows.
1600
+ # Spend anomalies detected by the daily background pass. Two kinds share the
1601
+ # list: a `spike`, where a provider's or service's spend exceeded its
1602
+ # trailing 28-day baseline by a statistical threshold (mean + N·stddev, with
1603
+ # an absolute floor to ignore penny-scale noise), and a `new_source`, where
1604
+ # a provider or service with no spend at all across that window suddenly
1605
+ # billed a material amount. Thresholds are per organization — see GET
1606
+ # /costs/anomaly-settings. Newest day first, capped at 200 rows.
1607
+ #
1608
+ # _Requires permission: `costs:read`._
1466
1609
  #
1467
1610
  # GET /api/org/{orgId}/costs/anomalies
1468
1611
  #
@@ -2697,19 +2840,106 @@ module Infrawrench
2697
2840
  end
2698
2841
  end
2699
2842
 
2843
+ # `client.digest.recipients`
2844
+ class DigestRecipientsNamespace
2845
+ # @api private
2846
+ # @param transport [Transport]
2847
+ def initialize(transport)
2848
+ @transport = transport
2849
+ end
2850
+
2851
+ # Add a digest email recipient
2852
+ #
2853
+ # Adding an address the organization already has is a no-op that returns the
2854
+ # existing entry, so a double submit cannot double-deliver.
2855
+ #
2856
+ # POST /api/org/{orgId}/digest/recipients
2857
+ #
2858
+ # Raises on 400: Bad request
2859
+ #
2860
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
2861
+ # constructed with.
2862
+ # @param body [Hash, nil] Request body, shaped as `DigestEmailRecipientCreate`.
2863
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
2864
+ # @return [Hash] Parsed JSON, shaped as `DigestEmailRecipient` — see
2865
+ # `sig/infrawrench/sdk.rbs`.
2866
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
2867
+ def create(org_id: nil, body: nil, request_options: nil)
2868
+ @transport.request(
2869
+ http_method: "POST",
2870
+ path: "/api/org/{orgId}/digest/recipients",
2871
+ path_params: { "orgId" => org_id },
2872
+ body: body,
2873
+ request_options: request_options
2874
+ )
2875
+ end
2876
+
2877
+ # Remove a digest email recipient
2878
+ #
2879
+ # DELETE /api/org/{orgId}/digest/recipients/{recipientId}
2880
+ #
2881
+ # Raises on 404: Not found
2882
+ #
2883
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
2884
+ # constructed with.
2885
+ # @param recipient_id [String] Recipient id
2886
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
2887
+ # @return [Hash] Parsed JSON, shaped as `Hash` — see `sig/infrawrench/sdk.rbs`.
2888
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
2889
+ def delete(recipient_id:, org_id: nil, request_options: nil)
2890
+ @transport.request(
2891
+ http_method: "DELETE",
2892
+ path: "/api/org/{orgId}/digest/recipients/{recipientId}",
2893
+ path_params: { "orgId" => org_id, "recipientId" => recipient_id },
2894
+ request_options: request_options
2895
+ )
2896
+ end
2897
+
2898
+ # List the organization's digest email recipients
2899
+ #
2900
+ # Email is a digest-only transport, so its destinations are an
2901
+ # organization-level address list rather than a per-channel trigger.
2902
+ # Addresses need not belong to Infrawrench users — a finance alias is a
2903
+ # valid recipient.
2904
+ #
2905
+ # GET /api/org/{orgId}/digest/recipients
2906
+ #
2907
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
2908
+ # constructed with.
2909
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
2910
+ # @return [Hash] Parsed JSON, shaped as `DigestEmailRecipientList` — see
2911
+ # `sig/infrawrench/sdk.rbs`.
2912
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
2913
+ def get(org_id: nil, request_options: nil)
2914
+ @transport.request(
2915
+ http_method: "GET",
2916
+ path: "/api/org/{orgId}/digest/recipients",
2917
+ path_params: { "orgId" => org_id },
2918
+ request_options: request_options
2919
+ )
2920
+ end
2921
+ end
2922
+
2700
2923
  # `client.digest`
2701
2924
  class DigestNamespace
2925
+ # @return [DigestRecipientsNamespace] `client.digest.recipients`
2926
+ attr_reader :recipients
2927
+
2702
2928
  # @api private
2703
2929
  # @param transport [Transport]
2704
2930
  def initialize(transport)
2705
2931
  @transport = transport
2932
+ @recipients = DigestRecipientsNamespace.new(@transport)
2706
2933
  end
2707
2934
 
2708
2935
  # Get the organization's weekly digest settings
2709
2936
  #
2710
- # The weekly digest is a Monday-morning summary of last week's spend (with
2711
- # week-over-week movers), sync incidents, and resource churn, delivered to
2712
- # the Slack channels and Teams webhooks opted into the weeklyDigest trigger.
2937
+ # The weekly digest is a summary of the last complete Monday-to-Sunday
2938
+ # week's spend (with week-over-week movers), sync incidents, and resource
2939
+ # churn, delivered to the Slack channels and Teams webhooks opted into the
2940
+ # weeklyDigest trigger and to the organization's digest email recipients.
2941
+ # The response also carries the outcome of the most recent delivery attempt
2942
+ # so a silently failing digest is visible.
2713
2943
  #
2714
2944
  # GET /api/org/{orgId}/digest
2715
2945
  #
@@ -2730,8 +2960,10 @@ module Infrawrench
2730
2960
  # Compose and send last week's digest now
2731
2961
  #
2732
2962
  # Ignores the schedule and the enabled flag — composes the digest for the
2733
- # last complete week and posts it to every opted-in channel. Fails when no
2734
- # Slack channel or Teams webhook has the weeklyDigest trigger on.
2963
+ # last complete week and sends it to every opted-in channel and email
2964
+ # recipient. This is also the manual recovery for a partial delivery, which
2965
+ # is never retried automatically. Fails when nothing is routed to receive
2966
+ # the digest, or when every destination rejected it.
2735
2967
  #
2736
2968
  # POST /api/org/{orgId}/digest/send
2737
2969
  #
@@ -2751,11 +2983,14 @@ module Infrawrench
2751
2983
  )
2752
2984
  end
2753
2985
 
2754
- # Enable or disable the weekly digest
2986
+ # Update the weekly digest settings
2755
2987
  #
2756
- # Enabling schedules the first digest for next Monday morning (07:00 UTC)
2757
- # rather than sending immediately — use POST /digest/send for an immediate
2758
- # one.
2988
+ # Every field is optional. Enabling schedules the first digest for the next
2989
+ # configured send time rather than sending immediately — use POST
2990
+ # /digest/send for an immediate one. The week boundary follows `timezone`,
2991
+ # so the reported window is always the organization's own local
2992
+ # Monday-to-Sunday week. Changing the schedule clears any parked failure
2993
+ # state but never replays a week that already went out.
2759
2994
  #
2760
2995
  # PUT /api/org/{orgId}/digest
2761
2996
  #
@@ -5609,7 +5844,7 @@ module Infrawrench
5609
5844
  #
5610
5845
  # The suspended run resumes within a few seconds of the decision landing.
5611
5846
  #
5612
- # _Requires permission: `dashboards:write`._
5847
+ # _Requires permission: `workflows:approve`._
5613
5848
  #
5614
5849
  # POST /api/org/{orgId}/workflow-approvals/{id}/approve
5615
5850
  #
@@ -5636,7 +5871,7 @@ module Infrawrench
5636
5871
  #
5637
5872
  # Denial fails the waiting `infra.waitForApproval(...)` call in the run.
5638
5873
  #
5639
- # _Requires permission: `dashboards:write`._
5874
+ # _Requires permission: `workflows:approve`._
5640
5875
  #
5641
5876
  # POST /api/org/{orgId}/workflow-approvals/{id}/deny
5642
5877
  #
@@ -5665,7 +5900,7 @@ module Infrawrench
5665
5900
  # runs, newest first. Filter with `status=pending` to build an approvals
5666
5901
  # inbox.
5667
5902
  #
5668
- # _Requires permission: `dashboards:read`._
5903
+ # _Requires permission: `workflows:read`._
5669
5904
  #
5670
5905
  # GET /api/org/{orgId}/workflow-approvals
5671
5906
  #
@@ -5691,6 +5926,114 @@ module Infrawrench
5691
5926
  end
5692
5927
  end
5693
5928
 
5929
+ # `client.workflows.schedule`
5930
+ class WorkflowsScheduleNamespace
5931
+ # @api private
5932
+ # @param transport [Transport]
5933
+ def initialize(transport)
5934
+ @transport = transport
5935
+ end
5936
+
5937
+ # Remove a workflow's cron schedule
5938
+ #
5939
+ # Reverts the workflow's trigger to manual and clears the pending fire time.
5940
+ # A no-op when the trigger is not cron.
5941
+ #
5942
+ # _Requires permission: `dashboards:write`._
5943
+ #
5944
+ # DELETE /api/org/{orgId}/workflows/{id}/schedule
5945
+ #
5946
+ # Raises on 404: Not found
5947
+ #
5948
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
5949
+ # constructed with.
5950
+ # @param id [String] Workflow id
5951
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
5952
+ # @return [Hash] Parsed JSON, shaped as `Ok` — see `sig/infrawrench/sdk.rbs`.
5953
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
5954
+ def delete(id:, org_id: nil, request_options: nil)
5955
+ @transport.request(
5956
+ http_method: "DELETE",
5957
+ path: "/api/org/{orgId}/workflows/{id}/schedule",
5958
+ path_params: { "orgId" => org_id, "id" => id },
5959
+ request_options: request_options
5960
+ )
5961
+ end
5962
+
5963
+ # Get a workflow's cron schedule
5964
+ #
5965
+ # The schedule view of the workflow's trigger, with the next few computed
5966
+ # fire times. `schedule` is null when the workflow is triggered some other
5967
+ # way (manual, git, budget).
5968
+ #
5969
+ # _Requires permission: `dashboards:read`._
5970
+ #
5971
+ # GET /api/org/{orgId}/workflows/{id}/schedule
5972
+ #
5973
+ # Raises on 404: Not found
5974
+ #
5975
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
5976
+ # constructed with.
5977
+ # @param id [String] Workflow id
5978
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
5979
+ # @return [Hash] Parsed JSON, shaped as `WorkflowScheduleResponse` — see
5980
+ # `sig/infrawrench/sdk.rbs`.
5981
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
5982
+ def get(id:, org_id: nil, request_options: nil)
5983
+ @transport.request(
5984
+ http_method: "GET",
5985
+ path: "/api/org/{orgId}/workflows/{id}/schedule",
5986
+ path_params: { "orgId" => org_id, "id" => id },
5987
+ request_options: request_options
5988
+ )
5989
+ end
5990
+
5991
+ # Create or replace a workflow's cron schedule
5992
+ #
5993
+ # Sets the workflow's trigger to cron with the given expression and
5994
+ # timezone, validating both, and computes the next fire time. The workflow
5995
+ # fires at the schedule's next occurrence — never immediately on save.
5996
+ #
5997
+ # _Requires permission: `dashboards:write`._
5998
+ #
5999
+ # PUT /api/org/{orgId}/workflows/{id}/schedule
6000
+ #
6001
+ # Raises on 400: Bad request
6002
+ #
6003
+ # Raises on 404: Not found
6004
+ #
6005
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
6006
+ # constructed with.
6007
+ # @param id [String] Workflow id
6008
+ # @param body [Hash] Request body, shaped as `WorkflowScheduleInput`.
6009
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
6010
+ # @return [Hash] Parsed JSON, shaped as `WorkflowScheduleResponse` — see
6011
+ # `sig/infrawrench/sdk.rbs`.
6012
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
6013
+ def update(id:, body:, org_id: nil, request_options: nil)
6014
+ @transport.request(
6015
+ http_method: "PUT",
6016
+ path: "/api/org/{orgId}/workflows/{id}/schedule",
6017
+ path_params: { "orgId" => org_id, "id" => id },
6018
+ body: body,
6019
+ request_options: request_options
6020
+ )
6021
+ end
6022
+ end
6023
+
6024
+ # `client.workflows`
6025
+ class WorkflowsNamespace
6026
+ # @return [WorkflowsScheduleNamespace] `client.workflows.schedule`
6027
+ attr_reader :schedule
6028
+
6029
+ # @api private
6030
+ # @param transport [Transport]
6031
+ def initialize(transport)
6032
+ @transport = transport
6033
+ @schedule = WorkflowsScheduleNamespace.new(@transport)
6034
+ end
6035
+ end
6036
+
5694
6037
  # A client for the Infrawrench API.
5695
6038
  #
5696
6039
  # client = Infrawrench::APIV1Client.new(
@@ -5777,6 +6120,8 @@ module Infrawrench
5777
6120
  attr_reader :team
5778
6121
  # @return [WorkflowApprovalsNamespace] `client.workflow_approvals`
5779
6122
  attr_reader :workflow_approvals
6123
+ # @return [WorkflowsNamespace] `client.workflows`
6124
+ attr_reader :workflows
5780
6125
 
5781
6126
  # @param options [Hash] Client configuration — `:base_url`, `:api_key`,
5782
6127
  # `:org_id`, `:headers`, `:timeout`, `:open_timeout` and `:http_handler`.
@@ -5820,6 +6165,7 @@ module Infrawrench
5820
6165
  @storage = StorageNamespace.new(@transport)
5821
6166
  @team = TeamNamespace.new(@transport)
5822
6167
  @workflow_approvals = WorkflowApprovalsNamespace.new(@transport)
6168
+ @workflows = WorkflowsNamespace.new(@transport)
5823
6169
  end
5824
6170
  end
5825
6171
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # infrawrench-sdk v0.26.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v0.28.0 | MIT | Copyright (c) 2026 Infrawrench LLC
4
4
  # https://github.com/Infrawrench/Infrawrench
5
5
  #
6
- # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 0.26.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 0.28.0).
7
7
  #
8
8
  # DO NOT EDIT. Regenerate with:
9
9
  # pnpm --filter @infrawrench/web generate:sdk
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # infrawrench-sdk v0.26.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v0.28.0 | MIT | Copyright (c) 2026 Infrawrench LLC
4
4
  # https://github.com/Infrawrench/Infrawrench
5
5
  #
6
- # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 0.26.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 0.28.0).
7
7
  #
8
8
  # DO NOT EDIT. Regenerate with:
9
9
  # pnpm --filter @infrawrench/web generate:sdk
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # infrawrench-sdk v0.26.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v0.28.0 | MIT | Copyright (c) 2026 Infrawrench LLC
4
4
  # https://github.com/Infrawrench/Infrawrench
5
5
  #
6
- # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 0.26.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 0.28.0).
7
7
  #
8
8
  # DO NOT EDIT. Regenerate with:
9
9
  # pnpm --filter @infrawrench/web generate:sdk
@@ -15,5 +15,5 @@
15
15
  # Kept in its own file so the gemspec can read the version without loading the
16
16
  # client — a gemspec that pulls in net/http is a gemspec that can fail to parse.
17
17
  module Infrawrench
18
- VERSION = "0.26.0"
18
+ VERSION = "0.28.0"
19
19
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # infrawrench-sdk v0.26.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v0.28.0 | MIT | Copyright (c) 2026 Infrawrench LLC
4
4
  # https://github.com/Infrawrench/Infrawrench
5
5
  #
6
- # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 0.26.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 0.28.0).
7
7
  #
8
8
  # DO NOT EDIT. Regenerate with:
9
9
  # pnpm --filter @infrawrench/web generate:sdk
@@ -1,7 +1,7 @@
1
- # infrawrench-sdk v0.26.0 | MIT | Copyright (c) 2026 Infrawrench LLC
1
+ # infrawrench-sdk v0.28.0 | MIT | Copyright (c) 2026 Infrawrench LLC
2
2
  # https://github.com/Infrawrench/Infrawrench
3
3
  #
4
- # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 0.26.0).
4
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 0.28.0).
5
5
  #
6
6
  # DO NOT EDIT. Regenerate with:
7
7
  # pnpm --filter @infrawrench/web generate:sdk
@@ -452,6 +452,7 @@ module Infrawrench
452
452
  type cost_anomaly = {
453
453
  "id" => String,
454
454
  "day" => String,
455
+ "kind" => "spike" | "new_source",
455
456
  "dimension" => "provider" | "service",
456
457
  "dimensionKey" => String,
457
458
  "currency" => String,
@@ -462,6 +463,17 @@ module Infrawrench
462
463
  "notifiedAt" => String | nil
463
464
  }
464
465
 
466
+ # Spec schema: `CostAnomalySettings`.
467
+ type cost_anomaly_settings = {
468
+ "sigmas" => Numeric,
469
+ "minDeltaCents" => Integer,
470
+ "newSourceMinCents" => Integer,
471
+ "smsAlerts" => "off" | "new_source" | "all"
472
+ }
473
+
474
+ # Spec schema: `CostAnomalySettingsView`.
475
+ type cost_anomaly_settings_view = cost_anomaly_settings & { "smsConfigured" => bool }
476
+
465
477
  # Spec schema: `CostDimension`.
466
478
  type cost_dimension = "provider" | "account" | "service" | "region" | "resource" | "tag"
467
479
 
@@ -925,14 +937,54 @@ module Infrawrench
925
937
  # Spec schema: `DescribeResponse`.
926
938
  type describe_response = { "text" => String }
927
939
 
940
+ # Spec schema: `DigestEmailRecipient`.
941
+ type digest_email_recipient = { "id" => String, "email" => String }
942
+
943
+ # Spec schema: `DigestEmailRecipientCreate`.
944
+ type digest_email_recipient_create = { "email" => String }
945
+
946
+ # Spec schema: `DigestEmailRecipientList`.
947
+ type digest_email_recipient_list = { "recipients" => Array[digest_email_recipient] }
948
+
928
949
  # Spec schema: `DigestSendResult`.
929
- type digest_send_result = { "ok" => bool, "attempted" => Integer, "succeeded" => Integer }
950
+ type digest_send_result = {
951
+ "ok" => bool,
952
+ "attempted" => Integer,
953
+ "succeeded" => Integer,
954
+ "slack" => digest_transport_result,
955
+ "teams" => digest_transport_result,
956
+ "email" => digest_transport_result
957
+ }
930
958
 
931
959
  # Spec schema: `DigestSettings`.
932
- type digest_settings = { "enabled" => bool, "lastSentWeekStart" => String | nil, "lastSentAt" => String | nil }
960
+ type digest_settings = {
961
+ "enabled" => bool,
962
+ "lastSentWeekStart" => String | nil,
963
+ "lastSentAt" => String | nil,
964
+ "timezone" => String,
965
+ "sendDay" => Integer,
966
+ "sendHour" => Integer,
967
+ "narrativeEnabled" => bool,
968
+ "narrativeAvailable" => bool,
969
+ "emailAvailable" => bool,
970
+ "attemptCount" => Integer,
971
+ "lastAttemptAt" => String | nil,
972
+ "lastStatus" => "pending" | "succeeded" | "partial" | "failed" | "no_targets" | nil,
973
+ "lastError" => String | nil,
974
+ "nextAttemptAt" => String | nil
975
+ }
933
976
 
934
977
  # Spec schema: `DigestSettingsUpdate`.
935
- type digest_settings_update = { "enabled" => bool }
978
+ type digest_settings_update = {
979
+ ?"enabled" => bool,
980
+ ?"timezone" => String,
981
+ ?"sendDay" => Integer,
982
+ ?"sendHour" => Integer,
983
+ ?"narrativeEnabled" => bool
984
+ }
985
+
986
+ # Spec schema: `DigestTransportResult`.
987
+ type digest_transport_result = { "attempted" => Integer, "succeeded" => Integer }
936
988
 
937
989
  # Spec schema: `DockerCommandRequest`.
938
990
  type docker_command_request = { "accountId" => String, "op" => String, ?"params" => json_object }
@@ -940,6 +992,27 @@ module Infrawrench
940
992
  # Spec schema: `DockerCommandResponse`.
941
993
  type docker_command_response = { ?"result" => json_object | untyped | nil }
942
994
 
995
+ # Spec schema: `DriftAlertSettings`.
996
+ type drift_alert_settings = {
997
+ "notifyCreated" => bool,
998
+ "notifyUpdated" => bool,
999
+ "notifyDeleted" => bool,
1000
+ "cooldownMinutes" => Integer,
1001
+ "minChanges" => Integer,
1002
+ "accountIds" => Array[String],
1003
+ "lastNotifiedAt" => String | nil
1004
+ }
1005
+
1006
+ # Spec schema: `DriftAlertSettingsUpdate`.
1007
+ type drift_alert_settings_update = {
1008
+ ?"notifyCreated" => bool,
1009
+ ?"notifyUpdated" => bool,
1010
+ ?"notifyDeleted" => bool,
1011
+ ?"cooldownMinutes" => Integer,
1012
+ ?"minChanges" => Integer,
1013
+ ?"accountIds" => Array[String]
1014
+ }
1015
+
943
1016
  # Spec schema: `EditableField`.
944
1017
  type editable_field = {
945
1018
  "key" => String,
@@ -1118,6 +1191,7 @@ module Infrawrench
1118
1191
  "syncIncidents" => bool,
1119
1192
  "budgetAlerts" => bool,
1120
1193
  "anomalyAlerts" => bool,
1194
+ "resourceDrift" => bool,
1121
1195
  "workflowPages" => bool,
1122
1196
  "weeklyDigest" => bool
1123
1197
  }
@@ -1129,6 +1203,7 @@ module Infrawrench
1129
1203
  ?"syncIncidents" => bool,
1130
1204
  ?"budgetAlerts" => bool,
1131
1205
  ?"anomalyAlerts" => bool,
1206
+ ?"resourceDrift" => bool,
1132
1207
  ?"workflowPages" => bool,
1133
1208
  ?"weeklyDigest" => bool
1134
1209
  }
@@ -1139,6 +1214,7 @@ module Infrawrench
1139
1214
  ?"syncIncidents" => bool,
1140
1215
  ?"budgetAlerts" => bool,
1141
1216
  ?"anomalyAlerts" => bool,
1217
+ ?"resourceDrift" => bool,
1142
1218
  ?"workflowPages" => bool,
1143
1219
  ?"weeklyDigest" => bool
1144
1220
  }
@@ -1278,6 +1354,9 @@ module Infrawrench
1278
1354
  | "storage:write"
1279
1355
  | "dashboards:read"
1280
1356
  | "dashboards:write"
1357
+ | "workflows:read"
1358
+ | "workflows:write"
1359
+ | "workflows:approve"
1281
1360
  | "deployments:read"
1282
1361
  | "deployments:plan"
1283
1362
  | "deployments:write"
@@ -1891,6 +1970,7 @@ module Infrawrench
1891
1970
  | "redirect-rule"
1892
1971
  | "redis-instance"
1893
1972
  | "redshift-cluster"
1973
+ | "reserved-ip"
1894
1974
  | "route-table"
1895
1975
  | "route53-health-check"
1896
1976
  | "route53-hosted-zone"
@@ -2126,6 +2206,7 @@ module Infrawrench
2126
2206
  "syncIncidents" => bool,
2127
2207
  "budgetAlerts" => bool,
2128
2208
  "anomalyAlerts" => bool,
2209
+ "resourceDrift" => bool,
2129
2210
  "workflowPages" => bool,
2130
2211
  "weeklyDigest" => bool
2131
2212
  }
@@ -2139,6 +2220,7 @@ module Infrawrench
2139
2220
  ?"syncIncidents" => bool,
2140
2221
  ?"budgetAlerts" => bool,
2141
2222
  ?"anomalyAlerts" => bool,
2223
+ ?"resourceDrift" => bool,
2142
2224
  ?"workflowPages" => bool,
2143
2225
  ?"weeklyDigest" => bool
2144
2226
  }
@@ -2148,6 +2230,7 @@ module Infrawrench
2148
2230
  ?"syncIncidents" => bool,
2149
2231
  ?"budgetAlerts" => bool,
2150
2232
  ?"anomalyAlerts" => bool,
2233
+ ?"resourceDrift" => bool,
2151
2234
  ?"workflowPages" => bool,
2152
2235
  ?"weeklyDigest" => bool
2153
2236
  }
@@ -2387,6 +2470,22 @@ module Infrawrench
2387
2470
  # Spec schema: `WorkflowPinRequest`.
2388
2471
  type workflow_pin_request = { "dashboardId" => String, "workflowId" => String }
2389
2472
 
2473
+ # Spec schema: `WorkflowSchedule`.
2474
+ type workflow_schedule = {
2475
+ "expression" => String,
2476
+ "timezone" => String | nil,
2477
+ "enabled" => bool,
2478
+ "lastRunAt" => String | nil,
2479
+ "nextRunAt" => String | nil,
2480
+ "nextRuns" => Array[String]
2481
+ }
2482
+
2483
+ # Spec schema: `WorkflowScheduleInput`.
2484
+ type workflow_schedule_input = { "expression" => String, ?"timezone" => String | nil, ?"enabled" => bool }
2485
+
2486
+ # Spec schema: `WorkflowScheduleResponse`.
2487
+ type workflow_schedule_response = { "schedule" => workflow_schedule | nil | nil }
2488
+
2390
2489
  class AccountsCredentialsNamespace
2391
2490
  def initialize: (Transport) -> void
2392
2491
  def get: (id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> Hash[String, String]
@@ -2498,7 +2597,14 @@ module Infrawrench
2498
2597
  def update: (id: String, body: change_freeze_input, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> change_freeze
2499
2598
  end
2500
2599
 
2600
+ class ChangesAlertSettingsNamespace
2601
+ def initialize: (Transport) -> void
2602
+ def get: (?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> drift_alert_settings
2603
+ def update: (?org_id: String?, ?body: drift_alert_settings_update?, ?request_options: Hash[Symbol, untyped]?) -> drift_alert_settings
2604
+ end
2605
+
2501
2606
  class ChangesNamespace
2607
+ attr_reader alert_settings: ChangesAlertSettingsNamespace
2502
2608
  def initialize: (Transport) -> void
2503
2609
  def get: (?org_id: String?, ?page: Integer?, ?page_size: Integer?, ?account_id: String?, ?resource_id: String?, ?kind: resource_change_kind?, ?from: String?, ?to: String?, ?request_options: Hash[Symbol, untyped]?) -> resource_change_feed_response
2504
2610
  def resource: (resource_id: String, ?org_id: String?, ?limit: Integer?, ?request_options: Hash[Symbol, untyped]?) -> resource_change_list_response
@@ -2511,7 +2617,14 @@ module Infrawrench
2511
2617
  def templates: (body: connect_templates_request, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> connect_templates_response
2512
2618
  end
2513
2619
 
2620
+ class CostsAnomalySettingsNamespace
2621
+ def initialize: (Transport) -> void
2622
+ def get: (?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> cost_anomaly_settings_view
2623
+ def update: (body: cost_anomaly_settings, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> cost_anomaly_settings_view
2624
+ end
2625
+
2514
2626
  class CostsNamespace
2627
+ attr_reader anomaly_settings: CostsAnomalySettingsNamespace
2515
2628
  def initialize: (Transport) -> void
2516
2629
  def anomalies: (?org_id: String?, ?days: String?, ?request_options: Hash[Symbol, untyped]?) -> { "anomalies" => Array[cost_anomaly] }
2517
2630
  def dimensions: (dimension: "provider" | "account" | "service" | "region" | "resource" | "tag" | "tag-keys", ?org_id: String?, ?tag_key: String?, ?request_options: Hash[Symbol, untyped]?) -> cost_dimension_values
@@ -2599,7 +2712,15 @@ module Infrawrench
2599
2712
  def repos: (?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> Array[deploy_repo]
2600
2713
  end
2601
2714
 
2715
+ class DigestRecipientsNamespace
2716
+ def initialize: (Transport) -> void
2717
+ def create: (?org_id: String?, ?body: digest_email_recipient_create?, ?request_options: Hash[Symbol, untyped]?) -> digest_email_recipient
2718
+ def delete: (recipient_id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> { "ok" => bool }
2719
+ def get: (?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> digest_email_recipient_list
2720
+ end
2721
+
2602
2722
  class DigestNamespace
2723
+ attr_reader recipients: DigestRecipientsNamespace
2603
2724
  def initialize: (Transport) -> void
2604
2725
  def get: (?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> digest_settings
2605
2726
  def post_org_org_id_digest_send: (?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> digest_send_result
@@ -2837,6 +2958,18 @@ module Infrawrench
2837
2958
  def list: (?org_id: String?, ?status: workflow_approval_status?, ?workflow_id: String?, ?run_id: String?, ?request_options: Hash[Symbol, untyped]?) -> Array[workflow_approval]
2838
2959
  end
2839
2960
 
2961
+ class WorkflowsScheduleNamespace
2962
+ def initialize: (Transport) -> void
2963
+ def delete: (id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> ok
2964
+ def get: (id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> workflow_schedule_response
2965
+ def update: (id: String, body: workflow_schedule_input, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> workflow_schedule_response
2966
+ end
2967
+
2968
+ class WorkflowsNamespace
2969
+ attr_reader schedule: WorkflowsScheduleNamespace
2970
+ def initialize: (Transport) -> void
2971
+ end
2972
+
2840
2973
  class APIV1Client
2841
2974
  attr_reader transport: Transport
2842
2975
  attr_reader accounts: AccountsNamespace
@@ -2876,6 +3009,7 @@ module Infrawrench
2876
3009
  attr_reader storage: StorageNamespace
2877
3010
  attr_reader team: TeamNamespace
2878
3011
  attr_reader workflow_approvals: WorkflowApprovalsNamespace
3012
+ attr_reader workflows: WorkflowsNamespace
2879
3013
  def initialize: (**untyped) -> void
2880
3014
  end
2881
3015
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: infrawrench-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.26.0
4
+ version: 0.28.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Infrawrench LLC
@@ -9,9 +9,9 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2026-07-31 00:00:00.000000000 Z
12
+ date: 2026-08-03 00:00:00.000000000 Z
13
13
  dependencies: []
14
- description: Generated Ruby client for the Infrawrench API (v0.26.0). Covers the published
14
+ description: Generated Ruby client for the Infrawrench API (v0.28.0). Covers the published
15
15
  API surface only — operations marked x-internal in the spec are not generated. No
16
16
  runtime dependencies.
17
17
  email:
@@ -58,5 +58,5 @@ requirements: []
58
58
  rubygems_version: 3.5.22
59
59
  signing_key:
60
60
  specification_version: 4
61
- summary: Generated Ruby client for the Infrawrench API (v0.26.0).
61
+ summary: Generated Ruby client for the Infrawrench API (v0.28.0).
62
62
  test_files: []