infrawrench-sdk 1.15.0 → 1.17.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: 9e38a098383f11fdb35de83cb2014267146a3689c00f7b84da86b2c994a01ce1
4
- data.tar.gz: aaba5e6be92f922ca34f0436611e30ec26cebb13687d0d454e3f1e987f3fe4f4
3
+ metadata.gz: 359ea68464e3400d21793fcb623a2f4d3652d4438d0943d15d3a89ed08ba2d40
4
+ data.tar.gz: d85bcd64441a864f5cc4fa8433242a907fe169f89663e66dd8d81595d42fbe52
5
5
  SHA512:
6
- metadata.gz: e9371a9e34e0adac31a39ea733dd10c50ffea1b4704726ae163bde10ca694e9cb666412fa48824501a32256098f165c3ada273fcccf0b90fc91851ef32211110
7
- data.tar.gz: 65dd789443a52e1bb9368eec4dc7e92db2117850ad45e17645ed0e82f7d1a3367610eff61e92e05aa5c223fb62b493bc15cd2f6b08197a2bd5259a9d018799ec
6
+ metadata.gz: e2ce4ad9fff0121b54795ee4185628084ae0d7832d9970633a3a0f82ca1f98787c098f17a326ca62b62f88452a4836555fe91abd77302be4ccf00ba45953e002
7
+ data.tar.gz: 8b216cbe55353f50c523ca02ed4e5c86db7a396f63313b629eed0a5747af7d8ec11640a018fab31a4a975537e38bdd5f6935ba3ad41b58aedf0342f62092ca77
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # infrawrench-sdk
2
2
 
