From e617346e1a2206c16c886c8b6ae673126aa04bed Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 30 Jul 2026 23:04:06 +0000 Subject: [PATCH 1/6] Prepare release 0.4.0 --- .../unreleased/BUG FIXES-20260729-100121.yaml | 3 - .../unreleased/BUG FIXES-20260729-100210.yaml | 3 - .../unreleased/BUG FIXES-20260729-101327.yaml | 3 - .../ENHANCEMENTS-20260724-172011.yaml | 3 - .../ENHANCEMENTS-20260728-150652.yaml | 3 - .changes/v0.4.0.md | 39 + CHANGELOG.md | 22 +- .../pkg/openapi/spec/hcpt_v2_public_beta.json | 4999 +++++++++-------- skills/tfctl/known_release_hashes | 1 + version/VERSION | 2 +- 10 files changed, 2604 insertions(+), 2474 deletions(-) delete mode 100644 .changes/unreleased/BUG FIXES-20260729-100121.yaml delete mode 100644 .changes/unreleased/BUG FIXES-20260729-100210.yaml delete mode 100644 .changes/unreleased/BUG FIXES-20260729-101327.yaml delete mode 100644 .changes/unreleased/ENHANCEMENTS-20260724-172011.yaml delete mode 100644 .changes/unreleased/ENHANCEMENTS-20260728-150652.yaml create mode 100644 .changes/v0.4.0.md diff --git a/.changes/unreleased/BUG FIXES-20260729-100121.yaml b/.changes/unreleased/BUG FIXES-20260729-100121.yaml deleted file mode 100644 index 17cbdf0..0000000 --- a/.changes/unreleased/BUG FIXES-20260729-100121.yaml +++ /dev/null @@ -1,3 +0,0 @@ -kind: BUG FIXES -body: Using `auth login --dry-run` no longer opens a web browser. --dry-run now appears in argument autocomplete lists. -time: 2026-07-29T10:01:21.23869-06:00 diff --git a/.changes/unreleased/BUG FIXES-20260729-100210.yaml b/.changes/unreleased/BUG FIXES-20260729-100210.yaml deleted file mode 100644 index 3c7d85e..0000000 --- a/.changes/unreleased/BUG FIXES-20260729-100210.yaml +++ /dev/null @@ -1,3 +0,0 @@ -kind: BUG FIXES -body: Using `profile display --markdown` no longer produces an error. -time: 2026-07-29T10:02:10.946104-06:00 diff --git a/.changes/unreleased/BUG FIXES-20260729-101327.yaml b/.changes/unreleased/BUG FIXES-20260729-101327.yaml deleted file mode 100644 index 8fd96a6..0000000 --- a/.changes/unreleased/BUG FIXES-20260729-101327.yaml +++ /dev/null @@ -1,3 +0,0 @@ -kind: BUG FIXES -body: Removed Token property from json output when using `profile profiles list --json`, preventing accidental exposure. -time: 2026-07-29T10:13:27.549029-06:00 diff --git a/.changes/unreleased/ENHANCEMENTS-20260724-172011.yaml b/.changes/unreleased/ENHANCEMENTS-20260724-172011.yaml deleted file mode 100644 index 04aaa00..0000000 --- a/.changes/unreleased/ENHANCEMENTS-20260724-172011.yaml +++ /dev/null @@ -1,3 +0,0 @@ -kind: ENHANCEMENTS -body: Running tfctl, tfctl version, or tfctl --version checks whether there is a newer version of tfctl available and whether `auth login` needs to be run. -time: 2026-07-24T17:20:11.173085-06:00 diff --git a/.changes/unreleased/ENHANCEMENTS-20260728-150652.yaml b/.changes/unreleased/ENHANCEMENTS-20260728-150652.yaml deleted file mode 100644 index 5589259..0000000 --- a/.changes/unreleased/ENHANCEMENTS-20260728-150652.yaml +++ /dev/null @@ -1,3 +0,0 @@ -kind: ENHANCEMENTS -body: tfctl now detects outdated skills it installed and migrates them to the latest version. -time: 2026-07-28T15:06:52.901832-06:00 diff --git a/.changes/v0.4.0.md b/.changes/v0.4.0.md new file mode 100644 index 0000000..022c161 --- /dev/null +++ b/.changes/v0.4.0.md @@ -0,0 +1,39 @@ +## v0.4.0 (July 30, 2026) + +NEW FEATURES: + +* Adds the `harness exec` command, which lets a human grant session-scoped, noninteractive `tfctl` delete permissions to a wrapped command (such as a coding agent) via `--allow-delete`. The grant is tied to all subprocesses. + +ENHANCEMENTS: + +* Running tfctl, tfctl version, or tfctl --version checks whether there is a newer version of tfctl available and whether `auth login` needs to be run. + +* tfctl now detects outdated skills it installed and migrates them to the latest version. + +* Adds a `--plan-only` flag to `run start` that creates a speculative plan-only run which is never applied, regardless of the workspace's auto-apply setting. + +* Positional arguments and API path parameters are now checked for basic input hygiene, rejecting control characters and invalid UTF-8. This keeps malformed values out of requests and out of terminal/audit output. This is not a security boundary; authorization is still enforced by your API token. + +* The config directory can now be overridden with the TFCTL_CONFIG_DIR environment variable. Profiles and exec sessions both resolve against this directory, making it easy to isolate tfctl state (for example, in CI or eval harnesses). + +BUG FIXES: + +* Using `auth login --dry-run` no longer opens a web browser. `--dry-run` now appears in argument autocomplete lists. + +* Using `profile display --markdown` no longer produces an error. + +* Removed Token property from json output when using `profile profiles list --json`, preventing accidental exposure. + +* Don't attempt to retry telemetry transmission on server errors, like rate limiting 429 errors. + +* Detect Terraform's `TF_TOKEN_` environment variables (such as `TF_TOKEN_app_terraform_io`) during authentication, matching Terraform CLI's resolution. This includes punycode hostnames and the interchangeable dash encodings (literal `-` or double underscore). Previously these tokens were not detected. + +* Clarify the not-found (404) API error message to point at verifying the request path and resource IDs instead of suggesting an authentication problem. + +* Fix `api --all` returning no output when the result fits in a single page. The response body was consumed while checking for additional pages and not restored, so single-page responses rendered empty. + +* Fix `api` `--json` and `--jq` output incorrectly including one-to-one relationship IDs under `attributes`. Those IDs are surfaced for table and pretty output only, and are no longer written back into the raw JSON payload. + +* Redacts customer data within HTTP paths in telemetry payloads, such as organization and workspace names. + +* Using the `--quiet` argument no longer suppresses api command rendering for GET requests. \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fec2c6..413e492 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,22 +1,29 @@ -## v0.4.0-beta (July 23, 2026) - +## v0.4.0 (July 30, 2026) NEW FEATURES: * Adds the `harness exec` command, which lets a human grant session-scoped, noninteractive `tfctl` delete permissions to a wrapped command (such as a coding agent) via `--allow-delete`. The grant is tied to all subprocesses. - ENHANCEMENTS: +* Running tfctl, tfctl version, or tfctl --version checks whether there is a newer version of tfctl available and whether `auth login` needs to be run. + +* tfctl now detects outdated skills it installed and migrates them to the latest version. + * Adds a `--plan-only` flag to `run start` that creates a speculative plan-only run which is never applied, regardless of the workspace's auto-apply setting. * Positional arguments and API path parameters are now checked for basic input hygiene, rejecting control characters and invalid UTF-8. This keeps malformed values out of requests and out of terminal/audit output. This is not a security boundary; authorization is still enforced by your API token. * The config directory can now be overridden with the TFCTL_CONFIG_DIR environment variable. Profiles and exec sessions both resolve against this directory, making it easy to isolate tfctl state (for example, in CI or eval harnesses). - BUG FIXES: +* Using `auth login --dry-run` no longer opens a web browser. `--dry-run` now appears in argument autocomplete lists. + +* Using `profile display --markdown` no longer produces an error. + +* Removed Token property from json output when using `profile profiles list --json`, preventing accidental exposure. + * Don't attempt to retry telemetry transmission on server errors, like rate limiting 429 errors. * Detect Terraform's `TF_TOKEN_` environment variables (such as `TF_TOKEN_app_terraform_io`) during authentication, matching Terraform CLI's resolution. This includes punycode hostnames and the interchangeable dash encodings (literal `-` or double underscore). Previously these tokens were not detected. @@ -29,16 +36,14 @@ BUG FIXES: * Redacts customer data within HTTP paths in telemetry payloads, such as organization and workspace names. -* Using the --quiet argument no longer suppresses api command rendering for GET requests. - +* Using the `--quiet` argument no longer suppresses api command rendering for GET requests. NOTES: -* For developers of tfctl, added CONTRIBUTING.md, developer setup automation, and `make help` +* For developers of tfctl, added CONTRIBUTING.md, AGENTS.md, developer setup automation, and `make help` ## v0.3.0 (June 22, 2026) - ENHANCEMENTS: * The `harness install` command supports shell autocompletion for supported coding agents and support for the Amp coding agent has been added. @@ -49,7 +54,6 @@ ENHANCEMENTS: * The `api` command now accepts arbitrary URLs, such as Archivist, but does not send tokens to any host except the configured API host. - BUG FIXES: * Profile configuration files are now created with read/write permissions for owner only. diff --git a/internal/pkg/openapi/spec/hcpt_v2_public_beta.json b/internal/pkg/openapi/spec/hcpt_v2_public_beta.json index 91ea92f..e07eb2d 100644 --- a/internal/pkg/openapi/spec/hcpt_v2_public_beta.json +++ b/internal/pkg/openapi/spec/hcpt_v2_public_beta.json @@ -1,7 +1,7 @@ { "openapi": "3.0.0", "info": { - "version": "ee6a78eb", + "version": "5e36b1b7", "title": "HCP Terraform/Terraform Enterprise API v2-Beta", "description": "OpenAPI Specification for the HCP Terraform/Terraform Enterprise API V2 Public Beta.", "license": { @@ -450,9 +450,63 @@ "name": "tag-binding", "x-displayName": "Tag Bindings", "description": "Tag bindings on resources" + }, + { + "name": "admin-banners", + "x-vis": [ + "tfe" + ], + "x-displayName": "Admin Banners", + "description": "Site-wide announcement banner management for Terraform Enterprise administrators." } ], "paths": { + "/admin/banners": { + "x-vis": [ + "tfe" + ], + "post": { + "operationId": "createAdminBanner", + "summary": "Create Site-Wide Announcement Banner", + "x-tfe-min-version": "v202601-1", + "description": "Creates a site-wide announcement banner. Only one banner can be active at a time; creating a new banner automatically deactivates any existing active banner. If neither scheduled-publish-at nor scheduled-expire-at are provided, the banner is published immediately.\n\n\nThis operation is only available in Terraform Enterprise.", + "tags": [ + "admin-banners" + ], + "requestBody": { + "required": true, + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/admin-banners-envelope" + } + } + } + }, + "responses": { + "201": { + "description": "Banner created successfully.", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/admin-banners-envelope" + } + } + } + }, + "default": { + "description": "Error details", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/errors" + } + } + } + } + } + } + }, "/account/details": { "get": { "operationId": "getAccountDetails", @@ -2247,11 +2301,16 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string", - "enum": [ - "subscription" - ] + "type": "array", + "items": { + "type": "string", + "enum": [ + "subscription" + ] + } }, "required": false, "description": "Optionally side-load relationships of the specified name" @@ -2407,13 +2466,18 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string", - "enum": [ - "subscription", - "entitlement_set", - "default-project" - ] + "type": "array", + "items": { + "type": "string", + "enum": [ + "subscription", + "entitlement_set", + "default-project" + ] + } }, "required": false, "description": "Optionally side-load relationships of the specified name" @@ -2780,13 +2844,18 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string", - "enum": [ - "user", - "teams", - "scim-identity" - ] + "type": "array", + "items": { + "type": "string", + "enum": [ + "user", + "teams", + "scim-identity" + ] + } }, "required": false, "description": "Optionally side-load relationships. Can include \"user\", \"teams\", or \"scim-identity\".\nNote: \"scim-identity\" is only available on HCP Terraform.\n" @@ -2829,7 +2898,7 @@ "included": { "type": "array", "items": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/users" }, @@ -2842,7 +2911,16 @@ { "$ref": "#/components/schemas/scim-identities" } - ] + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "users": "#/components/schemas/users", + "teams": "#/components/schemas/teams", + "organizations": "#/components/schemas/organizations", + "scim-identities": "#/components/schemas/scim-identities" + } + } } } } @@ -3003,13 +3081,18 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string", - "enum": [ - "user", - "teams", - "organization" - ] + "type": "array", + "items": { + "type": "string", + "enum": [ + "user", + "teams", + "organization" + ] + } }, "required": false, "description": "Optionally side-load relationships. Can include \"user\", \"teams\", or \"organization\"." @@ -3052,7 +3135,7 @@ "included": { "type": "array", "items": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/users" }, @@ -3062,7 +3145,15 @@ { "$ref": "#/components/schemas/organizations" } - ] + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "users": "#/components/schemas/users", + "teams": "#/components/schemas/teams", + "organizations": "#/components/schemas/organizations" + } + } } } } @@ -3104,12 +3195,17 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string", - "enum": [ - "user", - "teams" - ] + "type": "array", + "items": { + "type": "string", + "enum": [ + "user", + "teams" + ] + } }, "required": false, "description": "Optionally side-load relationships. Can include \"user\" or \"teams\"." @@ -3131,14 +3227,21 @@ "included": { "type": "array", "items": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/users" }, { "$ref": "#/components/schemas/teams" } - ] + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "users": "#/components/schemas/users", + "teams": "#/components/schemas/teams" + } + } } } } @@ -3249,13 +3352,18 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string", - "enum": [ - "recoverable", - "deleted_by", - "project" - ] + "type": "array", + "items": { + "type": "string", + "enum": [ + "recoverable", + "deleted_by", + "project" + ] + } }, "required": false, "description": "Optionally side-load relationships of the specified name. Multiple values can be comma-separated." @@ -4582,11 +4690,43 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string" + "type": "array", + "items": { + "type": "string", + "enum": [ + "agent_pool", + "current_assessment_result", + "current_configuration_version", + "current_configuration_version.ingress_attributes", + "current_run", + "current_run.apply", + "current_run.plan", + "current_run.configuration_version", + "current_run.configuration_version.ingress_attributes", + "current_state_version", + "current_state_version.resources_processed", + "latest_run", + "latest_run.plan", + "latest_run.configuration_version", + "latest_run.configuration_version.ingress_attributes", + "locked_by", + "no_code_module_version", + "no_code_module_version.no_code_module", + "no_code_module_version.no_code_module.latest_version", + "organization", + "outputs", + "project", + "readme", + "vars", + "effective_tag_bindings" + ] + } }, "required": false, - "description": "Comma-separated list of relationship names to side-load (e.g., current_run, readme, effective_tag_bindings).\n" + "description": "Comma-separated list of relationship names to side-load.\n" }, { "$ref": "#/components/parameters/page_number" @@ -4764,11 +4904,43 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string" + "type": "array", + "items": { + "type": "string", + "enum": [ + "agent_pool", + "current_assessment_result", + "current_configuration_version", + "current_configuration_version.ingress_attributes", + "current_run", + "current_run.apply", + "current_run.plan", + "current_run.configuration_version", + "current_run.configuration_version.ingress_attributes", + "current_state_version", + "current_state_version.resources_processed", + "latest_run", + "latest_run.plan", + "latest_run.configuration_version", + "latest_run.configuration_version.ingress_attributes", + "locked_by", + "no_code_module_version", + "no_code_module_version.no_code_module", + "no_code_module_version.no_code_module.latest_version", + "organization", + "outputs", + "project", + "readme", + "vars", + "effective_tag_bindings" + ] + } }, "required": false, - "description": "Optionally side-load relationships. Comma-separated list of relationship names (e.g. current_run, current_state_version, locked_by, outputs, project, agent_pool).\n" + "description": "Optionally side-load relationships.\n" } ], "responses": { @@ -5859,72 +6031,6 @@ } } }, - "/workspaces/{workspace_id}/queries": { - "x-vs": [ - "internal-beta" - ], - "get": { - "operationId": "getWorkspaceQueries", - "summary": "Get Queries for a Workspace", - "description": "Get list of queries for a particular workspace.", - "tags": [ - "queries" - ], - "parameters": [ - { - "in": "path", - "name": "workspace_id", - "schema": { - "type": "string" - }, - "required": true, - "description": "The id of the workspace." - }, - { - "$ref": "#/components/parameters/page_number" - }, - { - "$ref": "#/components/parameters/page_size" - } - ], - "responses": { - "200": { - "description": "List of Queries", - "content": { - "application/vnd.api+json": { - "schema": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/queries" - } - }, - "links": { - "$ref": "#/components/schemas/self-with-pagination" - }, - "meta": { - "$ref": "#/components/schemas/pagination" - } - } - } - } - } - }, - "default": { - "description": "Error details", - "content": { - "application/vnd.api+json": { - "schema": { - "$ref": "#/components/schemas/errors" - } - } - } - } - } - } - }, "/workspaces/{workspace_id}/all-vars": { "get": { "operationId": "listAllVars", @@ -6259,6 +6365,16 @@ }, "required": true, "description": "The ID of the provider set." + }, + { + "in": "query", + "name": "include", + "description": "Comma-separated list of related resources to include. Valid values: projects, workspaces.\n", + "schema": { + "type": "string" + }, + "required": false, + "example": "projects,workspaces" } ], "responses": { @@ -6576,6 +6692,16 @@ }, "required": true, "description": "The name of the organization." + }, + { + "in": "query", + "name": "include", + "description": "Comma-separated list of related resources to include. Valid values: projects, workspaces.\n", + "schema": { + "type": "string" + }, + "required": false, + "example": "projects,workspaces" } ], "responses": { @@ -6759,6 +6885,16 @@ }, "required": true, "description": "The name of the provider_set." + }, + { + "in": "query", + "name": "include", + "description": "Comma-separated list of related resources to include. Valid values: projects, workspaces.\n", + "schema": { + "type": "string" + }, + "required": false, + "example": "projects,workspaces" } ], "responses": { @@ -8178,11 +8314,43 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string" + "type": "array", + "items": { + "type": "string", + "enum": [ + "agent_pool", + "current_assessment_result", + "current_configuration_version", + "current_configuration_version.ingress_attributes", + "current_run", + "current_run.apply", + "current_run.plan", + "current_run.configuration_version", + "current_run.configuration_version.ingress_attributes", + "current_state_version", + "current_state_version.resources_processed", + "latest_run", + "latest_run.plan", + "latest_run.configuration_version", + "latest_run.configuration_version.ingress_attributes", + "locked_by", + "no_code_module_version", + "no_code_module_version.no_code_module", + "no_code_module_version.no_code_module.latest_version", + "organization", + "outputs", + "project", + "readme", + "vars", + "effective_tag_bindings" + ] + } }, "required": false, - "description": "Optionally side-load relationships. Comma-separated list of relationship names (e.g. current_run, current_state_version, locked_by, outputs, project, agent_pool).\n" + "description": "Optionally side-load relationships.\n" } ], "responses": { @@ -9578,11 +9746,19 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string" + "type": "array", + "items": { + "type": "string", + "enum": [ + "outputs" + ] + } }, "required": false, - "description": "Optionally side-load relationships. For example, outputs or created-by.\n" + "description": "Optionally side-load relationships.\n" } ], "responses": { @@ -9972,8 +10148,24 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string" + "type": "array", + "items": { + "type": "string", + "enum": [ + "plan", + "apply", + "created_by", + "configuration_version", + "configuration_version.ingress_attributes", + "cost_estimate", + "workspace", + "task_stages", + "tf_policy_evaluations" + ] + } }, "required": false, "description": "Available side-load related resources. Multiple values can be comma-separated.\n\nAvailable includes:\n- `plan` - The plan for this run\n- `apply` - The apply for this run\n- `created_by` - The user who created this run\n- `configuration_version` - The configuration version used\n- `configuration_version.ingress_attributes` - VCS ingress details\n- `cost_estimate` - Cost estimation for this run\n- `workspace` - The workspace this run belongs to\n- `task_stages` - Run task stages\n- `tf_policy_evaluations` - Terraform Policy evaluations *(public-beta)*\n" @@ -11910,11 +12102,19 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string" + "type": "array", + "items": { + "type": "string", + "enum": [ + "tf_policy_set_outcomes" + ] + } }, "required": false, - "description": "Comma-separated list of related resources to include. Valid values are `tf_policy_set_outcomes`." + "description": "Comma-separated list of related resources to include." } ], "responses": { @@ -15572,6 +15772,17 @@ "description": "HYOK Configuration ID" } ], + "requestBody": { + "required": false, + "content": { + "application/vnd.api+json": { + "schema": { + "type": "object", + "additionalProperties": false + } + } + } + }, "responses": { "202": { "description": "HYOK Configuration revocation initiated", @@ -15740,6 +15951,17 @@ "description": "HYOK Customer Key Version ID" } ], + "requestBody": { + "required": false, + "content": { + "application/vnd.api+json": { + "schema": { + "type": "object", + "additionalProperties": false + } + } + } + }, "responses": { "202": { "description": "HYOK Key Version revocation initiated", @@ -15952,57 +16174,6 @@ } } }, - "post": { - "operationId": "createAuthenticationToken", - "summary": "Create Authentication Token", - "description": "Create an authentication token", - "tags": [ - "authentication-tokens" - ], - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "string" - }, - "required": true, - "description": "ID - Can be a token ID or a team ID, depending on the token type" - } - ], - "requestBody": { - "required": true, - "content": { - "application/vnd.api+json": { - "schema": { - "$ref": "#/components/schemas/authentication-tokens-envelope" - } - } - } - }, - "responses": { - "201": { - "description": "Authentication token created", - "content": { - "application/vnd.api+json": { - "schema": { - "$ref": "#/components/schemas/authentication-tokens-envelope" - } - } - } - }, - "default": { - "description": "Error details", - "content": { - "application/vnd.api+json": { - "schema": { - "$ref": "#/components/schemas/errors" - } - } - } - } - } - }, "delete": { "operationId": "deleteAuthenticationToken", "summary": "Delete authentication Token", @@ -16419,9 +16590,9 @@ }, "/teams/{id}/authentication-token": { "get": { - "operationId": "getAuthenticationToken", - "summary": "Get authentication token details", - "description": "Get details about an authentication token", + "operationId": "getTeamAuthenticationToken", + "summary": "Get team authentication token details", + "description": "Get details about a team's authentication token", "tags": [ "authentication-tokens" ], @@ -16433,7 +16604,7 @@ "type": "string" }, "required": true, - "description": "ID - Can be a token ID or a team ID, depending on the token type" + "description": "Team ID" } ], "responses": { @@ -16460,9 +16631,9 @@ } }, "post": { - "operationId": "createAuthenticationToken", - "summary": "Create Authentication Token", - "description": "Create an authentication token", + "operationId": "createTeamAuthenticationToken", + "summary": "Create (or regenerate) the legacy team authentication token", + "description": "Creates the team's legacy, descriptionless authentication token. If one already exists, it is revoked and replaced.", "tags": [ "authentication-tokens" ], @@ -16474,7 +16645,7 @@ "type": "string" }, "required": true, - "description": "ID - Can be a token ID or a team ID, depending on the token type" + "description": "Team ID" } ], "requestBody": { @@ -16511,9 +16682,9 @@ } }, "delete": { - "operationId": "deleteAuthenticationToken", - "summary": "Delete authentication Token", - "description": "Delete an authentication token", + "operationId": "deleteTeamAuthenticationToken", + "summary": "Delete team authentication token", + "description": "Delete a team's authentication token", "tags": [ "authentication-tokens" ], @@ -16525,7 +16696,7 @@ "type": "string" }, "required": true, - "description": "ID - Can be a token ID or a team ID, depending on the token type" + "description": "Team ID" } ], "responses": { @@ -16858,6 +17029,24 @@ "required": true, "description": "Organization Name" }, + { + "in": "query", + "name": "q", + "schema": { + "type": "string" + }, + "required": false, + "description": "Search team tokens by team name." + }, + { + "in": "query", + "name": "filter[expiry_status]", + "schema": { + "type": "string" + }, + "required": false, + "description": "Filter by token expiry status. Accepts a comma-separated list of any of: `active`, `expiring_in_7_days`, `expiring_in_30_days`, `expired`, `no_expiration`. Multiple values are combined with OR." + }, { "$ref": "#/components/parameters/page_number" }, @@ -16906,6 +17095,71 @@ } } } + }, + "delete": { + "operationId": "deleteTeamTokensForAnOrganization", + "summary": "Bulk-Delete Team Tokens for an Organization", + "description": "Bulk-delete team tokens for an organization.", + "tags": [ + "authentication-tokens" + ], + "parameters": [ + { + "in": "path", + "name": "organization_name", + "schema": { + "type": "string" + }, + "required": true, + "description": "Organization Name" + } + ], + "requestBody": { + "required": true, + "content": { + "application/vnd.api+json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "authentication-tokens" + ] + }, + "id": { + "type": "string", + "description": "External ID of the team token to delete.", + "example": "at-abc123def456" + } + } + } + } + } + } + } + } + }, + "responses": { + "204": { + "description": "Tokens deleted" + }, + "default": { + "description": "Error details", + "content": { + "application/vnd.api+json": { + "schema": { + "$ref": "#/components/schemas/errors" + } + } + } + } + } } }, "/organizations/{organization_name}/teams": { @@ -16947,12 +17201,17 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string", - "enum": [ - "users", - "organization-memberships" - ] + "type": "array", + "items": { + "type": "string", + "enum": [ + "users", + "organization-memberships" + ] + } }, "required": false, "description": "Optionally side-load relationships. Can include \"users\" or \"organization-memberships\"." @@ -17002,7 +17261,14 @@ { "$ref": "#/components/schemas/organization-memberships" } - ] + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "users": "#/components/schemas/users", + "organization-memberships": "#/components/schemas/organization-memberships" + } + } } } } @@ -17145,12 +17411,17 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string", - "enum": [ - "users", - "organization-memberships" - ] + "type": "array", + "items": { + "type": "string", + "enum": [ + "users", + "organization-memberships" + ] + } }, "required": false, "description": "Optionally side-load relationships. Can include \"users\" or \"organization-memberships\"." @@ -17179,7 +17450,14 @@ { "$ref": "#/components/schemas/organization-memberships" } - ] + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "users": "#/components/schemas/users", + "organization-memberships": "#/components/schemas/organization-memberships" + } + } } } } @@ -18993,11 +19271,19 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string" + "type": "array", + "items": { + "type": "string", + "enum": [ + "oauth_client" + ] + } }, "required": false, - "description": "Allows including related resource data. Only \"oauth_client\" is supported." + "description": "Allows including related resource data." }, { "$ref": "#/components/parameters/page_number" @@ -21366,11 +21652,20 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string" + "type": "array", + "items": { + "type": "string", + "enum": [ + "workspace_tasks", + "workspace_tasks.workspace" + ] + } }, "required": false, - "description": "Allows including related resource data. Value must be a comma-separated list containing one or more of `workspace_tasks` or `workspace_tasks.workspace`.\n" + "description": "Allows including related resource data.\n" } ], "responses": { @@ -21503,11 +21798,20 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string" + "type": "array", + "items": { + "type": "string", + "enum": [ + "workspace_tasks", + "workspace_tasks.workspace" + ] + } }, "required": false, - "description": "Allows including related resource data. Value must be a comma-separated list containing one or more of `workspace_tasks` or `workspace_tasks.workspace`.\n" + "description": "Allows including related resource data.\n" }, { "$ref": "#/components/parameters/page_number" @@ -21973,11 +22277,23 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string" + "type": "array", + "items": { + "type": "string", + "enum": [ + "run", + "run.workspace", + "task_results", + "policy_evaluations", + "cost_estimate" + ] + } }, "required": false, - "description": "A comma-separated list of related resources to include. Supported values: run, run.workspace, task-results, policy-evaluations." + "description": "A comma-separated list of related resources to include." } ], "responses": { @@ -22542,11 +22858,19 @@ { "in": "query", "name": "include", + "style": "form", + "explode": false, "schema": { - "type": "string" + "type": "array", + "items": { + "type": "string", + "enum": [ + "events" + ] + } }, "required": false, - "description": "Related resources to include (e.g., operations)" + "description": "Allows including related resource data." } ], "responses": { @@ -22698,6 +23022,106 @@ } }, "schemas": { + "admin-banners": { + "type": "object", + "required": [ + "type", + "attributes" + ], + "properties": { + "id": { + "type": "string", + "readOnly": true, + "description": "The external ID of the banner (e.g. ab-xxxxxxxxxxxxxxxx)." + }, + "type": { + "type": "string", + "enum": [ + "admin-banners" + ] + }, + "attributes": { + "type": "object", + "required": [ + "title", + "body", + "style", + "audience" + ], + "properties": { + "title": { + "type": "string", + "maxLength": 100, + "description": "Short heading for the banner (max 100 characters)." + }, + "body": { + "type": "string", + "maxLength": 255, + "description": "Body text of the banner. Limited HTML is allowed: strong, em, b, i, and anchor tags with href. All other tags and attributes are stripped. Maximum 255 characters after sanitization.\n" + }, + "style": { + "type": "string", + "enum": [ + "info", + "warning", + "critical" + ], + "description": "Visual style controlling how the banner is rendered." + }, + "audience": { + "type": "string", + "enum": [ + "all_users", + "authenticated_only" + ], + "description": "Which users see the banner." + }, + "scheduled-publish-at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "ISO 8601 datetime (UTC) when the banner should become active. scheduled-publish-at, scheduled-expire-at, and timezone must all be provided together or all omitted. Providing only a subset is a validation error.\n" + }, + "scheduled-expire-at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "ISO 8601 datetime (UTC) when the banner should be automatically deactivated. Must be provided together with scheduled-publish-at and timezone.\n" + }, + "timezone": { + "type": "string", + "nullable": true, + "description": "IANA timezone identifier for the scheduled times (e.g. \"America/New_York\", \"UTC\"). Required when scheduled-publish-at and scheduled-expire-at are provided. Used by the UI to display the schedule in the administrator's local timezone; stored and returned as-is.\n" + }, + "published-at": { + "type": "string", + "format": "date-time", + "nullable": true, + "readOnly": true, + "description": "Set automatically when the banner is created without a schedule, or when the scheduled publish time is reached.\n" + }, + "deactivated-at": { + "type": "string", + "format": "date-time", + "nullable": true, + "readOnly": true, + "description": "Set when the banner is deactivated, either because a newer banner was created or because the scheduled expiry time was reached.\n" + } + } + } + } + }, + "admin-banners-envelope": { + "type": "object", + "required": [ + "data" + ], + "properties": { + "data": { + "$ref": "#/components/schemas/admin-banners" + } + } + }, "errors": { "type": "object", "properties": { @@ -22736,6 +23160,38 @@ } } }, + "authenticated-resource-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "organizations", + "runs", + "users", + "teams" + ] + } + } + }, + "authenticated-resource-has-one": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/authenticated-resource-identifier" + }, + "links": { + "$ref": "#/components/schemas/related" + } + } + }, "self": { "type": "object", "properties": { @@ -22927,29 +23383,7 @@ "$ref": "#/components/schemas/links_related" }, "authenticated-resource": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "organizations", - "runs", - "users", - "teams" - ] - } - } - }, - "links": { - "$ref": "#/components/schemas/related" - } - } + "$ref": "#/components/schemas/authenticated-resource-has-one" } } }, @@ -22969,56 +23403,61 @@ } } }, - "hcp-billing-accounts-id": { + "hcp-billing-accounts-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "hcp-billing-account" + ] + } + } + }, + "hcp-billing-accounts-has-one": { "type": "object", - "nullable": false, "properties": { "data": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "hcp-billing-account" - ] - } - } + "$ref": "#/components/schemas/hcp-billing-accounts-identifier" }, "links": { "$ref": "#/components/schemas/related" } } }, - "feature-sets-id": { + "feature-sets-identifier": { "type": "object", - "nullable": true, "required": [ - "data" + "id", + "type" ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "feature-sets" + ] + } + } + }, + "feature-sets-has-many": { + "type": "object", + "nullable": true, "properties": { "data": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "feature-sets" - ] - } + "type": "array", + "items": { + "$ref": "#/components/schemas/feature-sets-identifier" } } } @@ -23065,18 +23504,10 @@ ], "properties": { "default-account": { - "$ref": "#/components/schemas/hcp-billing-accounts-id" + "$ref": "#/components/schemas/hcp-billing-accounts-has-one" }, "connected-plans": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/feature-sets-id" - } - } - } + "$ref": "#/components/schemas/feature-sets-has-many" } } } @@ -23437,49 +23868,78 @@ } } }, - "organizations-id": { + "organizations-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "organizations" + ] + } + } + }, + "organizations-has-one": { "type": "object", "properties": { "data": { "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "organizations" - ] + "allOf": [ + { + "$ref": "#/components/schemas/organizations-identifier" } - } + ], + "nullable": true }, "links": { "$ref": "#/components/schemas/related" } } }, - "subscriptions-id": { + "feature-sets-has-one": { + "type": "object", + "nullable": true, + "required": [ + "data" + ], + "properties": { + "data": { + "$ref": "#/components/schemas/feature-sets-identifier" + } + } + }, + "subscriptions-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "subscriptions" + ] + } + } + }, + "subscriptions-has-one": { "type": "object", "properties": { "data": { "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "subscriptions" - ] + "allOf": [ + { + "$ref": "#/components/schemas/subscriptions-identifier" } - } + ], + "nullable": true }, "links": { "$ref": "#/components/schemas/related" @@ -23627,16 +24087,16 @@ ], "properties": { "organization": { - "$ref": "#/components/schemas/organizations-id" + "$ref": "#/components/schemas/organizations-has-one" }, "feature-set": { - "$ref": "#/components/schemas/feature-sets-id" + "$ref": "#/components/schemas/feature-sets-has-one" }, "hcp-billing-account": { "$ref": "#/components/schemas/links_related" }, "next-subscription": { - "$ref": "#/components/schemas/subscriptions-id" + "$ref": "#/components/schemas/subscriptions-has-one" } } } @@ -23699,6 +24159,32 @@ } } }, + "workspaces-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "workspaces" + ] + } + } + }, + "workspaces-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/workspaces-identifier" + } + } + } + }, "agent-pools": { "type": "object", "required": [ @@ -23749,57 +24235,10 @@ "$ref": "#/components/schemas/links_related" }, "workspaces": { - "readOnly": true, - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "workspaces" - ] - } - } - } - } - } + "$ref": "#/components/schemas/workspaces-has-many" }, "allowed-workspaces": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "workspaces" - ] - } - } - } - } - } + "$ref": "#/components/schemas/workspaces-has-many" } } } @@ -23867,62 +24306,62 @@ } } }, - "agent-pools-id-many": { + "agent-pools-identifier": { "type": "object", - "nullable": true, "required": [ - "data" + "id", + "type" ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "agent-pools" + ] + } + } + }, + "agent-pools-has-many": { + "type": "object", + "nullable": true, "properties": { "data": { "type": "array", "items": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "agent-pools" - ] - } - } + "$ref": "#/components/schemas/agent-pools-identifier" } } } }, - "cidr-ranges-id-many": { + "cidr-ranges-identifier": { "type": "object", - "nullable": true, "required": [ - "data" + "type" ], + "properties": { + "id": { + "type": "string", + "readOnly": true + }, + "type": { + "type": "string", + "enum": [ + "cidr-ranges" + ] + } + } + }, + "cidr-ranges-has-many": { + "type": "object", + "nullable": true, "properties": { "data": { "type": "array", "items": { - "type": "object", - "required": [ - "type" - ], - "properties": { - "id": { - "type": "string", - "readOnly": true - }, - "type": { - "type": "string", - "enum": [ - "cidr-ranges" - ] - } - } + "$ref": "#/components/schemas/cidr-ranges-identifier" } } } @@ -23972,15 +24411,13 @@ "type": "object", "properties": { "organization": { - "readOnly": true, - "$ref": "#/components/schemas/organizations-id" + "$ref": "#/components/schemas/organizations-has-one" }, "agent-pools": { - "readOnly": true, - "$ref": "#/components/schemas/agent-pools-id-many" + "$ref": "#/components/schemas/agent-pools-has-many" }, "cidr-ranges": { - "$ref": "#/components/schemas/cidr-ranges-id-many" + "$ref": "#/components/schemas/cidr-ranges-has-many" } } } @@ -23997,7 +24434,25 @@ } } }, - "cidr-range-lists-id": { + "cidr-range-lists-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "cidr-range-lists" + ] + } + } + }, + "cidr-range-lists-has-one": { "type": "object", "nullable": true, "required": [ @@ -24006,22 +24461,12 @@ "properties": { "data": { "type": "object", - "nullable": true, - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "cidr-range-lists" - ] + "allOf": [ + { + "$ref": "#/components/schemas/cidr-range-lists-identifier" } - } + ], + "nullable": true } } }, @@ -24070,12 +24515,10 @@ "type": "object", "properties": { "organization": { - "readOnly": true, - "$ref": "#/components/schemas/organizations-id" + "$ref": "#/components/schemas/organizations-has-one" }, "cidr-range-list": { - "readOnly": true, - "$ref": "#/components/schemas/cidr-range-lists-id" + "$ref": "#/components/schemas/cidr-range-lists-has-one" } } } @@ -24173,7 +24616,7 @@ } } }, - "agent-pools-id": { + "agent-pools-has-one": { "type": "object", "nullable": true, "required": [ @@ -24182,26 +24625,35 @@ "properties": { "data": { "type": "object", - "nullable": true, - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "agent-pools" - ] + "allOf": [ + { + "$ref": "#/components/schemas/agent-pools-identifier" } - } + ], + "nullable": true } } }, - "data-retention-policy-id": { + "data-retention-policy-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "data-retention-policy-delete-olders", + "data-retention-policy-dont-deletes" + ] + } + } + }, + "data-retention-policy-has-one": { "type": "object", "required": [ "data" @@ -24209,89 +24661,102 @@ "properties": { "data": { "type": "object", - "nullable": true, - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "data-retention-policy-delete-olders", - "data-retention-policy-dont-deletes" - ] + "allOf": [ + { + "$ref": "#/components/schemas/data-retention-policy-identifier" } - } + ], + "nullable": true + } + } + }, + "entitlement-sets-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "entitlement-sets" + ] } } }, - "entitlement-sets-id": { + "entitlement-sets-has-one": { "type": "object", "properties": { "data": { "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "entitlement-sets" - ] + "allOf": [ + { + "$ref": "#/components/schemas/entitlement-sets-identifier" } - } + ], + "nullable": true }, "links": { "$ref": "#/components/schemas/related" } } }, - "projects-id": { + "projects-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "projects" + ] + } + } + }, + "projects-has-one": { "type": "object", "properties": { "data": { "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "projects" - ] + "allOf": [ + { + "$ref": "#/components/schemas/projects-identifier" } - } + ], + "nullable": true }, "links": { "$ref": "#/components/schemas/related" } } }, - "hyok-configurations-id": { + "hyok-configurations-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "hyok-configurations" + ] + } + } + }, + "hyok-configurations-has-one": { "type": "object", "properties": { "data": { "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "hyok-configurations" - ] + "allOf": [ + { + "$ref": "#/components/schemas/hyok-configurations-identifier" } - } + ], + "nullable": true } } }, @@ -24666,13 +25131,13 @@ "type": "object", "properties": { "default-agent-pool": { - "$ref": "#/components/schemas/agent-pools-id" + "$ref": "#/components/schemas/agent-pools-has-one" }, "stacks-default-agent-pool": { - "$ref": "#/components/schemas/agent-pools-id" + "$ref": "#/components/schemas/agent-pools-has-one" }, "data-retention-policy": { - "$ref": "#/components/schemas/data-retention-policy-id", + "$ref": "#/components/schemas/data-retention-policy-has-one", "x-vis": [ "tfe" ], @@ -24706,19 +25171,19 @@ "description": "This relationship is only available in HCP Terraform." }, "entitlement-set": { - "$ref": "#/components/schemas/entitlement-sets-id" + "$ref": "#/components/schemas/entitlement-sets-has-one" }, "subscription": { - "$ref": "#/components/schemas/subscriptions-id" + "$ref": "#/components/schemas/subscriptions-has-one" }, "default-project": { - "$ref": "#/components/schemas/projects-id" + "$ref": "#/components/schemas/projects-has-one" }, "primary-hyok-configuration": { "x-vis": [ "hcpt" ], - "$ref": "#/components/schemas/hyok-configurations-id", + "$ref": "#/components/schemas/hyok-configurations-has-one", "description": "This relationship is only available in HCP Terraform." } } @@ -24891,20 +25356,7 @@ "type": "object", "properties": { "organization": { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/organizations-id" - }, - "links": { - "type": "object", - "properties": { - "related": { - "type": "string" - } - } - } - } + "$ref": "#/components/schemas/organizations-has-one" }, "tag-bindings": { "type": "object", @@ -24921,10 +25373,10 @@ } }, "default-agent-pool": { - "$ref": "#/components/schemas/agent-pools-id" + "$ref": "#/components/schemas/agent-pools-has-one" }, "stacks-default-agent-pool": { - "$ref": "#/components/schemas/agent-pools-id" + "$ref": "#/components/schemas/agent-pools-has-one" } } }, @@ -24969,6 +25421,87 @@ } } }, + "teams-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "teams" + ] + } + } + }, + "teams-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/teams-identifier" + } + } + } + }, + "users-has-one": { + "type": "object", + "properties": { + "data": { + "type": "object", + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "users" + ] + } + } + }, + "links": { + "$ref": "#/components/schemas/related" + } + } + }, + "scim-identities-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "scim-identities" + ] + } + } + }, + "scim-identities-has-one": { + "type": "object", + "properties": { + "data": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/scim-identities-identifier" + } + ], + "nullable": true + } + } + }, "status-counts": { "type": "object", "properties": { @@ -25037,100 +25570,20 @@ "type": "object", "properties": { "teams": { - "type": "object", "description": "The teams this user is a member of. Only shows teams the requesting user has access to, and teams that are not \"secret\" (unless the requester is a member).", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "teams" - ] - } - } - } - }, - "links": { - "$ref": "#/components/schemas/related" - } - } + "$ref": "#/components/schemas/teams-has-many" }, "user": { - "type": "object", "description": "The user associated with this organization membership.", - "properties": { - "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "users" - ] - } - } - }, - "links": { - "$ref": "#/components/schemas/related" - } - } + "$ref": "#/components/schemas/users-has-one" }, "organization": { - "type": "object", "description": "The organization this membership belongs to.", - "properties": { - "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "organizations" - ] - } - } - }, - "links": { - "$ref": "#/components/schemas/related" - } - } + "$ref": "#/components/schemas/organizations-has-one" }, "scim-identity": { - "type": "object", "description": "The SCIM identity associated with this organization membership.\nOnly available on HCP Terraform when SCIM is enabled.\nReturns null if the user has no SCIM identity for this organization.\n", - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "scim-identities" - ] - } - } - }, - "links": { - "$ref": "#/components/schemas/related" - } - } + "$ref": "#/components/schemas/scim-identities-has-one" } } }, @@ -25150,6 +25603,58 @@ } } }, + "users-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "users" + ] + } + } + }, + "users-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/users-identifier" + } + } + } + }, + "organization-memberships-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "organization-memberships" + ] + } + } + }, + "organization-memberships-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/organization-memberships-identifier" + } + } + } + }, "teams": { "type": "object", "required": [ @@ -25386,67 +25891,15 @@ "type": "object", "properties": { "organization": { - "$ref": "#/components/schemas/organizations-id" + "$ref": "#/components/schemas/organizations-has-one" }, "users": { - "type": "object", "description": "Team members (active users only).", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "users" - ] - } - } - } - }, - "links": { - "$ref": "#/components/schemas/links_related" - } - } + "$ref": "#/components/schemas/users-has-many" }, "organization-memberships": { - "type": "object", "description": "Organization memberships for team members.", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "organization-memberships" - ] - } - } - } - }, - "links": { - "$ref": "#/components/schemas/related" - } - } + "$ref": "#/components/schemas/organization-memberships-has-many" }, "authentication-token": { "$ref": "#/components/schemas/links_related" @@ -25503,6 +25956,36 @@ } } }, + "recoverable-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "workspaces", + "stacks" + ] + } + } + }, + "recoverable-has-one": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/recoverable-identifier" + }, + "links": { + "$ref": "#/components/schemas/related" + } + } + }, "recoverable-items": { "type": "object", "required": [ @@ -25566,50 +26049,47 @@ ], "properties": { "project": { - "type": "object", "description": "The project this recoverable item belongs to", - "properties": { - "data": { - "$ref": "#/components/schemas/projects-id" - }, - "links": { - "$ref": "#/components/schemas/related" - } - } + "$ref": "#/components/schemas/projects-has-one" }, "recoverable": { - "type": "object", "description": "The recoverable resource (can be a workspace or stack.)", - "properties": { - "data": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "description": "The type of the recoverable resource (e.g., workspaces, stacks)", - "enum": [ - "workspaces", - "stacks" - ] - } - } - }, - "links": { - "$ref": "#/components/schemas/related" - } - } + "$ref": "#/components/schemas/recoverable-has-one" } } } } }, + "data-retention-target-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "organizations", + "workspaces" + ] + } + } + }, + "data-retention-target-has-one": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/data-retention-target-identifier" + }, + "links": { + "$ref": "#/components/schemas/related" + } + } + }, "data-retention-policy": { "type": "object", "required": [ @@ -25633,6 +26113,39 @@ "properties": { "deleteOlderThanNDays": { "type": "integer" + }, + "deleteStateVersions": { + "type": "boolean" + }, + "deleteConfigurationVersions": { + "type": "boolean" + }, + "deleteRunDataAndLogs": { + "type": "boolean" + }, + "stateVersionsDeleteAfterNDays": { + "type": "integer", + "nullable": true + }, + "configurationVersionsDeleteAfterNDays": { + "type": "integer", + "nullable": true + }, + "runDataAndLogsDeleteAfterNDays": { + "type": "integer", + "nullable": true + }, + "stateVersionsKeepLatestCount": { + "type": "integer", + "nullable": true + }, + "configurationVersionsKeepLatestCount": { + "type": "integer", + "nullable": true + }, + "runDataKeepLatestCount": { + "type": "integer", + "nullable": true } } }, @@ -25643,29 +26156,7 @@ "type": "object", "properties": { "target": { - "readOnly": true, - "type": "object", - "properties": { - "data": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "organizations", - "workspaces" - ] - } - } - } - } + "$ref": "#/components/schemas/data-retention-target-has-one" } } } @@ -25724,6 +26215,7 @@ }, "max-ttl-ms": { "type": "integer", + "format": "int64", "description": "The maximum time-to-live for the token in milliseconds", "example": 3600000 }, @@ -25766,6 +26258,7 @@ }, "max-ttl-ms": { "type": "integer", + "format": "int64", "description": "The maximum time-to-live for the token in milliseconds", "example": 3600000 } @@ -25889,41 +26382,275 @@ } } }, - "runs-id": { + "ssh-keys-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "ssh-keys" + ] + } + } + }, + "ssh-keys-has-one": { "type": "object", "properties": { "data": { "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "runs" - ] + "allOf": [ + { + "$ref": "#/components/schemas/ssh-keys-identifier" + } + ], + "nullable": true + } + } + }, + "locked-by-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "users", + "teams", + "runs" + ] + } + } + }, + "locked-by-has-one": { + "type": "object", + "properties": { + "data": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/locked-by-identifier" } + ], + "nullable": true + } + } + }, + "runs-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "runs" + ] + } + } + }, + "runs-has-one": { + "type": "object", + "properties": { + "data": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/runs-identifier" + } + ], + "nullable": true + } + } + }, + "workspace-outputs-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "workspace-outputs" + ] + } + } + }, + "workspace-outputs-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/workspace-outputs-identifier" } } } }, - "vars-id": { + "state-versions-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "state-versions" + ] + } + } + }, + "state-versions-has-one": { "type": "object", "properties": { "data": { "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "vars" - ] + "allOf": [ + { + "$ref": "#/components/schemas/state-versions-identifier" } + ], + "nullable": true + } + } + }, + "configuration-versions-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "configuration-versions" + ] + } + } + }, + "configuration-versions-has-one": { + "type": "object", + "properties": { + "data": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/configuration-versions-identifier" + } + ], + "nullable": true + }, + "links": { + "$ref": "#/components/schemas/related" + } + } + }, + "workspace-readme-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "workspace-readme" + ] + } + } + }, + "workspace-readme-has-one": { + "type": "object", + "properties": { + "data": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/workspace-readme-identifier" + } + ], + "nullable": true + } + } + }, + "assessment-results-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "assessment-results" + ] + } + } + }, + "assessment-results-has-one": { + "type": "object", + "properties": { + "data": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/assessment-results-identifier" + } + ], + "nullable": true + } + } + }, + "vars-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "vars" + ] + } + } + }, + "vars-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/vars-identifier" } } } @@ -26257,85 +26984,22 @@ "type": "object", "properties": { "organization": { - "$ref": "#/components/schemas/organizations-id" + "$ref": "#/components/schemas/organizations-has-one" }, "ssh-key": { - "type": "object", - "nullable": true, - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "ssh-keys" - ] - } - } - }, - "links": { - "$ref": "#/components/schemas/related" - } - } + "$ref": "#/components/schemas/ssh-keys-has-one" }, "locked-by": { - "type": "object", - "nullable": true, - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "users", - "teams", - "runs" - ] - } - } - }, - "links": { - "$ref": "#/components/schemas/related" - } - } + "$ref": "#/components/schemas/locked-by-has-one" }, "current-run": { - "$ref": "#/components/schemas/runs-id" + "$ref": "#/components/schemas/runs-has-one" }, "latest-run": { - "$ref": "#/components/schemas/runs-id" + "$ref": "#/components/schemas/runs-has-one" }, "outputs": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "workspace-outputs" - ] - } - } - } - } - } + "$ref": "#/components/schemas/workspace-outputs-has-many" }, "remote-state-consumers": { "type": "object", @@ -26346,105 +27010,25 @@ } }, "current-state-version": { - "type": "object", - "nullable": true, - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "state-versions" - ] - } - } - } - } + "$ref": "#/components/schemas/state-versions-has-one" }, "current-configuration-version": { - "type": "object", - "nullable": true, - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "configuration-versions" - ] - } - } - } - } + "$ref": "#/components/schemas/configuration-versions-has-one" }, "agent-pool": { - "$ref": "#/components/schemas/agent-pools-id" + "$ref": "#/components/schemas/agent-pools-has-one" }, "readme": { - "type": "object", - "nullable": true, - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "workspace-readme" - ] - } - } - } - } + "$ref": "#/components/schemas/workspace-readme-has-one" }, "project": { - "$ref": "#/components/schemas/projects-id" + "$ref": "#/components/schemas/projects-has-one" }, "current-assessment-result": { - "type": "object", - "nullable": true, - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "assessment-results" - ] - } - } - } - } + "$ref": "#/components/schemas/assessment-results-has-one" }, "vars": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/vars-id" - } - } - } + "$ref": "#/components/schemas/vars-has-many" } } }, @@ -26464,6 +27048,38 @@ } } }, + "subscribable-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "workspaces", + "projects", + "teams", + "stacks" + ] + } + } + }, + "subscribable-has-one": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/subscribable-identifier" + }, + "links": { + "$ref": "#/components/schemas/related" + } + } + }, "notification-configurations": { "type": "object", "required": [ @@ -26575,50 +27191,12 @@ "type": "object", "properties": { "subscribable": { - "type": "object", "description": "The resource (workspace, project, or team) this notification is configured for.", - "properties": { - "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "workspaces", - "projects", - "teams", - "stacks" - ] - } - } - } - } + "$ref": "#/components/schemas/subscribable-has-one" }, "users": { - "type": "object", "description": "Users associated with this notification (for email type).", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "users" - ] - } - } - } - } - } + "$ref": "#/components/schemas/users-has-many" } } } @@ -26701,254 +27279,100 @@ } } }, - "workspaces-id": { + "configurable-identifier": { "type": "object", + "required": [ + "id", + "type" + ], "properties": { - "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "workspaces" - ] - } - } + "id": { + "type": "string" }, - "links": { - "$ref": "#/components/schemas/related" + "type": { + "type": "string", + "enum": [ + "workspaces", + "policy-sets", + "varsets" + ] } } }, - "users-id": { + "configurable-has-one": { "type": "object", "properties": { "data": { "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "users" - ] + "allOf": [ + { + "$ref": "#/components/schemas/configurable-identifier" } - } + ], + "nullable": true + } + } + }, + "varsets-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" }, - "links": { - "$ref": "#/components/schemas/related" + "type": { + "type": "string", + "enum": [ + "varsets" + ] } } }, - "configuration-versions-id": { + "varsets-has-one": { "type": "object", "properties": { "data": { "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "configuration-versions" - ] + "allOf": [ + { + "$ref": "#/components/schemas/varsets-identifier" } - } + ], + "nullable": true } } }, - "no-code-queries-id": { + "workspaces-has-one": { "type": "object", "properties": { "data": { "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "no-code-queries" - ] + "allOf": [ + { + "$ref": "#/components/schemas/workspaces-identifier" } - } + ], + "nullable": true }, "links": { "$ref": "#/components/schemas/related" } } }, - "queries": { + "vars-has-one": { "type": "object", - "required": [ - "type", - "attributes", - "relationships" - ], "properties": { - "id": { - "type": "string", - "readOnly": true - }, - "type": { - "type": "string", - "enum": [ - "queries" - ] - }, - "attributes": { + "data": { "type": "object", - "properties": { - "actions": { - "type": "object", - "required": [ - "is-cancelable", - "is-force-cancelable" - ], - "properties": { - "is-cancelable": { - "type": "boolean" - }, - "is-force-cancelable": { - "type": "boolean" - } - } - }, - "canceled-at": { - "type": "string", - "format": "date-time", - "nullable": true, - "readOnly": true - }, - "updated-at": { - "type": "string", - "format": "date-time", - "readOnly": true - }, - "created-at": { - "type": "string", - "format": "date-time", - "readOnly": true - }, - "source": { - "type": "string", - "enum": [ - "tfe-api", - "tfe-ui", - "tfe-module", - "tfe-no-code-query", - "terraform" - ] - }, - "generate-config-out": { - "type": "boolean" - }, - "resources-discovered": { - "type": "integer", - "readOnly": true, - "description": "The number of resources discovered by the query run." - }, - "status-timestamps": { - "type": "object", - "properties": { - "pending-at": { - "type": "string", - "format": "date-time" - }, - "queued-at": { - "type": "string", - "format": "date-time" - }, - "errored-at": { - "type": "string", - "format": "date-time" - }, - "canceled-at": { - "type": "string", - "format": "date-time" - }, - "running-at": { - "type": "string", - "format": "date-time" - }, - "finished-at": { - "type": "string", - "format": "date-time" - } - } - }, - "status": { - "type": "string", - "enum": [ - "pending", - "queued", - "running", - "finished", - "canceled", - "errored" - ] - }, - "log-read-url": { - "type": "string", - "readOnly": true - }, - "permissions": { - "type": "object", - "properties": { - "can-cancel": { - "type": "boolean" - }, - "can-force-cancel": { - "type": "boolean" - } - } - }, - "force-cancel-available-at": { - "type": "string", - "format": "date-time", - "readOnly": true - }, - "policy-paths": { - "type": "array", - "items": { - "type": "string" - }, - "nullable": true + "allOf": [ + { + "$ref": "#/components/schemas/vars-identifier" } - } - }, - "relationships": { - "type": "object", - "required": [ - "workspace", - "configuration-version" ], - "properties": { - "workspace": { - "$ref": "#/components/schemas/workspaces-id" - }, - "canceled-by": { - "$ref": "#/components/schemas/users-id" - }, - "configuration-version": { - "$ref": "#/components/schemas/configuration-versions-id" - }, - "created-by": { - "$ref": "#/components/schemas/users-id" - }, - "no-code-query": { - "$ref": "#/components/schemas/no-code-queries-id", - "description": "The no-code query that triggered this query run, if any." - } - } + "nullable": true } } }, @@ -27012,121 +27436,19 @@ "type": "object", "properties": { "configurable": { - "type": "object", - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "workspaces", - "policy-sets", - "varsets" - ] - } - } - } - } + "$ref": "#/components/schemas/configurable-has-one" }, "varset": { - "type": "object", - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "varsets" - ] - } - } - }, - "links": { - "type": "object", - "properties": { - "related": { - "type": "string" - } - } - } - } + "$ref": "#/components/schemas/varsets-has-one" }, "workspace": { - "type": "object", - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "workspaces" - ] - } - } - }, - "links": { - "type": "object", - "properties": { - "related": { - "type": "string" - } - } - } - } + "$ref": "#/components/schemas/workspaces-has-one" }, "overwritten": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/vars-id" - } - } - } + "$ref": "#/components/schemas/vars-has-many" }, "overwriter": { - "type": "object", - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "vars" - ] - } - } - }, - "links": { - "type": "object", - "properties": { - "related": { - "type": "string" - } - } - } - } + "$ref": "#/components/schemas/vars-has-one" } } }, @@ -27151,6 +27473,18 @@ } } }, + "projects-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/projects-identifier" + } + } + } + }, "provider-sets": { "type": "object", "properties": { @@ -27206,68 +27540,13 @@ "type": "object", "properties": { "organization": { - "type": "object", - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "organizations" - ] - } - } - } - } + "$ref": "#/components/schemas/organizations-has-one" }, "workspaces": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "workspaces" - ] - } - } - } - } - } + "$ref": "#/components/schemas/workspaces-has-many" }, "projects": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "projects" - ] - } - } - } - } - } + "$ref": "#/components/schemas/projects-has-many" } } } @@ -27313,6 +27592,65 @@ } } }, + "stacks-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "stacks" + ] + } + } + }, + "stacks-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/stacks-identifier" + } + } + } + }, + "varset-parent-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "organizations", + "projects" + ] + } + } + }, + "varset-parent-has-one": { + "type": "object", + "properties": { + "data": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/varset-parent-identifier" + } + ], + "nullable": true + } + } + }, "varsets": { "type": "object", "properties": { @@ -27378,24 +27716,7 @@ "type": "object", "properties": { "organization": { - "type": "object", - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "organizations" - ] - } - } - } - } + "$ref": "#/components/schemas/organizations-has-one" }, "vars": { "type": "object", @@ -27439,91 +27760,16 @@ } }, "workspaces": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "workspaces" - ] - } - } - } - } - } + "$ref": "#/components/schemas/workspaces-has-many" }, "projects": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "projects" - ] - } - } - } - } - } + "$ref": "#/components/schemas/projects-has-many" }, "stacks": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "stacks" - ] - } - } - } - } - } + "$ref": "#/components/schemas/stacks-has-many" }, "parent": { - "type": "object", - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "organizations", - "projects" - ] - } - } - } - } + "$ref": "#/components/schemas/varset-parent-has-one" } } } @@ -27800,6 +28046,64 @@ } } }, + "hyok-encrypted-data-keys-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "hyok-encrypted-data-keys" + ] + } + } + }, + "hyok-encrypted-data-keys-has-one": { + "type": "object", + "properties": { + "data": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/hyok-encrypted-data-keys-identifier" + } + ], + "nullable": true + } + } + }, + "state-version-outputs-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "state-version-outputs" + ] + } + } + }, + "state-version-outputs-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/state-version-outputs-identifier" + } + } + } + }, "state-versions": { "type": "object", "required": [ @@ -27988,128 +28292,32 @@ "type": "object", "properties": { "run": { - "$ref": "./stub/runs-id.yml" + "$ref": "#/components/schemas/runs-has-one" }, "rollback-state-version": { - "type": "object", - "required": [ - "data" - ], - "properties": { - "data": { - "type": "object", - "nullable": true, - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "state-versions" - ] - } - } - } - } + "$ref": "#/components/schemas/state-versions-has-one" }, "next-state-version": { - "type": "object", - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "state-versions" - ] - } - } - } - } + "$ref": "#/components/schemas/state-versions-has-one" }, "previous-state-version": { - "type": "object", - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "state-versions" - ] - } - } - } - } + "$ref": "#/components/schemas/state-versions-has-one" }, "created-by": { - "$ref": "./stub/users-id.yml" + "$ref": "#/components/schemas/users-has-one" }, "workspace": { - "$ref": "./stub/workspaces-id.yml" + "$ref": "#/components/schemas/workspaces-has-one" }, "hyok-encrypted-data-key": { - "type": "object", - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "hyok-encrypted-data-keys" - ] - } - } - } - } + "$ref": "#/components/schemas/hyok-encrypted-data-keys-has-one" }, "outputs": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "state-version-outputs" - ] - } - } - } - }, - "links": { - "$ref": "./related.yml" - } - } - }, - "links": null - }, + "$ref": "#/components/schemas/state-version-outputs-has-many" + } + } + }, + "links": { "$ref": "#/components/schemas/self" } } @@ -28131,6 +28339,36 @@ } } }, + "assessment-source-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "assessments", + "plans" + ] + } + } + }, + "assessment-source-has-one": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/assessment-source-identifier" + }, + "links": { + "$ref": "#/components/schemas/related" + } + } + }, "assessment-results": { "type": "object", "required": [ @@ -28210,54 +28448,12 @@ "type": "object", "properties": { "workspace": { - "type": "object", "description": "The workspace this assessment result belongs to", - "properties": { - "data": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "workspaces" - ] - } - } - } - } + "$ref": "#/components/schemas/workspaces-has-one" }, "source": { - "type": "object", "description": "The source assessment or plan that produced this result.", - "properties": { - "data": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string", - "example": "asmt-8F5JFydVYAmtTjET" - }, - "type": { - "type": "string", - "enum": [ - "assessments", - "plans" - ] - } - } - } - } + "$ref": "#/components/schemas/assessment-source-has-one" } } }, @@ -28305,179 +28501,214 @@ } } }, - "applies-id": { + "applies-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "applies" + ] + } + } + }, + "applies-has-one": { "type": "object", "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "applies" - ] - } - } + "$ref": "#/components/schemas/applies-identifier" }, "links": { "$ref": "#/components/schemas/related" } } }, - "cost-estimates-id": { + "cost-estimates-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "cost-estimates" + ] + } + } + }, + "cost-estimates-has-one": { "type": "object", "properties": { "data": { "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "cost-estimates" - ] + "allOf": [ + { + "$ref": "#/components/schemas/cost-estimates-identifier" } - } + ], + "nullable": true }, "links": { "$ref": "#/components/schemas/related" } } }, - "plans-id": { + "plans-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "plans" + ] + } + } + }, + "plans-has-one": { "type": "object", "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "plans" - ] - } - } + "$ref": "#/components/schemas/plans-identifier" }, "links": { "$ref": "#/components/schemas/related" } } }, - "run-events-id": { + "run-events-identifier": { "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "run-events" + ] + } + } + }, + "run-events-has-many": { + "type": "object", + "nullable": true, "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "run-events" - ] - } + "type": "array", + "items": { + "$ref": "#/components/schemas/run-events-identifier" } + } + } + }, + "task-stages-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" }, - "links": { - "$ref": "#/components/schemas/related" + "type": { + "type": "string", + "enum": [ + "task-stages" + ] } } }, - "task-stages-id": { + "task-stages-has-many": { "type": "object", + "nullable": true, "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "task-stages" - ] - } + "type": "array", + "items": { + "$ref": "#/components/schemas/task-stages-identifier" } + } + } + }, + "policy-checks-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" }, - "links": { - "$ref": "#/components/schemas/related" + "type": { + "type": "string", + "enum": [ + "policy-checks" + ] } } }, - "policy-checks-id": { + "policy-checks-has-many": { "type": "object", + "nullable": true, "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "policy-checks" - ] - } + "type": "array", + "items": { + "$ref": "#/components/schemas/policy-checks-identifier" } + } + } + }, + "workspace-comments-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" }, - "links": { - "$ref": "#/components/schemas/related" + "type": { + "type": "string", + "enum": [ + "workspace-comments" + ] } } }, - "comments-id": { + "workspace-comments-has-many": { "type": "object", + "nullable": true, "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "workspace-comments" - ] - } + "type": "array", + "items": { + "$ref": "#/components/schemas/workspace-comments-identifier" } + } + } + }, + "tf-policy-evaluations-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" }, - "links": { - "$ref": "#/components/schemas/related" + "type": { + "type": "string", + "enum": [ + "tf-policy-evaluations" + ] } } }, - "tf-policy-evaluations-id": { + "tf-policy-evaluations-has-many": { "type": "object", + "nullable": true, "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "tf-policy-evaluations" - ] - } + "type": "array", + "items": { + "$ref": "#/components/schemas/tf-policy-evaluations-identifier" } - }, - "links": { - "$ref": "#/components/schemas/related" } } }, @@ -28846,95 +29077,55 @@ "type": "object", "properties": { "workspace": { - "$ref": "#/components/schemas/workspaces-id" + "$ref": "#/components/schemas/workspaces-has-one" }, "triggering-source": { - "$ref": "#/components/schemas/workspaces-id" + "$ref": "#/components/schemas/workspaces-has-one" }, "triggering-run": { - "$ref": "#/components/schemas/runs-id" + "$ref": "#/components/schemas/runs-has-one" }, "apply": { - "$ref": "#/components/schemas/applies-id" + "$ref": "#/components/schemas/applies-has-one" }, "canceled-by": { - "$ref": "#/components/schemas/users-id" + "$ref": "#/components/schemas/users-has-one" }, "configuration-version": { - "$ref": "#/components/schemas/configuration-versions-id" + "$ref": "#/components/schemas/configuration-versions-has-one" }, "confirmed-by": { - "$ref": "#/components/schemas/users-id" + "$ref": "#/components/schemas/users-has-one" }, "cost-estimate": { - "$ref": "#/components/schemas/cost-estimates-id" + "$ref": "#/components/schemas/cost-estimates-has-one" }, "created-by": { - "$ref": "#/components/schemas/users-id" + "$ref": "#/components/schemas/users-has-one" }, "plan": { - "$ref": "#/components/schemas/plans-id" + "$ref": "#/components/schemas/plans-has-one" }, "run-events": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/run-events-id" - } - } - } + "$ref": "#/components/schemas/run-events-has-many" }, "task-stages": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/task-stages-id" - } - } - } + "$ref": "#/components/schemas/task-stages-has-many" }, "policy-checks": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/policy-checks-id" - } - } - } + "$ref": "#/components/schemas/policy-checks-has-many" }, "run-trigger-snapshots": { - "$ref": "#/components/schemas/related" + "$ref": "#/components/schemas/links_related" }, "comments": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/comments-id" - } - } - } + "$ref": "#/components/schemas/workspace-comments-has-many" }, "tf-policy-evaluations": { - "type": "object", "x-vis": [ "public-beta" ], - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/tf-policy-evaluations-id" - } - } - }, + "$ref": "#/components/schemas/tf-policy-evaluations-has-many", "description": "This relationship is considered BETA, is SUBJECT TO CHANGE, and may be unavailable to some users." } } @@ -28952,23 +29143,31 @@ } } }, - "ingress-attributes-id": { + "ingress-attributes-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "ingress-attributes" + ] + } + } + }, + "ingress-attributes-has-one": { "type": "object", "properties": { "data": { - "nullable": true, "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "ingress-attributes" - ] + "allOf": [ + { + "$ref": "#/components/schemas/ingress-attributes-identifier" } - } + ], + "nullable": true }, "links": { "$ref": "#/components/schemas/related" @@ -29079,7 +29278,7 @@ "type": "object", "properties": { "ingress-attributes": { - "$ref": "#/components/schemas/ingress-attributes-id" + "$ref": "#/components/schemas/ingress-attributes-has-one" } } }, @@ -29107,6 +29306,17 @@ } } }, + "run-events-has-one": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/run-events-identifier" + }, + "links": { + "$ref": "#/components/schemas/related" + } + } + }, "comments": { "type": "object", "required": [ @@ -29136,7 +29346,7 @@ "type": "object", "properties": { "run-event": { - "$ref": "#/components/schemas/run-events-id" + "$ref": "#/components/schemas/run-events-has-one" } } } @@ -29199,10 +29409,10 @@ "type": "object", "properties": { "workspace": { - "$ref": "#/components/schemas/workspaces-id" + "$ref": "#/components/schemas/workspaces-has-one" }, "sourceable": { - "$ref": "#/components/schemas/workspaces-id" + "$ref": "#/components/schemas/workspaces-has-one" } } }, @@ -29241,6 +29451,44 @@ } } }, + "state-versions-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/state-versions-identifier" + } + } + } + }, + "plan-exports-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "plan-exports" + ] + } + } + }, + "plan-exports-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/plan-exports-identifier" + } + } + } + }, "plans": { "type": "object", "required": [ @@ -29417,87 +29665,19 @@ "type": "object", "properties": { "state-versions": { - "type": "object", "description": "State versions associated with this plan (for TF <= 0.8)", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "state-versions" - ] - } - } - } - } - } + "$ref": "#/components/schemas/state-versions-has-many" }, "exports": { - "type": "object", "description": "Exports associated with this plan", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "plan-exports" - ] - } - } - } - } - } + "$ref": "#/components/schemas/plan-exports-has-many" }, "hyok-encrypted-data-key": { - "type": "object", "description": "HYOK encrypted data key associated with this plan\n\nThis relationship is only available in HCP Terraform.", - "nullable": true, "x-vis": [ "hcpt" ], - "properties": { - "data": { - "type": "object", - "nullable": true, - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "hyok-encrypted-data-keys" - ] - } - } - } - } + "$ref": "#/components/schemas/hyok-encrypted-data-keys-has-one" } } }, @@ -29546,25 +29726,29 @@ } } }, - "policy-sets-id": { + "policy-sets-identifier": { "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "policy-sets" + ] + } + } + }, + "policy-sets-has-many": { + "type": "object", + "nullable": true, "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "policy-sets" - ] - } + "type": "array", + "items": { + "$ref": "#/components/schemas/policy-sets-identifier" } - }, - "links": { - "$ref": "#/components/schemas/related" } } }, @@ -29652,18 +29836,10 @@ "type": "object", "properties": { "organization": { - "$ref": "#/components/schemas/organizations-id" + "$ref": "#/components/schemas/organizations-has-one" }, "policy-sets": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/policy-sets-id" - } - } - } + "$ref": "#/components/schemas/policy-sets-has-many" } } } @@ -29813,7 +29989,7 @@ "type": "object", "properties": { "run": { - "$ref": "#/components/schemas/runs-id" + "$ref": "#/components/schemas/runs-has-one" } } }, @@ -29845,6 +30021,32 @@ } } }, + "tf-policy-set-outcomes-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "tf-policy-set-outcomes" + ] + } + } + }, + "tf-policy-set-outcomes-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/tf-policy-set-outcomes-identifier" + } + } + } + }, "tf-policy-evaluation": { "type": "object", "description": "Represents a Terraform Policy evaluation for a run. Coordinates the evaluation of multiple policy sets and aggregates their results. Each evaluation is associated with a specific stage (Setup or Plan or Apply) in the run lifecycle.", @@ -30038,59 +30240,12 @@ "type": "object", "properties": { "run": { - "type": "object", "description": "The run that this policy evaluation belongs to", - "properties": { - "data": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The run's external ID" - }, - "type": { - "type": "string", - "enum": [ - "runs" - ] - } - } - } - } + "$ref": "#/components/schemas/runs-has-one" }, "tf-policy-set-outcomes": { - "type": "object", "description": "The Terraform policy set outcomes that are part of this evaluation", - "properties": { - "data": { - "type": "array", - "description": "List of Terraform policy set outcome resource identifiers", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The Terraform policy set outcome's external ID" - }, - "type": { - "type": "string", - "enum": [ - "tf-policy-set-outcomes" - ] - } - } - } - }, - "links": { - "type": "object", - "properties": { - "related": { - "type": "string", - "description": "URL to fetch the related Terraform policy set outcomes" - } - } - } - } + "$ref": "#/components/schemas/tf-policy-set-outcomes-has-many" } } }, @@ -30115,6 +30270,17 @@ } } }, + "tf-policy-evaluations-has-one": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/tf-policy-evaluations-identifier" + }, + "links": { + "$ref": "#/components/schemas/related" + } + } + }, "tf-policy-set-outcome": { "type": "object", "description": "Represents the outcome of evaluating a Terraform Policy set against resources in a run. Contains detailed diagnostics organized by policy and enforce block, including information about resources that passed or failed policy evaluation.", @@ -30333,23 +30499,7 @@ "type": "object", "properties": { "tf-policy-evaluation": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "tf-policy-evaluations" - ] - } - } - } - } + "$ref": "#/components/schemas/tf-policy-evaluations-has-one" } } } @@ -30366,48 +30516,60 @@ } } }, - "policy-set-versions-id": { + "policy-set-versions-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "policy-set-versions" + ] + } + } + }, + "policy-set-versions-has-one": { "type": "object", "properties": { "data": { "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "policy-set-versions" - ] + "allOf": [ + { + "$ref": "#/components/schemas/policy-set-versions-identifier" } - } + ], + "nullable": true }, "links": { "$ref": "#/components/schemas/related" } } }, - "policies-id": { + "policies-identifier": { "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "policies" + ] + } + } + }, + "policies-has-many": { + "type": "object", + "nullable": true, "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "policies" - ] - } + "type": "array", + "items": { + "$ref": "#/components/schemas/policies-identifier" } - }, - "links": { - "$ref": "#/components/schemas/related" } } }, @@ -30580,68 +30742,28 @@ "type": "object", "properties": { "organization": { - "$ref": "#/components/schemas/organizations-id" + "$ref": "#/components/schemas/organizations-has-one" }, "current-version": { - "$ref": "#/components/schemas/policy-set-versions-id" + "$ref": "#/components/schemas/policy-set-versions-has-one" }, "newest-version": { - "$ref": "#/components/schemas/policy-set-versions-id" + "$ref": "#/components/schemas/policy-set-versions-has-one" }, "policies": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/policies-id" - } - } - } + "$ref": "#/components/schemas/policies-has-many" }, "workspaces": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/workspaces-id" - } - } - } + "$ref": "#/components/schemas/workspaces-has-many" }, "projects": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/projects-id" - } - } - } + "$ref": "#/components/schemas/projects-has-many" }, "workspace-exclusions": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/workspaces-id" - } - } - } + "$ref": "#/components/schemas/workspaces-has-many" }, "project-exclusions": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/projects-id" - } - } - } + "$ref": "#/components/schemas/projects-has-many" } } }, @@ -30695,6 +30817,17 @@ } } }, + "policy-sets-has-one": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/policy-sets-identifier" + }, + "links": { + "$ref": "#/components/schemas/related" + } + } + }, "policy-set-versions": { "type": "object", "required": [ @@ -30797,7 +30930,7 @@ "type": "object", "properties": { "policy-set": { - "$ref": "#/components/schemas/policy-sets-id" + "$ref": "#/components/schemas/policy-sets-has-one" } } }, @@ -30826,6 +30959,43 @@ } } }, + "task-stages-has-one": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/task-stages-identifier" + }, + "links": { + "$ref": "#/components/schemas/related" + } + } + }, + "policy-set-outcomes-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "policy-set-outcomes" + ] + } + } + }, + "policy-set-outcomes-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/policy-set-outcomes-identifier" + } + } + } + }, "policy-evaluations": { "type": "object", "required": [ @@ -30945,53 +31115,10 @@ "type": "object", "properties": { "policy-attachable": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "task-stages" - ] - } - } - } - } + "$ref": "#/components/schemas/task-stages-has-one" }, "policy-set-outcomes": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "policy-set-outcomes" - ] - } - } - } - }, - "links": { - "type": "object", - "properties": { - "related": { - "type": "string" - } - } - } - } + "$ref": "#/components/schemas/policy-set-outcomes-has-many" } } }, @@ -31016,22 +31143,25 @@ } } }, - "policy-evaluations-id": { + "policy-evaluations-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "policy-evaluations" + ] + } + } + }, + "policy-evaluations-has-one": { "type": "object", "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "policy-evaluations" - ] - } - } + "$ref": "#/components/schemas/policy-evaluations-identifier" }, "links": { "$ref": "#/components/schemas/related" @@ -31136,7 +31266,7 @@ "type": "object", "properties": { "policy-evaluation": { - "$ref": "#/components/schemas/policy-evaluations-id" + "$ref": "#/components/schemas/policy-evaluations-has-one" } } } @@ -31235,7 +31365,7 @@ "type": "object", "properties": { "plan": { - "$ref": "#/components/schemas/plans-id" + "$ref": "#/components/schemas/plans-has-one" } } }, @@ -31264,24 +31394,6 @@ } } }, - "state-versions-id": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "state-versions" - ] - } - } - }, "applies": { "type": "object", "properties": { @@ -31415,15 +31527,7 @@ "type": "object", "properties": { "state-versions": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/state-versions-id" - } - } - } + "$ref": "#/components/schemas/state-versions-has-many" } } }, @@ -31633,26 +31737,54 @@ } } }, - "hyok-customer-key-versions-id": { + "hyok-customer-key-versions-identifier": { "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "hyok-customer-key-versions" + ] + } + } + }, + "hyok-customer-key-versions-has-many": { + "type": "object", + "nullable": true, "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "hyok-customer-key-versions" - ] - } + "type": "array", + "items": { + "$ref": "#/components/schemas/hyok-customer-key-versions-identifier" } } } }, - "oidc-configurations-id": { + "oidc-configurations-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "aws-oidc-configurations", + "azure-oidc-configurations", + "gcp-oidc-configurations", + "vault-oidc-configurations" + ] + } + } + }, + "oidc-configurations-has-one": { "type": "object", "nullable": true, "required": [ @@ -31661,25 +31793,12 @@ "properties": { "data": { "type": "object", - "nullable": true, - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "aws-oidc-configurations", - "azure-oidc-configurations", - "gcp-oidc-configurations", - "vault-oidc-configurations" - ] + "allOf": [ + { + "$ref": "#/components/schemas/oidc-configurations-identifier" } - } + ], + "nullable": true } } }, @@ -31712,6 +31831,24 @@ "primary": { "type": "boolean" }, + "status": { + "type": "string", + "readOnly": true, + "enum": [ + "untested", + "testing", + "test_failed", + "available", + "errored", + "revoking", + "revoked" + ] + }, + "error": { + "type": "string", + "readOnly": true, + "nullable": true + }, "kms-options": { "type": "object", "nullable": true, @@ -31727,6 +31864,10 @@ "key-ring-id": { "type": "string", "description": "Only required with GCP KMS" + }, + "multi-region": { + "type": "boolean", + "description": "Optional for AWS KMS" } } } @@ -31736,47 +31877,16 @@ "type": "object", "properties": { "organization": { - "readOnly": true, - "$ref": "#/components/schemas/organizations-id" + "$ref": "#/components/schemas/organizations-has-one" }, "agent-pool": { - "$ref": "#/components/schemas/agent-pools-id" + "$ref": "#/components/schemas/agent-pools-has-one" }, "hyok-customer-key-versions": { - "readOnly": true, - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/hyok-customer-key-versions-id" - } - } - } + "$ref": "#/components/schemas/hyok-customer-key-versions-has-many" }, "oidc-configuration": { - "readOnly": true, - "$ref": "#/components/schemas/oidc-configurations-id", - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "aws-oidc-configurations", - "gcp-oidc-configurations", - "azure-oidc-configurations", - "vault-oidc-configurations" - ] - } - } - } - } + "$ref": "#/components/schemas/oidc-configurations-has-one" } } } @@ -31828,7 +31938,7 @@ "type": "object", "properties": { "organization": { - "$ref": "#/components/schemas/organizations-id" + "$ref": "#/components/schemas/organizations-has-one" } } } @@ -31884,7 +31994,7 @@ "type": "object", "properties": { "organization": { - "$ref": "#/components/schemas/organizations-id" + "$ref": "#/components/schemas/organizations-has-one" } } } @@ -31928,7 +32038,7 @@ "type": "object", "properties": { "organization": { - "$ref": "#/components/schemas/organizations-id" + "$ref": "#/components/schemas/organizations-has-one" } } } @@ -31975,7 +32085,7 @@ "type": "object", "properties": { "organization": { - "$ref": "#/components/schemas/organizations-id" + "$ref": "#/components/schemas/organizations-has-one" } } } @@ -32059,8 +32169,7 @@ "type": "object", "properties": { "hyok-configuration": { - "readOnly": true, - "$ref": "#/components/schemas/hyok-configurations-id" + "$ref": "#/components/schemas/hyok-configurations-has-one" } } } @@ -32077,6 +32186,14 @@ } } }, + "hyok-customer-key-versions-has-one": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/hyok-customer-key-versions-identifier" + } + } + }, "hyok-encrypted-data-keys": { "type": "object", "required": [ @@ -32116,8 +32233,7 @@ "type": "object", "properties": { "hyok-customer-key-version": { - "readOnly": true, - "$ref": "#/components/schemas/hyok-customer-key-versions-id" + "$ref": "#/components/schemas/hyok-customer-key-versions-has-one" } } } @@ -32134,6 +32250,54 @@ } } }, + "teams-nullable-has-one": { + "type": "object", + "properties": { + "data": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/teams-identifier" + } + ], + "nullable": true + } + } + }, + "auth-token-created-by-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "users", + "organizations", + "teams" + ] + } + } + }, + "auth-token-created-by-has-one": { + "type": "object", + "properties": { + "data": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/auth-token-created-by-identifier" + } + ], + "nullable": true + } + } + }, "authentication-tokens": { "type": "object", "required": [ @@ -32185,36 +32349,10 @@ "type": "object", "properties": { "team": { - "$ref": "#/components/schemas/links_related", - "properties": { - "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string" - } - } - } - } + "$ref": "#/components/schemas/teams-nullable-has-one" }, "created-by": { - "$ref": "#/components/schemas/links_related", - "properties": { - "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string" - } - } - } - } + "$ref": "#/components/schemas/auth-token-created-by-has-one" } } } @@ -32266,26 +32404,7 @@ "type": "object", "properties": { "user": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "users" - ] - } - } - }, - "links": { - "$ref": "#/components/schemas/related" - } - } + "$ref": "#/components/schemas/users-has-one" } } } @@ -32360,22 +32479,11 @@ } } }, - "teams-id": { + "teams-has-one": { "type": "object", "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "teams" - ] - } - } + "$ref": "#/components/schemas/teams-identifier" }, "links": { "$ref": "#/components/schemas/related" @@ -32517,10 +32625,10 @@ "type": "object", "properties": { "team": { - "$ref": "#/components/schemas/teams-id" + "$ref": "#/components/schemas/teams-has-one" }, "project": { - "$ref": "#/components/schemas/projects-id" + "$ref": "#/components/schemas/projects-has-one" } } }, @@ -32633,10 +32741,10 @@ "type": "object", "properties": { "team": { - "$ref": "#/components/schemas/teams-id" + "$ref": "#/components/schemas/teams-has-one" }, "workspace": { - "$ref": "#/components/schemas/workspaces-id" + "$ref": "#/components/schemas/workspaces-has-one" } } }, @@ -32860,7 +32968,7 @@ "type": "object", "properties": { "created-by": { - "$ref": "#/components/schemas/users-id" + "$ref": "#/components/schemas/users-has-one" } } }, @@ -32869,46 +32977,62 @@ } } }, - "oauth-clients-id": { + "oauth-clients-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "oauth-clients" + ] + } + } + }, + "oauth-clients-has-one": { "type": "object", "properties": { "data": { "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "oauth-clients" - ] + "allOf": [ + { + "$ref": "#/components/schemas/oauth-clients-identifier" } - } + ], + "nullable": true }, "links": { "$ref": "#/components/schemas/related" } } }, - "oauth-tokens-id": { + "oauth-tokens-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "oauth-tokens" + ] + } + } + }, + "oauth-tokens-has-one": { "type": "object", "properties": { "data": { "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "oauth-tokens" - ] + "allOf": [ + { + "$ref": "#/components/schemas/oauth-tokens-identifier" } - } + ], + "nullable": true }, "links": { "$ref": "#/components/schemas/related" @@ -32960,10 +33084,10 @@ "type": "object", "properties": { "oauth-client": { - "$ref": "#/components/schemas/oauth-clients-id" + "$ref": "#/components/schemas/oauth-clients-has-one" }, "oauth-token": { - "$ref": "#/components/schemas/oauth-tokens-id" + "$ref": "#/components/schemas/oauth-tokens-has-one" } } } @@ -33244,42 +33368,53 @@ } } }, - "test-runs-id": { + "test-runs-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "test-runs" + ] + } + } + }, + "test-runs-has-one": { "type": "object", "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "test-runs" - ] - } - } + "$ref": "#/components/schemas/test-runs-identifier" + } + } + }, + "test-run-cleanups-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "test-run-cleanups" + ] } } }, - "test-run-cleanups-id": { + "test-run-cleanups-has-one": { "type": "object", "properties": { "data": { "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "test-run-cleanups" - ] + "allOf": [ + { + "$ref": "#/components/schemas/test-run-cleanups-identifier" } - } + ], + "nullable": true }, "links": { "$ref": "#/components/schemas/related" @@ -33354,13 +33489,13 @@ "type": "object", "properties": { "test-run": { - "$ref": "#/components/schemas/test-runs-id" + "$ref": "#/components/schemas/test-runs-has-one" }, "created-by": { - "$ref": "#/components/schemas/users-id" + "$ref": "#/components/schemas/users-has-one" }, "previous-test-run-cleanup": { - "$ref": "#/components/schemas/test-run-cleanups-id" + "$ref": "#/components/schemas/test-run-cleanups-has-one" } } } @@ -33486,53 +33621,13 @@ "type": "object", "properties": { "workspace": { - "$ref": "#/components/schemas/workspaces-id" + "$ref": "#/components/schemas/workspaces-has-one" }, "created-by": { - "type": "object", - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "users" - ] - } - } - }, - "links": { - "$ref": "#/components/schemas/related" - } - } + "$ref": "#/components/schemas/users-has-one" }, "archived-by-user": { - "type": "object", - "properties": { - "data": { - "type": "object", - "nullable": true, - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "users" - ] - } - } - }, - "links": { - "$ref": "#/components/schemas/related" - } - } + "$ref": "#/components/schemas/users-has-one" } } } @@ -33549,6 +33644,18 @@ } } }, + "oauth-tokens-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/oauth-tokens-identifier" + } + } + } + }, "oauth-clients": { "type": "object", "required": [ @@ -33648,70 +33755,16 @@ "type": "object", "properties": { "organization": { - "$ref": "#/components/schemas/organizations-id" + "$ref": "#/components/schemas/organizations-has-one" }, "agent-pool": { - "$ref": "#/components/schemas/agent-pools-id" + "$ref": "#/components/schemas/agent-pools-has-one" }, "projects": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "projects" - ] - } - } - } - } - } + "$ref": "#/components/schemas/projects-has-many" }, "oauth-tokens": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "required": [ - "id", - "type" - ], - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "oauth-tokens" - ] - } - } - } - }, - "links": { - "type": "object", - "properties": { - "related": { - "type": "string" - } - } - } - } + "$ref": "#/components/schemas/oauth-tokens-has-many" } } } @@ -33777,7 +33830,7 @@ "type": "object", "properties": { "oauth-client": { - "$ref": "#/components/schemas/oauth-clients-id" + "$ref": "#/components/schemas/oauth-clients-has-one" }, "vcs-organizations": { "$ref": "#/components/schemas/links_related" @@ -33831,7 +33884,7 @@ "type": "object", "properties": { "oauth-token": { - "$ref": "#/components/schemas/oauth-tokens-id" + "$ref": "#/components/schemas/oauth-tokens-has-one" } } } @@ -33960,7 +34013,7 @@ } } }, - "workspace-tasks-id": { + "workspace-tasks-identifier": { "type": "object", "properties": { "id": { @@ -33974,6 +34027,53 @@ } } }, + "workspace-tasks-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/workspace-tasks-identifier" + } + } + } + }, + "integrations-identifier": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "integrations" + ] + } + } + }, + "integrations-has-one": { + "type": "object", + "properties": { + "data": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/integrations-identifier" + } + ], + "nullable": true + }, + "links": { + "$ref": "#/components/schemas/related" + } + } + }, "tasks": { "type": "object", "required": [ @@ -34014,6 +34114,11 @@ "enabled": { "type": "boolean" }, + "params": { + "type": "object", + "additionalProperties": true, + "nullable": true + }, "created-at": { "type": "string", "format": "date-time", @@ -34048,21 +34153,16 @@ "type": "object", "properties": { "organization": { - "$ref": "#/components/schemas/organizations-id" + "$ref": "#/components/schemas/organizations-has-one" }, "workspace-tasks": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/workspace-tasks-id" - } - } - } + "$ref": "#/components/schemas/workspace-tasks-has-many" }, "agent-pool": { - "$ref": "#/components/schemas/agent-pools-id" + "$ref": "#/components/schemas/agent-pools-has-one" + }, + "integration": { + "$ref": "#/components/schemas/integrations-has-one" } } }, @@ -34082,22 +34182,25 @@ } } }, - "tasks-id": { + "tasks-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "tasks" + ] + } + } + }, + "tasks-has-one": { "type": "object", "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "tasks" - ] - } - } + "$ref": "#/components/schemas/tasks-identifier" }, "links": { "$ref": "#/components/schemas/related" @@ -34157,10 +34260,10 @@ "type": "object", "properties": { "task": { - "$ref": "#/components/schemas/tasks-id" + "$ref": "#/components/schemas/tasks-has-one" }, "workspace": { - "$ref": "#/components/schemas/workspaces-id" + "$ref": "#/components/schemas/workspaces-has-one" } } }, @@ -34180,25 +34283,41 @@ } } }, - "task-results-id": { + "task-results-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "task-results" + ] + } + } + }, + "task-results-has-many": { "type": "object", + "nullable": true, "properties": { "data": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "task-results" - ] - } + "type": "array", + "items": { + "$ref": "#/components/schemas/task-results-identifier" + } + } + } + }, + "policy-evaluations-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/policy-evaluations-identifier" } - }, - "links": { - "$ref": "#/components/schemas/related" } } }, @@ -34284,52 +34403,16 @@ "type": "object", "properties": { "run": { - "$ref": "#/components/schemas/runs-id" + "$ref": "#/components/schemas/runs-has-one" }, "cost-estimate": { - "type": "object", - "properties": { - "data": { - "nullable": true, - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "cost-estimates" - ] - } - } - }, - "links": { - "$ref": "#/components/schemas/related" - } - } + "$ref": "#/components/schemas/cost-estimates-has-one" }, "task-results": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/task-results-id" - } - } - } + "$ref": "#/components/schemas/task-results-has-many" }, "policy-evaluations": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/policy-evaluations-id" - } - } - } + "$ref": "#/components/schemas/policy-evaluations-has-many" } } }, @@ -34463,7 +34546,7 @@ "type": "object", "properties": { "task-stage": { - "$ref": "#/components/schemas/task-stages-id" + "$ref": "#/components/schemas/task-stages-has-one" }, "task-result-outcomes": { "type": "object", @@ -34543,6 +34626,17 @@ } } }, + "task-results-has-one": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/task-results-identifier" + }, + "links": { + "$ref": "#/components/schemas/related" + } + } + }, "task-result-outcomes": { "type": "object", "properties": { @@ -34611,7 +34705,7 @@ "type": "object", "properties": { "task-result": { - "$ref": "#/components/schemas/task-results-id" + "$ref": "#/components/schemas/task-results-has-one" } } }, @@ -34641,6 +34735,32 @@ } } }, + "workspace-transfer-events-identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "workspace-transfer-events" + ] + } + } + }, + "workspace-transfer-events-has-many": { + "type": "object", + "nullable": true, + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/workspace-transfer-events-identifier" + } + } + } + }, "workspace-transfers": { "type": "object", "required": [ @@ -34761,26 +34881,7 @@ "type": "object", "properties": { "events": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "workspace-transfer-events" - ] - } - } - } - } - } + "$ref": "#/components/schemas/workspace-transfer-events-has-many" } } } diff --git a/skills/tfctl/known_release_hashes b/skills/tfctl/known_release_hashes index 242830d..d51424e 100644 --- a/skills/tfctl/known_release_hashes +++ b/skills/tfctl/known_release_hashes @@ -3,3 +3,4 @@ # each release of tfctl. 4a3a72856d49a4de32b7b1f6a379918a956d3931f8a7ff71c06a1e3e4bd3e34f v0.3.0 01386dc8dbf4d2cf1b3ea027cd0b2ad3c4dfbbdb3701b75e19937352ddc35b96 v0.4.0-beta +5bdee5f7f47d9e77ffa8f1835f936235b4fa9dac5c864d01feb2b59613c5c05f v0.4.0 diff --git a/version/VERSION b/version/VERSION index 578dca3..1d0ba9e 100644 --- a/version/VERSION +++ b/version/VERSION @@ -1 +1 @@ -0.4.0-beta +0.4.0 From 4e252f85db7f3968b9539c988e10fe89c37af0c5 Mon Sep 17 00:00:00 2001 From: Brandon Croft Date: Thu, 30 Jul 2026 17:20:19 -0600 Subject: [PATCH 2/6] Update CHANGELOG.md --- CHANGELOG.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 413e492..75e7aae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,14 @@ NEW FEATURES: * Adds the `harness exec` command, which lets a human grant session-scoped, noninteractive `tfctl` delete permissions to a wrapped command (such as a coding agent) via `--allow-delete`. The grant is tied to all subprocesses. +NOTES: + +* Running tfctl automatically updates outdated tfctl skills that it installed unless they were modified. + ENHANCEMENTS: * Running tfctl, tfctl version, or tfctl --version checks whether there is a newer version of tfctl available and whether `auth login` needs to be run. -* tfctl now detects outdated skills it installed and migrates them to the latest version. - * Adds a `--plan-only` flag to `run start` that creates a speculative plan-only run which is never applied, regardless of the workspace's auto-apply setting. * Positional arguments and API path parameters are now checked for basic input hygiene, rejecting control characters and invalid UTF-8. This keeps malformed values out of requests and out of terminal/audit output. This is not a security boundary; authorization is still enforced by your API token. @@ -38,9 +40,9 @@ BUG FIXES: * Using the `--quiet` argument no longer suppresses api command rendering for GET requests. -NOTES: +DEVELOPER NOTES: -* For developers of tfctl, added CONTRIBUTING.md, AGENTS.md, developer setup automation, and `make help` +* Added CONTRIBUTING.md, AGENTS.md, developer setup automation, and `make help` to simplify getting started with tfctl development. ## v0.3.0 (June 22, 2026) From f052d2e2ab2409f9884b1267864b15a64673fdb2 Mon Sep 17 00:00:00 2001 From: Brandon Croft Date: Thu, 30 Jul 2026 17:22:06 -0600 Subject: [PATCH 3/6] update .changes/v0.4.0.md --- .changes/v0.4.0.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.changes/v0.4.0.md b/.changes/v0.4.0.md index 022c161..fc3e03e 100644 --- a/.changes/v0.4.0.md +++ b/.changes/v0.4.0.md @@ -4,12 +4,14 @@ NEW FEATURES: * Adds the `harness exec` command, which lets a human grant session-scoped, noninteractive `tfctl` delete permissions to a wrapped command (such as a coding agent) via `--allow-delete`. The grant is tied to all subprocesses. +NOTES: + +* Running tfctl automatically updates outdated tfctl skills that it installed unless they were modified. + ENHANCEMENTS: * Running tfctl, tfctl version, or tfctl --version checks whether there is a newer version of tfctl available and whether `auth login` needs to be run. -* tfctl now detects outdated skills it installed and migrates them to the latest version. - * Adds a `--plan-only` flag to `run start` that creates a speculative plan-only run which is never applied, regardless of the workspace's auto-apply setting. * Positional arguments and API path parameters are now checked for basic input hygiene, rejecting control characters and invalid UTF-8. This keeps malformed values out of requests and out of terminal/audit output. This is not a security boundary; authorization is still enforced by your API token. @@ -36,4 +38,8 @@ BUG FIXES: * Redacts customer data within HTTP paths in telemetry payloads, such as organization and workspace names. -* Using the `--quiet` argument no longer suppresses api command rendering for GET requests. \ No newline at end of file +* Using the `--quiet` argument no longer suppresses api command rendering for GET requests. + +DEVELOPER NOTES: + +* Added CONTRIBUTING.md, AGENTS.md, developer setup automation, and `make help` to simplify getting started with tfctl development. \ No newline at end of file From 5c65a6e830c563491d05b7da61c7773580b6805d Mon Sep 17 00:00:00 2001 From: Brandon Croft Date: Fri, 31 Jul 2026 08:17:48 -0600 Subject: [PATCH 4/6] Lightly revise --allow-delete help text and naming --- internal/commands/harness/harness_exec.go | 10 ++++++---- internal/pkg/execsession/permissions.go | 6 ++++-- internal/pkg/execsession/permissions_test.go | 4 ++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/internal/commands/harness/harness_exec.go b/internal/commands/harness/harness_exec.go index d3ea986..12fcc93 100644 --- a/internal/commands/harness/harness_exec.go +++ b/internal/commands/harness/harness_exec.go @@ -56,12 +56,14 @@ func NewCmdHarnessExec(inv *cmd.Invocation) *cmd.Command { This is a deliberate, per-session opt-in by a human. The permission is tied to the lifetime of this process and {{ Bold "auto-reverts" }} to the safe default (deletes require an interactive confirmation) as soon as the child exits. - This is a {{ Bold "safety rail, not a security boundary" }}: the child runs as the same OS user, so a true guarantee that an agent cannot delete must come from the API token scope server-side. + This is a {{ Bold "safety rail, not a security boundary" }}: the child runs as the same OS user, so a true guarantee that an agent cannot delete must come from the API token permissions set by the server. Use {{ template "mdCodeOrBold" "--allow-delete" }} to name the resource types that may be deleted noninteractively. Only resource types that are explicitly named may be deleted noninteractively. Repeat the flag or pass a comma-separated list. + Some possible values for {{ template "mdCodeOrBold" "--allow-delete" }} are: %s }}. + The child command and its arguments must follow a {{ template "mdCodeOrBold" "--" }} separator. - `, version.Name), + `, version.Name, strings.Join(execsession.DestroyableResourceTypes(), ", ")), Examples: []cmd.Example{ { Preamble: "Allow an agent to delete workspaces and vars for one session:", @@ -100,10 +102,10 @@ func NewCmdHarnessExec(inv *cmd.Invocation) *cmd.Command { { Name: "allow-delete", DisplayValue: "RESOURCE_TYPES", - Description: "Resource types that nested processes may delete noninteractively (repeatable, CSV). Use with caution.", + Description: "Resource types that nested processes may delete noninteractively. May use comma-separated list. Use with caution.", Repeatable: true, Value: flagvalue.SimpleSlice(nil, &execOpts.AllowDelete), - Autocomplete: complete.PredictSet(execsession.AllowDeleteCompletions()...), + Autocomplete: complete.PredictSet(execsession.DestroyableResourceTypes()...), }, }, }, diff --git a/internal/pkg/execsession/permissions.go b/internal/pkg/execsession/permissions.go index 7df009e..9aa98c0 100644 --- a/internal/pkg/execsession/permissions.go +++ b/internal/pkg/execsession/permissions.go @@ -5,14 +5,15 @@ package execsession import ( "fmt" + "slices" "strings" "github.com/hashicorp/tfctl-cli/internal/pkg/resource" ) -// AllowDeleteCompletions returns the suggested values for --allow-delete: every +// DestroyableResourceTypes returns the suggested values for --allow-delete: every // known destroyable resource class. -func AllowDeleteCompletions() []string { +func DestroyableResourceTypes() []string { allResources := resource.All() out := make([]string, 0, len(allResources)) @@ -21,6 +22,7 @@ func AllowDeleteCompletions() []string { out = append(out, r.Type) } } + slices.Sort(out) return out } diff --git a/internal/pkg/execsession/permissions_test.go b/internal/pkg/execsession/permissions_test.go index 665df74..5d4e059 100644 --- a/internal/pkg/execsession/permissions_test.go +++ b/internal/pkg/execsession/permissions_test.go @@ -12,10 +12,10 @@ import ( "github.com/hashicorp/tfctl-cli/internal/pkg/resource" ) -func TestAllowDeleteCompletions(t *testing.T) { +func TestDestroyableResourceTypes(t *testing.T) { t.Parallel() - got := AllowDeleteCompletions() + got := DestroyableResourceTypes() all := resource.AllDestroyable() // Every known class must be offered, including the irreversible ones so a From 36550ae6cd36b24f762e5f256218e6e49055b033 Mon Sep 17 00:00:00 2001 From: Brandon Croft Date: Fri, 31 Jul 2026 08:19:54 -0600 Subject: [PATCH 5/6] Revise CHANGELOG-use simpler text and active voice --- CHANGELOG.md | 62 +++++++++++++++------------------------------------- 1 file changed, 18 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75e7aae..a17df50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,69 +1,43 @@ -## v0.4.0 (July 30, 2026) +## v0.4.0 (July 31, 2026) NEW FEATURES: -* Adds the `harness exec` command, which lets a human grant session-scoped, noninteractive `tfctl` delete permissions to a wrapped command (such as a coding agent) via `--allow-delete`. The grant is tied to all subprocesses. +* This release adds `harness exec`. The command lets a user give noninteractive `tfctl` delete permission to a wrapped command. Use `--allow-delete=resources,other-resources` to give permission to delete those resource types for one session. The permission applies to all subprocesses. -NOTES: - -* Running tfctl automatically updates outdated tfctl skills that it installed unless they were modified. +* tfctl automatically updates outdated tfctl skills that it installed. tfctl does not update modified skills. ENHANCEMENTS: -* Running tfctl, tfctl version, or tfctl --version checks whether there is a newer version of tfctl available and whether `auth login` needs to be run. +* tfctl now checks for a newer release when you run `tfctl`, `tfctl version`, or `tfctl --version`. These commands also tell you when you must run `auth login`. -* Adds a `--plan-only` flag to `run start` that creates a speculative plan-only run which is never applied, regardless of the workspace's auto-apply setting. +* `run start` now has a `--plan-only` flag. The flag creates a speculative plan-only run. You cannot apply this run, regardless of the workspace auto-apply setting. -* Positional arguments and API path parameters are now checked for basic input hygiene, rejecting control characters and invalid UTF-8. This keeps malformed values out of requests and out of terminal/audit output. This is not a security boundary; authorization is still enforced by your API token. +* tfctl now checks positional arguments and API path parameters for control characters and invalid UTF-8. It rejects malformed values before requests, terminal output, and audit output. These checks are not a security boundary. Your API token still controls authorization. -* The config directory can now be overridden with the TFCTL_CONFIG_DIR environment variable. Profiles and exec sessions both resolve against this directory, making it easy to isolate tfctl state (for example, in CI or eval harnesses). +* The `TFCTL_CONFIG_DIR` environment variable can now set the configuration directory. Profiles and exec sessions use the specified directory. Use this variable to isolate tfctl state in continuous integration or test harnesses. BUG FIXES: -* Using `auth login --dry-run` no longer opens a web browser. `--dry-run` now appears in argument autocomplete lists. - -* Using `profile display --markdown` no longer produces an error. - -* Removed Token property from json output when using `profile profiles list --json`, preventing accidental exposure. - -* Don't attempt to retry telemetry transmission on server errors, like rate limiting 429 errors. - -* Detect Terraform's `TF_TOKEN_` environment variables (such as `TF_TOKEN_app_terraform_io`) during authentication, matching Terraform CLI's resolution. This includes punycode hostnames and the interchangeable dash encodings (literal `-` or double underscore). Previously these tokens were not detected. - -* Clarify the not-found (404) API error message to point at verifying the request path and resource IDs instead of suggesting an authentication problem. - -* Fix `api --all` returning no output when the result fits in a single page. The response body was consumed while checking for additional pages and not restored, so single-page responses rendered empty. +* `auth login --dry-run` no longer opens a web browser. Argument completion now includes `--dry-run`. -* Fix `api` `--json` and `--jq` output incorrectly including one-to-one relationship IDs under `attributes`. Those IDs are surfaced for table and pretty output only, and are no longer written back into the raw JSON payload. +* `profile display --markdown` no longer returns an error. -* Redacts customer data within HTTP paths in telemetry payloads, such as organization and workspace names. +* The `profile profiles list --json` output no longer includes the Token property. This change prevents accidental token exposure. -* Using the `--quiet` argument no longer suppresses api command rendering for GET requests. +* tfctl no longer tries to send telemetry again after responses such as the 429 rate-limit response. -DEVELOPER NOTES: +* Authentication now detects Terraform `TF_TOKEN_` environment variables, such as `TF_TOKEN_app_terraform_io`. This behavior matches Terraform CLI token resolution. Detection supports punycode hostnames and both Terraform dash encodings. You can encode each dash as `-` or `__`. tfctl did not previously detect these tokens. -* Added CONTRIBUTING.md, AGENTS.md, developer setup automation, and `make help` to simplify getting started with tfctl development. +* The not-found (404) API error now tells you to verify the request path and resource IDs. It no longer suggests an authentication problem. -## v0.3.0 (June 22, 2026) - -ENHANCEMENTS: - -* The `harness install` command supports shell autocompletion for supported coding agents and support for the Amp coding agent has been added. - -* Adds debug logging for token configuration sources. - -* Hostnames are normalized before storage within profiles. - -* The `api` command now accepts arbitrary URLs, such as Archivist, but does not send tokens to any host except the configured API host. - -BUG FIXES: +* `api --all` now returns output when a result has only one page. Previously, the pagination check read the response body but did not restore it. Thus, the command returned no output. -* Profile configuration files are now created with read/write permissions for owner only. +* `api --json` and `api --jq` no longer put one-to-one relationship IDs in `attributes`. Table and pretty output still show these IDs. Raw JSON output remains unchanged. -* Hostname telemetry is anonymized when configured with a Terraform Enterprise host. +* Telemetry payloads now redact customer data in HTTP paths, such as organization and workspace names. -## v0.2.0 (June 12, 2026) +* `--quiet` no longer suppresses output from `api` GET requests. NOTES: -* tfctl is an agent-first, human-friendly CLI for accessing HCP Terraform and Terraform Enterprise. Future changes will be documented here. For now, see README.md for installation, usage, and a command reference. \ No newline at end of file +* This release adds `CONTRIBUTING.md`, `AGENTS.md`, developer setup automation, and `make help`. These resources make the initial development setup easier. From c1392503e082b4a1c7c36f515ca4d4a01d4143b6 Mon Sep 17 00:00:00 2001 From: Brandon Croft Date: Fri, 31 Jul 2026 08:24:13 -0600 Subject: [PATCH 6/6] Update v0.4.0.md --- .changes/v0.4.0.md | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/.changes/v0.4.0.md b/.changes/v0.4.0.md index fc3e03e..a17df50 100644 --- a/.changes/v0.4.0.md +++ b/.changes/v0.4.0.md @@ -1,45 +1,43 @@ -## v0.4.0 (July 30, 2026) +## v0.4.0 (July 31, 2026) NEW FEATURES: -* Adds the `harness exec` command, which lets a human grant session-scoped, noninteractive `tfctl` delete permissions to a wrapped command (such as a coding agent) via `--allow-delete`. The grant is tied to all subprocesses. +* This release adds `harness exec`. The command lets a user give noninteractive `tfctl` delete permission to a wrapped command. Use `--allow-delete=resources,other-resources` to give permission to delete those resource types for one session. The permission applies to all subprocesses. -NOTES: - -* Running tfctl automatically updates outdated tfctl skills that it installed unless they were modified. +* tfctl automatically updates outdated tfctl skills that it installed. tfctl does not update modified skills. ENHANCEMENTS: -* Running tfctl, tfctl version, or tfctl --version checks whether there is a newer version of tfctl available and whether `auth login` needs to be run. +* tfctl now checks for a newer release when you run `tfctl`, `tfctl version`, or `tfctl --version`. These commands also tell you when you must run `auth login`. -* Adds a `--plan-only` flag to `run start` that creates a speculative plan-only run which is never applied, regardless of the workspace's auto-apply setting. +* `run start` now has a `--plan-only` flag. The flag creates a speculative plan-only run. You cannot apply this run, regardless of the workspace auto-apply setting. -* Positional arguments and API path parameters are now checked for basic input hygiene, rejecting control characters and invalid UTF-8. This keeps malformed values out of requests and out of terminal/audit output. This is not a security boundary; authorization is still enforced by your API token. +* tfctl now checks positional arguments and API path parameters for control characters and invalid UTF-8. It rejects malformed values before requests, terminal output, and audit output. These checks are not a security boundary. Your API token still controls authorization. -* The config directory can now be overridden with the TFCTL_CONFIG_DIR environment variable. Profiles and exec sessions both resolve against this directory, making it easy to isolate tfctl state (for example, in CI or eval harnesses). +* The `TFCTL_CONFIG_DIR` environment variable can now set the configuration directory. Profiles and exec sessions use the specified directory. Use this variable to isolate tfctl state in continuous integration or test harnesses. BUG FIXES: -* Using `auth login --dry-run` no longer opens a web browser. `--dry-run` now appears in argument autocomplete lists. +* `auth login --dry-run` no longer opens a web browser. Argument completion now includes `--dry-run`. -* Using `profile display --markdown` no longer produces an error. +* `profile display --markdown` no longer returns an error. -* Removed Token property from json output when using `profile profiles list --json`, preventing accidental exposure. +* The `profile profiles list --json` output no longer includes the Token property. This change prevents accidental token exposure. -* Don't attempt to retry telemetry transmission on server errors, like rate limiting 429 errors. +* tfctl no longer tries to send telemetry again after responses such as the 429 rate-limit response. -* Detect Terraform's `TF_TOKEN_` environment variables (such as `TF_TOKEN_app_terraform_io`) during authentication, matching Terraform CLI's resolution. This includes punycode hostnames and the interchangeable dash encodings (literal `-` or double underscore). Previously these tokens were not detected. +* Authentication now detects Terraform `TF_TOKEN_` environment variables, such as `TF_TOKEN_app_terraform_io`. This behavior matches Terraform CLI token resolution. Detection supports punycode hostnames and both Terraform dash encodings. You can encode each dash as `-` or `__`. tfctl did not previously detect these tokens. -* Clarify the not-found (404) API error message to point at verifying the request path and resource IDs instead of suggesting an authentication problem. +* The not-found (404) API error now tells you to verify the request path and resource IDs. It no longer suggests an authentication problem. -* Fix `api --all` returning no output when the result fits in a single page. The response body was consumed while checking for additional pages and not restored, so single-page responses rendered empty. +* `api --all` now returns output when a result has only one page. Previously, the pagination check read the response body but did not restore it. Thus, the command returned no output. -* Fix `api` `--json` and `--jq` output incorrectly including one-to-one relationship IDs under `attributes`. Those IDs are surfaced for table and pretty output only, and are no longer written back into the raw JSON payload. +* `api --json` and `api --jq` no longer put one-to-one relationship IDs in `attributes`. Table and pretty output still show these IDs. Raw JSON output remains unchanged. -* Redacts customer data within HTTP paths in telemetry payloads, such as organization and workspace names. +* Telemetry payloads now redact customer data in HTTP paths, such as organization and workspace names. -* Using the `--quiet` argument no longer suppresses api command rendering for GET requests. +* `--quiet` no longer suppresses output from `api` GET requests. -DEVELOPER NOTES: +NOTES: -* Added CONTRIBUTING.md, AGENTS.md, developer setup automation, and `make help` to simplify getting started with tfctl development. \ No newline at end of file +* This release adds `CONTRIBUTING.md`, `AGENTS.md`, developer setup automation, and `make help`. These resources make the initial development setup easier.