3
- Generated Ruby client for the Infrawrench API (API version `1.15.0`).
3
+ Generated Ruby client for the Infrawrench API (API version `1.17.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
- 586 schemas, as RBS type aliases that steep and TypeProf can read.
44
+ 601 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 v1.15.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v1.17.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 1.15.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.17.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 (v1.15.0)."
21
- spec.description = "Generated Ruby client for the Infrawrench API (v1.15.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 (v1.17.0)."
21
+ spec.description = "Generated Ruby client for the Infrawrench API (v1.17.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 v1.15.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v1.17.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 1.15.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.17.0).
7
7
  #
8
8
  # DO NOT EDIT. Regenerate with:
9
9
  # pnpm --filter @infrawrench/web generate:sdk
@@ -246,6 +246,173 @@ module Infrawrench
246
246
  end
247
247
  end
248
248
 
249
+ # `client.access_review.dismissals`
250
+ class AccessReviewDismissalsNamespace
251
+ # @api private
252
+ # @param transport [Transport]
253
+ def initialize(transport)
254
+ @transport = transport
255
+ end
256
+
257
+ # Dismiss an access review finding
258
+ #
259
+ # Accept a finding — that break-glass role really is meant to be admin, that
260
+ # shared key really is rotated out of band. The finding leaves `findings`
261
+ # and stops feeding the security alerts, but the rule keeps being evaluated
262
+ # and the finding is reported back under `dismissed` for as long as it still
263
+ # matches. The principal itself stays in `principals` either way.
264
+ # Idempotent: dismissing an already-dismissed finding rewrites the note and
265
+ # the author.
266
+ #
267
+ # _Requires permission: `resources:write`._
268
+ #
269
+ # POST /api/org/{orgId}/access-review/dismissals
270
+ #
271
+ # Raises on 400: Bad request
272
+ #
273
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
274
+ # constructed with.
275
+ # @param body [Hash, nil] Request body, shaped as `AccessReviewDismissalCreate`.
276
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
277
+ # @return [Hash] Parsed JSON, shaped as `AccessReviewDismissal` — see
278
+ # `sig/infrawrench/sdk.rbs`.
279
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
280
+ def create(org_id: nil, body: nil, request_options: nil)
281
+ @transport.request(
282
+ http_method: "POST",
283
+ path: "/api/org/{orgId}/access-review/dismissals",
284
+ path_params: { "orgId" => org_id },
285
+ body: body,
286
+ request_options: request_options
287
+ )
288
+ end
289
+
290
+ # Restore a dismissed access review finding
291
+ #
292
+ # Undo a dismissal, putting the finding back on the list and back into the
293
+ # security alerts. The finding is identified by query parameters rather than
294
+ # path segments because resource ids are provider-native and routinely
295
+ # contain slashes.
296
+ #
297
+ # _Requires permission: `resources:write`._
298
+ #
299
+ # DELETE /api/org/{orgId}/access-review/dismissals
300
+ #
301
+ # Raises on 400: Bad request
302
+ #
303
+ # Raises on 404: Not found
304
+ #
305
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
306
+ # constructed with.
307
+ # @param resource_id [String] Infrawrench resource id the finding is on.
308
+ # @param rule_id [String] Which rule was raised. Half of a dismissal's key, alongside the
309
+ # resource id. The `access-review:` prefix is reserved so these can share the posture
310
+ # dismissal store without colliding with plugin-declared posture rule ids.
311
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
312
+ # @return [nil] This endpoint returns no content.
313
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
314
+ def delete(resource_id:, rule_id:, org_id: nil, request_options: nil)
315
+ @transport.request(
316
+ http_method: "DELETE",
317
+ path: "/api/org/{orgId}/access-review/dismissals",
318
+ path_params: { "orgId" => org_id },
319
+ query: { "resourceId" => resource_id, "ruleId" => rule_id },
320
+ accept: :empty,
321
+ request_options: request_options
322
+ )
323
+ end
324
+ end
325
+
326
+ # `client.access_review`
327
+ class AccessReviewNamespace
328
+ # @return [AccessReviewDismissalsNamespace] `client.access_review.dismissals`
329
+ attr_reader :dismissals
330
+
331
+ # @api private
332
+ # @param transport [Transport]
333
+ def initialize(transport)
334
+ @transport = transport
335
+ @dismissals = AccessReviewDismissalsNamespace.new(@transport)
336
+ end
337
+
338
+ # Export the access review as compliance evidence
339
+ #
340
+ # The same review as a downloadable file, one row per finding. `format=csv`
341
+ # (the default) returns RFC 4180 CSV with every cell quoted and spreadsheet
342
+ # formulas neutralised; `format=json` returns the full response body
343
+ # pretty-printed.
344
+ #
345
+ # Dismissed findings are included and labelled in both formats, with the
346
+ # note and the person who accepted them: an evidence pack answers what you
347
+ # found *and* what you decided. Exports are recorded in the audit log.
348
+ #
349
+ # _Requires permission: `resources:read`._
350
+ #
351
+ # GET /api/org/{orgId}/access-review/export
352
+ #
353
+ # Raises on 400: Bad request
354
+ #
355
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
356
+ # constructed with.
357
+ # @param format [String, nil] Defaults to "csv".
358
+ # @param stale_days [Integer, nil] Staleness window in days. Defaults to 90.
359
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
360
+ # @return [Hash] Parsed JSON, shaped as `AccessReviewResponse` — see
361
+ # `sig/infrawrench/sdk.rbs`.
362
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
363
+ def export(org_id: nil, format: nil, stale_days: nil, request_options: nil)
364
+ @transport.request(
365
+ http_method: "GET",
366
+ path: "/api/org/{orgId}/access-review/export",
367
+ path_params: { "orgId" => org_id },
368
+ query: { "format" => format, "staleDays" => stale_days },
369
+ request_options: request_options
370
+ )
371
+ end
372
+
373
+ # Review the principals inside your connected clouds
374
+ #
375
+ # Every IAM user and role, service account, app registration, group, role
376
+ # binding and long-lived API key your connected accounts have synced, with
377
+ # the findings that have evidence against them: unused beyond the staleness
378
+ # window, holding administrative or wildcard permissions, past the rotation
379
+ # budget their plugin declares, carrying no recorded owner, or signing in
380
+ # without a second factor.
381
+ #
382
+ # This is about principals in **your** clouds — it is neither your
383
+ # Infrawrench team's roles (`/team`) nor the credentials Infrawrench stores
384
+ # for you (`/credential-hygiene`).
385
+ #
386
+ # No provider API calls are made: everything is computed from already-synced
387
+ # fields, so a principal whose provider does not report last use is reported
388
+ # with `activity: "unknown"` and is never called stale. Findings the
389
+ # organization has dismissed are reported separately under `dismissed` and
390
+ # are excluded from `findings`, `counts`, `byRule` and the security alerts.
391
+ #
392
+ # _Requires permission: `resources:read`._
393
+ #
394
+ # GET /api/org/{orgId}/access-review
395
+ #
396
+ # Raises on 400: Bad request
397
+ #
398
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
399
+ # constructed with.
400
+ # @param stale_days [Integer, nil] Staleness window in days. Defaults to 90.
401
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
402
+ # @return [Hash] Parsed JSON, shaped as `AccessReviewResponse` — see
403
+ # `sig/infrawrench/sdk.rbs`.
404
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
405
+ def get(org_id: nil, stale_days: nil, request_options: nil)
406
+ @transport.request(
407
+ http_method: "GET",
408
+ path: "/api/org/{orgId}/access-review",
409
+ path_params: { "orgId" => org_id },
410
+ query: { "staleDays" => stale_days },
411
+ request_options: request_options
412
+ )
413
+ end
414
+ end
415
+
249
416
  # `client.accounts.credentials`
250
417
  class AccountsCredentialsNamespace
251
418
  # @api private
@@ -2404,16 +2571,165 @@ module Infrawrench
2404
2571
  end
2405
2572
  end
2406
2573
 
2574
+ # `client.changes.revert`
2575
+ class ChangesRevertNamespace
2576
+ # @api private
2577
+ # @param transport [Transport]
2578
+ def initialize(transport)
2579
+ @transport = transport
2580
+ end
2581
+
2582
+ # Revert one change event
2583
+ #
2584
+ # Applies the inverse patch through the plugin's ordinary `updateResource`
2585
+ # path — the same call the Edit form makes — and only for the fields the dry
2586
+ # run marked `revertible`.
2587
+ #
2588
+ # The plan is rebuilt against a fresh live read immediately before the
2589
+ # write, so a field that moved between the preview and the apply becomes a
2590
+ # conflict and drops out of the patch.
2591
+ #
2592
+ # **This is a last-moment re-read, not an atomic compare-and-swap.** The gap
2593
+ # between reading a field and writing it is one provider round-trip wide,
2594
+ # and a third party writing inside that gap will be overwritten without
2595
+ # warning. It cannot be closed generically: the plugin update contract
2596
+ # carries no expected value, ETag or version token, so no conditional write
2597
+ # can be expressed for a provider that supports one. Treat the conflict
2598
+ # detection as a strong guard against stale plans, not as a mutual-exclusion
2599
+ # guarantee against other writers.
2600
+ #
2601
+ # Reverts of the *same event* are mutually exclusive: the event is claimed
2602
+ # with a conditional update under a five-minute lease, so two concurrent
2603
+ # reverts cannot both reach the provider and the loser gets `409`. A
2604
+ # provider failure releases the claim immediately; a process that dies
2605
+ # mid-write leaves a claim that expires, so an interrupted revert is
2606
+ # retryable rather than permanently stuck. `revertedAt` is only set once the
2607
+ # provider accepted the write.
2608
+ #
2609
+ # The claim carries an owner token, and every write that ends a revert is
2610
+ # fenced on it. An attempt whose provider call outlives the lease can
2611
+ # therefore neither release nor complete the claim that replaced it — it
2612
+ # gets `409` with `appliedFields` naming what it did write, so the caller
2613
+ # can reconcile rather than assume. Two attempts can overlap in that case,
2614
+ # but they cannot disagree: both invert the same recorded event to the same
2615
+ # values, so the second one's patch is a subset of the first's.
2616
+ #
2617
+ # If a write reaches the provider but recording it fails, the response is
2618
+ # `500` with `appliedFields` — the resource moved and the timeline has not
2619
+ # caught up. The claim is deliberately held in that case, and the next
2620
+ # attempt after the lease expires finds every field already back and records
2621
+ # the revert without touching the provider again, answering `200` with
2622
+ # `reconciled: true` and an empty `appliedFields`. A resource put back by
2623
+ # hand is not mistaken for this: reconciliation only happens on an event
2624
+ # whose claim was still outstanding, which is the only state in which an
2625
+ # unrecorded write is possible.
2626
+ #
2627
+ # Blocked with `423` while an org change freeze is in effect. Every attempt
2628
+ # whose write reached the provider is audit-logged as
2629
+ # `resource.change_revert`, including one that lost its claim or could not
2630
+ # record — the entry's `outcome` is `recorded`, `superseded`, `unrecorded`
2631
+ # or `reconciled`, so a contested outcome reads as one mutation rather than
2632
+ # as several reverts. An attempt that neither wrote nor recorded anything
2633
+ # logs nothing. Attribution is best-effort: no transaction spans a
2634
+ # third-party cloud API and Infrawrench's database, so if the audit insert
2635
+ # itself fails the response carries `auditRecorded: false` and the details
2636
+ # go to the server log rather than being silently dropped.
2637
+ #
2638
+ # The stored resource snapshot is deliberately left untouched, so the next
2639
+ # poll observes the reverted state and records it as an ordinary change
2640
+ # event.
2641
+ #
2642
+ # POST /api/org/{orgId}/changes/{changeId}/revert
2643
+ #
2644
+ # Raises on 400: Bad request
2645
+ #
2646
+ # Raises on 404: Not found
2647
+ #
2648
+ # Raises on 409: Already reverted, another revert holds the event, nothing
2649
+ # in the plan is writable, or this attempt was superseded mid-write (its
2650
+ # lease lapsed). The body carries `code: change_revert_conflict` for all but
2651
+ # the writability case, and `appliedFields` when the provider write had
2652
+ # already landed.
2653
+ #
2654
+ # Raises on 423: Blocked by an active change freeze. Retry with the
2655
+ # `x-change-freeze-override: true` header if you hold `freezes:override`;
2656
+ # both blocks and overrides are audit-logged.
2657
+ #
2658
+ # Raises on 500: The provider accepted the write but it could not be
2659
+ # recorded against the event. The resource *has* been put back;
2660
+ # `appliedFields` names what changed. A later retry reconciles the timeline.
2661
+ #
2662
+ # Raises on 502: The provider couldn't be read. Nothing was written.
2663
+ #
2664
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
2665
+ # constructed with.
2666
+ # @param change_id [String]
2667
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
2668
+ # @return [Hash] Parsed JSON, shaped as `RevertApplyResponse` — see
2669
+ # `sig/infrawrench/sdk.rbs`.
2670
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
2671
+ def create(change_id:, org_id: nil, request_options: nil)
2672
+ @transport.request(
2673
+ http_method: "POST",
2674
+ path: "/api/org/{orgId}/changes/{changeId}/revert",
2675
+ path_params: { "orgId" => org_id, "changeId" => change_id },
2676
+ request_options: request_options
2677
+ )
2678
+ end
2679
+
2680
+ # Dry-run a revert of one change event
2681
+ #
2682
+ # Inverts the recorded diff and reconciles it against the resource's
2683
+ # *current* live fields, which is the whole point: the poller may have
2684
+ # recorded this hours ago and the world may have moved on. Read-only — it
2685
+ # reads from the provider and writes nothing.
2686
+ #
2687
+ # Only `updated` events with a field diff can be reverted. `outputs.*`
2688
+ # entries are provider-derived and are never written back, and whether a
2689
+ # field is writable at all is the plugin's own edit-form rule (`editable`,
2690
+ # minus `secret` and `association` kinds), so a revert can never issue a
2691
+ # provider call an edit could not.
2692
+ #
2693
+ # Gated on `resources:write` rather than `resources:read`: the plan names
2694
+ # the write it is offering to make.
2695
+ #
2696
+ # GET /api/org/{orgId}/changes/{changeId}/revert
2697
+ #
2698
+ # Raises on 404: Not found
2699
+ #
2700
+ # Raises on 502: The provider couldn't be read, so no plan can be made
2701
+ # safely. Nothing was written.
2702
+ #
2703
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
2704
+ # constructed with.
2705
+ # @param change_id [String]
2706
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
2707
+ # @return [Hash] Parsed JSON, shaped as `RevertPreviewResponse` — see
2708
+ # `sig/infrawrench/sdk.rbs`.
2709
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
2710
+ def get(change_id:, org_id: nil, request_options: nil)
2711
+ @transport.request(
2712
+ http_method: "GET",
2713
+ path: "/api/org/{orgId}/changes/{changeId}/revert",
2714
+ path_params: { "orgId" => org_id, "changeId" => change_id },
2715
+ request_options: request_options
2716
+ )
2717
+ end
2718
+ end
2719
+
2407
2720
  # `client.changes`
2408
2721
  class ChangesNamespace
2409
2722
  # @return [ChangesAlertSettingsNamespace] `client.changes.alert_settings`
2410
2723
  attr_reader :alert_settings
2724
+ # @return [ChangesRevertNamespace] `client.changes.revert`
2725
+ attr_reader :revert
2411
2726
 
2412
2727
  # @api private
2413
2728
  # @param transport [Transport]
2414
2729
  def initialize(transport)
2415
2730
  @transport = transport
2416
2731
  @alert_settings = ChangesAlertSettingsNamespace.new(@transport)
2732
+ @revert = ChangesRevertNamespace.new(@transport)
2417
2733
  end
2418
2734
 
2419
2735
  # Org-wide change timeline (paginated, filterable)
@@ -13552,6 +13868,8 @@ module Infrawrench
13552
13868
  attr_reader :transport
13553
13869
  # @return [AccessRequestsNamespace] `client.access_requests`
13554
13870
  attr_reader :access_requests
13871
+ # @return [AccessReviewNamespace] `client.access_review`
13872
+ attr_reader :access_review
13555
13873
  # @return [AccountsNamespace] `client.accounts`
13556
13874
  attr_reader :accounts
13557
13875
  # @return [AgentsNamespace] `client.agents`
@@ -13723,6 +14041,7 @@ module Infrawrench
13723
14041
  def initialize(**options)
13724
14042
  @transport = Transport.new(**options)
13725
14043
  @access_requests = AccessRequestsNamespace.new(@transport)
14044
+ @access_review = AccessReviewNamespace.new(@transport)
13726
14045
  @accounts = AccountsNamespace.new(@transport)
13727
14046
  @agents = AgentsNamespace.new(@transport)
13728
14047
  @alert_rules = AlertRulesNamespace.new(@transport)
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # infrawrench-sdk v1.15.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v1.17.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 1.15.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.17.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 v1.15.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v1.17.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 1.15.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.17.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 v1.15.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v1.17.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 1.15.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.17.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 = "1.15.0"
18
+ VERSION = "1.17.0"
19
19
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # infrawrench-sdk v1.15.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v1.17.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 1.15.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.17.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 v1.15.0 | MIT | Copyright (c) 2026 Infrawrench LLC
1
+ # infrawrench-sdk v1.17.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 1.15.0).
4
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.17.0).
5
5
  #
6
6
  # DO NOT EDIT. Regenerate with:
7
7
  # pnpm --filter @infrawrench/web generate:sdk
@@ -104,6 +104,57 @@ module Infrawrench
104
104
  ?"missing" => Array[String]
105
105
  }
106
106
 
107
+ # Spec schema: `AccessFinding`.
108
+ type access_finding = {
109
+ "resourceId" => String,
110
+ "ruleId" => "access-review:stale-principal"
111
+ | "access-review:admin-principal"
112
+ | "access-review:key-past-rotation"
113
+ | "access-review:no-recorded-owner"
114
+ | "access-review:no-mfa",
115
+ "title" => String,
116
+ "severity" => "critical" | "high" | "medium" | "low",
117
+ "reason" => String,
118
+ "principal" => access_principal
119
+ }
120
+
121
+ # Spec schema: `AccessPrincipal`.
122
+ type access_principal = {
123
+ "resourceId" => String,
124
+ "pluginId" => plugin_id,
125
+ "pluginName" => String,
126
+ "resourceTypeId" => String,
127
+ "resourceTypeName" => String,
128
+ "accountId" => String,
129
+ "accountName" => String,
130
+ "displayName" => String,
131
+ "externalId" => String | nil,
132
+ "role" => "user" | "group" | "role" | "service-account" | "key" | "binding",
133
+ "lastUsedAt" => String | nil,
134
+ "daysSinceLastUsed" => Integer | nil,
135
+ "activity" => "active" | "stale" | "unknown",
136
+ "createdAt" => String | nil,
137
+ "ageDays" => Integer | nil,
138
+ "admin" => bool | nil,
139
+ "mfa" => bool | nil,
140
+ "parent" => String | nil,
141
+ "owner" => access_principal_owner,
142
+ "revokeActionId" => String | nil
143
+ }
144
+
145
+ # Who owns the resource, from the resource-ownership record. Null when nobody
146
+ # is named.
147
+ #
148
+ # Spec schema: `AccessPrincipalOwner`.
149
+ type access_principal_owner = {
150
+ "userId" => String | nil,
151
+ "displayName" => String,
152
+ "isLabel" => bool,
153
+ "ticketUrl" => String | nil,
154
+ "purpose" => String | nil
155
+ }
156
+ | nil
157
+
107
158
  # Spec schema: `AccessRequest`.
108
159
  type access_request = {
109
160
  "id" => String,
@@ -137,6 +188,63 @@ module Infrawrench
137
188
  # Spec schema: `AccessRequestCreate`.
138
189
  type access_request_create = { "permissions" => Array[String], "reason" => String, "durationMinutes" => Integer }
139
190
 
191
+ # Spec schema: `AccessReviewDismissal`.
192
+ type access_review_dismissal = {
193
+ "resourceId" => String,
194
+ "ruleId" => String,
195
+ "dismissedAt" => String,
196
+ "dismissedBy" => String | nil,
197
+ "reason" => String | nil
198
+ }
199
+
200
+ # Spec schema: `AccessReviewDismissalCreate`.
201
+ type access_review_dismissal_create = {
202
+ "resourceId" => String,
203
+ "ruleId" => "access-review:stale-principal"
204
+ | "access-review:admin-principal"
205
+ | "access-review:key-past-rotation"
206
+ | "access-review:no-recorded-owner"
207
+ | "access-review:no-mfa",
208
+ ?"reason" => String | nil
209
+ }
210
+
211
+ # Spec schema: `AccessReviewResponse`.
212
+ type access_review_response = {
213
+ "principals" => Array[access_principal],
214
+ "findings" => Array[access_finding],
215
+ "totalCount" => Integer,
216
+ "counts" => access_review_severity_counts,
217
+ "byRule" => access_review_rule_counts,
218
+ "byRole" => access_review_role_counts,
219
+ "dismissed" => Array[dismissed_access_finding],
220
+ "dismissedCount" => Integer,
221
+ "unknownActivityCount" => Integer,
222
+ "staleDays" => Integer,
223
+ "generatedAt" => String
224
+ }
225
+
226
+ # Spec schema: `AccessReviewRoleCounts`.
227
+ type access_review_role_counts = {
228
+ "user" => Integer,
229
+ "group" => Integer,
230
+ "role" => Integer,
231
+ "service-account" => Integer,
232
+ "key" => Integer,
233
+ "binding" => Integer
234
+ }
235
+
236
+ # Spec schema: `AccessReviewRuleCounts`.
237
+ type access_review_rule_counts = {
238
+ "access-review:stale-principal" => Integer,
239
+ "access-review:admin-principal" => Integer,
240
+ "access-review:key-past-rotation" => Integer,
241
+ "access-review:no-recorded-owner" => Integer,
242
+ "access-review:no-mfa" => Integer
243
+ }
244
+
245
+ # Spec schema: `AccessReviewSeverityCounts`.
246
+ type access_review_severity_counts = { "critical" => Integer, "high" => Integer, "medium" => Integer, "low" => Integer }
247
+
140
248
  # Spec schema: `AccessRevokeConflict`.
141
249
  type access_revoke_conflict = { "error" => String }
142
250
 
@@ -2178,6 +2286,21 @@ module Infrawrench
2178
2286
  # Spec schema: `DigestTransportResult`.
2179
2287
  type digest_transport_result = { "attempted" => Integer, "succeeded" => Integer }
2180
2288
 
2289
+ # Spec schema: `DismissedAccessFinding`.
2290
+ type dismissed_access_finding = {
2291
+ "resourceId" => String,
2292
+ "ruleId" => "access-review:stale-principal"
2293
+ | "access-review:admin-principal"
2294
+ | "access-review:key-past-rotation"
2295
+ | "access-review:no-recorded-owner"
2296
+ | "access-review:no-mfa",
2297
+ "title" => String,
2298
+ "severity" => "critical" | "high" | "medium" | "low",
2299
+ "reason" => String,
2300
+ "principal" => access_principal,
2301
+ "dismissal" => access_review_dismissal
2302
+ }
2303
+
2181
2304
  # Spec schema: `DismissedPostureFinding`.
2182
2305
  type dismissed_posture_finding = {
2183
2306
  "resourceId" => String,
@@ -4479,7 +4602,8 @@ module Infrawrench
4479
4602
  "changeKind" => resource_change_kind,
4480
4603
  "diff" => Array[resource_field_change],
4481
4604
  ?"origin" => "schedule" | nil,
4482
- "createdAt" => String
4605
+ "createdAt" => String,
4606
+ ?"revertedAt" => String | nil
4483
4607
  }
4484
4608
 
4485
4609
  # Spec schema: `ResourceChangeFeedEntry`.
@@ -5043,6 +5167,58 @@ module Infrawrench
5043
5167
  ?"schedulable" => bool
5044
5168
  }
5045
5169
 
5170
+ # Spec schema: `RevertApplyResponse`.
5171
+ type revert_apply_response = {
5172
+ "changeId" => String,
5173
+ "resourceId" => resource_id,
5174
+ "appliedFields" => Array[String],
5175
+ "plan" => revert_plan,
5176
+ "revertedAt" => String,
5177
+ ?"reconciled" => bool,
5178
+ ?"auditRecorded" => bool
5179
+ }
5180
+
5181
+ # Spec schema: `RevertFieldPlan`.
5182
+ type revert_field_plan = {
5183
+ "field" => String,
5184
+ ?"revertTo" => untyped,
5185
+ ?"changedTo" => untyped,
5186
+ ?"current" => untyped,
5187
+ "status" => revert_field_status,
5188
+ "reason" => String
5189
+ }
5190
+
5191
+ # What a revert would do to one field. `revertible` — the field still holds
5192
+ # the value the change set, and the plugin's edit form can write the old one
5193
+ # back. `already-reverted` — it is already at the old value; nothing to do.
5194
+ # `conflict` — it changed again since, so reverting would discard the newer
5195
+ # value. `not-writable` — outside the plugin's editable surface, or the old
5196
+ # value is not something the edit form can submit. `provider-derived` — an
5197
+ # `outputs.*` entry, which the provider computes rather than accepts.
5198
+ #
5199
+ # Spec schema: `RevertFieldStatus`.
5200
+ type revert_field_status = "revertible" | "already-reverted" | "conflict" | "not-writable" | "provider-derived"
5201
+
5202
+ # Spec schema: `RevertPlan`.
5203
+ type revert_plan = {
5204
+ "fields" => Array[revert_field_plan],
5205
+ "revertibleFields" => Array[String],
5206
+ "revertible" => bool,
5207
+ "blockedReason" => String | nil
5208
+ }
5209
+
5210
+ # Spec schema: `RevertPreviewResponse`.
5211
+ type revert_preview_response = {
5212
+ "changeId" => String,
5213
+ "resourceId" => resource_id,
5214
+ "displayName" => String,
5215
+ "pluginId" => String,
5216
+ "resourceTypeId" => String,
5217
+ "accountId" => String,
5218
+ "plan" => revert_plan,
5219
+ "revertedAt" => String | nil
5220
+ }
5221
+
5046
5222
  # Spec schema: `RightsizingListResponse`.
5047
5223
  type rightsizing_list_response = {
5048
5224
  "accounts" => Array[oversized_account_group],
@@ -5792,6 +5968,7 @@ module Infrawrench
5792
5968
  | "changes"
5793
5969
  | "expiring"
5794
5970
  | "posture"
5971
+ | "access-review"
5795
5972
  | "dns"
5796
5973
  | "environment-diff"
5797
5974
  | "ssh-fanout"
@@ -6038,6 +6215,19 @@ module Infrawrench
6038
6215
  def withdraw: (request_id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> ok
6039
6216
  end
6040
6217
 
6218
+ class AccessReviewDismissalsNamespace
6219
+ def initialize: (Transport) -> void
6220
+ def create: (?org_id: String?, ?body: access_review_dismissal_create?, ?request_options: Hash[Symbol, untyped]?) -> access_review_dismissal
6221
+ def delete: (resource_id: String, rule_id: "access-review:stale-principal" | "access-review:admin-principal" | "access-review:key-past-rotation" | "access-review:no-recorded-owner" | "access-review:no-mfa", ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> nil
6222
+ end
6223
+
6224
+ class AccessReviewNamespace
6225
+ attr_reader dismissals: AccessReviewDismissalsNamespace
6226
+ def initialize: (Transport) -> void
6227
+ def export: (?org_id: String?, ?format: "csv" | "json"?, ?stale_days: Integer?, ?request_options: Hash[Symbol, untyped]?) -> access_review_response
6228
+ def get: (?org_id: String?, ?stale_days: Integer?, ?request_options: Hash[Symbol, untyped]?) -> access_review_response
6229
+ end
6230
+
6041
6231
  class AccountsCredentialsNamespace
6042
6232
  def initialize: (Transport) -> void
6043
6233
  def get: (id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> Hash[String, String]
@@ -6226,8 +6416,15 @@ module Infrawrench
6226
6416
  def update: (?org_id: String?, ?body: drift_alert_settings_update?, ?request_options: Hash[Symbol, untyped]?) -> drift_alert_settings
6227
6417
  end
6228
6418
 
6419
+ class ChangesRevertNamespace
6420
+ def initialize: (Transport) -> void
6421
+ def create: (change_id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> revert_apply_response
6422
+ def get: (change_id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> revert_preview_response
6423
+ end
6424
+
6229
6425
  class ChangesNamespace
6230
6426
  attr_reader alert_settings: ChangesAlertSettingsNamespace
6427
+ attr_reader revert: ChangesRevertNamespace
6231
6428
  def initialize: (Transport) -> void
6232
6429
  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
6233
6430
  def resource: (resource_id: String, ?org_id: String?, ?limit: Integer?, ?request_options: Hash[Symbol, untyped]?) -> resource_change_list_response
@@ -7049,6 +7246,7 @@ module Infrawrench
7049
7246
  class APIV1Client
7050
7247
  attr_reader transport: Transport
7051
7248
  attr_reader access_requests: AccessRequestsNamespace
7249
+ attr_reader access_review: AccessReviewNamespace
7052
7250
  attr_reader accounts: AccountsNamespace
7053
7251
  attr_reader agents: AgentsNamespace
7054
7252
  attr_reader alert_rules: AlertRulesNamespace
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: 1.15.0
4
+ version: 1.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Infrawrench LLC
@@ -11,7 +11,7 @@ bindir: bin
11
11
  cert_chain: []
12
12
  date: 2026-08-12 00:00:00.000000000 Z
13
13
  dependencies: []
14
- description: Generated Ruby client for the Infrawrench API (v1.15.0). Covers the published
14
+ description: Generated Ruby client for the Infrawrench API (v1.17.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 (v1.15.0).
61
+ summary: Generated Ruby client for the Infrawrench API (v1.17.0).
62
62
  test_files: []