From 8bcfedd32b2d84b05186c162b6a3b7d9f7db724e Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Mon, 26 Oct 2026 16:02:41 -0700 Subject: [PATCH 1/2] fix(deps): update zod to 4.6.7 so bounded collections stop walking every element before their size check --- apps/docs/openapi-v2-billing.json | 57 +- apps/docs/openapi-v2-files-audit.json | 199 +--- apps/docs/openapi-v2-knowledge.json | 519 ++-------- apps/docs/openapi-v2-logs.json | 162 +-- apps/docs/openapi-v2-resources.json | 957 ++++-------------- apps/docs/openapi-v2-tables.json | 302 ++---- apps/docs/openapi-v2-workflows.json | 806 +++------------ apps/docs/package.json | 2 +- apps/realtime/package.json | 2 +- apps/sim/lib/api/contracts/logs.ts | 10 +- apps/sim/lib/api/contracts/primitives.test.ts | 32 + apps/sim/lib/api/contracts/primitives.ts | 32 + .../api/contracts/tables-predicate.test.ts | 5 +- .../tools/aws/cloudtrail-lookup-events.ts | 5 +- .../aws/lambda-create-event-source-mapping.ts | 8 +- apps/sim/lib/api/contracts/v2/shared.ts | 10 +- apps/sim/lib/api/contracts/webhooks.ts | 3 +- apps/sim/lib/api/contracts/workspace-files.ts | 3 +- apps/sim/lib/api/mcp/catalog.test.ts | 5 + apps/sim/lib/api/mcp/catalog.ts | 5 +- apps/sim/lib/internal/buffer/input.ts | 5 +- apps/sim/lib/internal/resend/schema.ts | 3 +- apps/sim/lib/internal/sailpoint/schema.ts | 9 +- apps/sim/lib/mothership/chat/post.ts | 3 +- .../mothership/generated/tool-catalog-v1.ts | 8 +- .../mothership/generated/tool-schemas-v1.ts | 8 +- apps/sim/lib/table/analytics/schema.ts | 5 +- apps/sim/lib/table/ttl-values.ts | 6 +- apps/sim/package.json | 2 +- bun.lock | 18 +- package.json | 4 +- packages/desktop-bridge/package.json | 2 +- packages/emcn/package.json | 2 +- packages/realtime-protocol/package.json | 2 +- packages/utils/package.json | 4 + packages/utils/src/json-schema.ts | 48 + scripts/check-openapi-specs.ts | 15 +- scripts/generate-v2-cli-api.ts | 44 +- scripts/openapi/generator.ts | 63 +- 39 files changed, 893 insertions(+), 2482 deletions(-) create mode 100644 packages/utils/src/json-schema.ts diff --git a/apps/docs/openapi-v2-billing.json b/apps/docs/openapi-v2-billing.json index cd41bac2c0c..85ce49b4e65 100644 --- a/apps/docs/openapi-v2-billing.json +++ b/apps/docs/openapi-v2-billing.json @@ -367,7 +367,7 @@ "schema": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "title": "Rate limit reset", "description": "ISO 8601 timestamp when the current rate-limit window resets." } @@ -619,15 +619,8 @@ "type": "object", "properties": { "workspaceId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workspace whose payer was resolved, or null for account billing." + "description": "Workspace whose payer was resolved, or null for account billing.", + "type": ["string", "null"] }, "period": { "type": "object", @@ -784,15 +777,8 @@ "description": "Product surface that consumed credits. The legacy `mothership_block` value identifies the Agent block; `sim-chat` identifies Sim Chat." }, "workspaceId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workspace attributed to the event, or null for account-level usage." + "description": "Workspace attributed to the event, or null for account-level usage.", + "type": ["string", "null"] }, "workflow": { "anyOf": [ @@ -804,15 +790,8 @@ "description": "Workflow identifier." }, "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workflow display name, when available." + "description": "Workflow display name, when available.", + "type": ["string", "null"] } }, "required": ["id", "name"], @@ -825,15 +804,8 @@ "description": "Workflow attributed to the event, when applicable." }, "runId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workflow run attributed to the event, when applicable." + "description": "Workflow run attributed to the event, when applicable.", + "type": ["string", "null"] }, "creditCost": { "type": "number", @@ -856,15 +828,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] }, "scope": { "type": "string", diff --git a/apps/docs/openapi-v2-files-audit.json b/apps/docs/openapi-v2-files-audit.json index ec710bef7bc..b2f6115e645 100644 --- a/apps/docs/openapi-v2-files-audit.json +++ b/apps/docs/openapi-v2-files-audit.json @@ -2760,7 +2760,7 @@ "description": "Filter by actor email address.", "type": "string", "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" } } ], @@ -4454,7 +4454,7 @@ "schema": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "title": "Rate limit reset", "description": "ISO 8601 timestamp when the current rate-limit window resets." } @@ -4832,17 +4832,10 @@ "examples": ["2026-01-15T10:30:00Z"] }, "deletedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp when the file was archived by deleting it, or null while the file is active. Only an archived-scope file list returns files with a non-null value.", "format": "date-time", - "examples": ["2026-01-16T09:00:00Z"] + "examples": ["2026-01-16T09:00:00Z"], + "type": ["string", "null"] } }, "required": [ @@ -4873,15 +4866,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -4969,17 +4955,10 @@ "examples": ["2026-01-15T10:30:00Z"] }, "deletedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp when the file was archived by deleting it, or null while the file is active. Only an archived-scope file list returns files with a non-null value.", "format": "date-time", - "examples": ["2026-01-16T09:00:00Z"] + "examples": ["2026-01-16T09:00:00Z"], + "type": ["string", "null"] }, "revision": { "description": "Opaque token for the content this write produced. Send it back as `expectedRevision` on the next write. Absent for a file with no recorded content version.", @@ -5114,19 +5093,12 @@ "expiresAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 time when the upload session expires." }, "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Failure message, or null when no failure has occurred." + "description": "Failure message, or null when no failure has occurred.", + "type": ["string", "null"] }, "file": { "anyOf": [ @@ -5171,7 +5143,7 @@ "expiresAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 expiration time for this signed URL. This is the URL's own expiry and is normally earlier than the upload session's expiresAt: the session stays open for later part, status, completion, and abort requests, but the bytes must be uploaded before this time. Once it passes, the storage provider rejects the upload and a new upload session must be created." } }, @@ -5325,7 +5297,7 @@ "expiresAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 expiration time for the signed URL." } }, @@ -5424,15 +5396,8 @@ "description": "True when text extraction did not fully succeed and `text` may be incomplete or synthesized from the raw bytes rather than read from the document. Never treat degraded text as authoritative content." }, "degradedReason": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Why extraction degraded, or null when it did not." + "description": "Why extraction degraded, or null when it did not.", + "type": ["string", "null"] }, "charCount": { "type": "integer", @@ -5593,17 +5558,10 @@ "examples": ["2026-01-15T10:38:00Z"] }, "supersededAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp when a newer version replaced this one, or null for the current version. Retention ages versions from this time.", "format": "date-time", - "examples": ["2026-01-16T09:00:00Z"] + "examples": ["2026-01-16T09:00:00Z"], + "type": ["string", "null"] } }, "required": [ @@ -5634,15 +5592,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -5791,15 +5742,8 @@ "description": "True when text extraction did not fully succeed and `text` may be incomplete or synthesized from the raw bytes rather than read from the document. Never treat degraded text as authoritative content." }, "degradedReason": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Why extraction degraded, or null when it did not." + "description": "Why extraction degraded, or null when it did not.", + "type": ["string", "null"] }, "charCount": { "type": "integer", @@ -6305,17 +6249,10 @@ "examples": ["2026-01-15T10:30:00Z"] }, "deletedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp when the file was archived by deleting it, or null while the file is active. Only an archived-scope file list returns files with a non-null value.", "format": "date-time", - "examples": ["2026-01-16T09:00:00Z"] + "examples": ["2026-01-16T09:00:00Z"], + "type": ["string", "null"] }, "share": { "anyOf": [ @@ -6428,33 +6365,19 @@ "examples": ["audit_2c3d4e5f6g"] }, "workspaceId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workspace where the action occurred, or null for organization-level actions." + "description": "Workspace where the action occurred, or null for organization-level actions.", + "type": ["string", "null"] }, "actorName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Display name of the person who performed the action." + "description": "Display name of the person who performed the action.", + "type": ["string", "null"] }, "actorEmail": { "anyOf": [ { "type": "string", "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" }, { "type": "null" @@ -6473,37 +6396,16 @@ "examples": ["file"] }, "resourceId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Affected resource ID. Null for folder events, which identify folders by path." + "description": "Affected resource ID. Null for folder events, which identify folders by path.", + "type": ["string", "null"] }, "resourceName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Display name of the affected resource." + "description": "Display name of the affected resource.", + "type": ["string", "null"] }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Human-readable description of the action." + "description": "Human-readable description of the action.", + "type": ["string", "null"] }, "metadata": { "description": "Additional JSON details specific to the action." @@ -6543,15 +6445,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -7208,17 +7103,10 @@ "examples": ["2026-01-15T10:30:00Z"] }, "deletedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp when the file was archived by deleting it, or null while the file is active. Only an archived-scope file list returns files with a non-null value.", "format": "date-time", - "examples": ["2026-01-16T09:00:00Z"] + "examples": ["2026-01-16T09:00:00Z"], + "type": ["string", "null"] }, "revision": { "description": "Opaque token for the content this write produced. Send it back as `expectedRevision` on the next write. Absent for a file with no recorded content version.", @@ -7432,15 +7320,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits." + "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], diff --git a/apps/docs/openapi-v2-knowledge.json b/apps/docs/openapi-v2-knowledge.json index cadd389f3d1..7467135d321 100644 --- a/apps/docs/openapi-v2-knowledge.json +++ b/apps/docs/openapi-v2-knowledge.json @@ -5755,7 +5755,7 @@ "schema": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "title": "Rate limit reset", "description": "ISO 8601 timestamp when the current rate-limit window resets." } @@ -6087,16 +6087,9 @@ "examples": ["Product Documentation"] }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "Knowledge base description, or null when none is set.", - "examples": ["All product documentation and guides"] + "examples": ["All product documentation and guides"], + "type": ["string", "null"] }, "tokenCount": { "type": "number", @@ -6149,7 +6142,7 @@ "ownerEmail": { "type": "string", "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", + "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "description": "Current email address of the knowledge base owner.", "examples": ["owner@example.com"] }, @@ -6165,7 +6158,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -6265,15 +6258,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -6436,15 +6422,8 @@ "description": "Current import lifecycle state." }, "knowledgeBaseId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Knowledge base the import created, or null until it exists." + "description": "Knowledge base the import created, or null until it exists.", + "type": ["string", "null"] }, "documentsTotal": { "type": "integer", @@ -6476,26 +6455,19 @@ "description": "Bounded sample of the documents that could not be imported." }, "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Terminal failure reason, or null." + "description": "Terminal failure reason, or null.", + "type": ["string", "null"] }, "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 creation timestamp." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 last-update timestamp." }, "completedAt": { @@ -6503,7 +6475,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -6557,7 +6529,7 @@ "expiresAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 expiration time for this signed URL. This is the URL's own expiry and is normally earlier than the upload session's expiresAt: the session stays open for later part, status, completion, and abort requests, but the bytes must be uploaded before this time. Once it passes, the storage provider rejects the upload and a new upload session must be created." } }, @@ -6756,7 +6728,7 @@ "expiresAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 expiration time for the signed URL." } }, @@ -6920,15 +6892,8 @@ "description": "Registered external source type." }, "credentialId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "OAuth credential identifier, or null for API-key and unauthenticated sources." + "description": "OAuth credential identifier, or null for API-key and unauthenticated sources.", + "type": ["string", "null"] }, "sourceConfig": { "type": "object", @@ -6960,7 +6925,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -6969,15 +6934,8 @@ "description": "Time of the most recent synchronization, or null before the first sync." }, "lastSyncError": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Most recent synchronization error, or null when none is recorded." + "description": "Most recent synchronization error, or null when none is recorded.", + "type": ["string", "null"] }, "lastSyncDocCount": { "anyOf": [ @@ -6997,7 +6955,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -7014,13 +6972,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "Time the connector was created." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "Time the connector was last updated." } }, @@ -7056,15 +7014,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -7216,7 +7167,7 @@ "startedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "Time synchronization started." }, "completedAt": { @@ -7224,7 +7175,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -7270,15 +7221,8 @@ "description": "Documents that failed to synchronize." }, "errorMessage": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Synchronization error, or null." + "description": "Synchronization error, or null.", + "type": ["string", "null"] } }, "required": [ @@ -7318,15 +7262,8 @@ "description": "Registered external source type." }, "credentialId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "OAuth credential identifier, or null for API-key and unauthenticated sources." + "description": "OAuth credential identifier, or null for API-key and unauthenticated sources.", + "type": ["string", "null"] }, "sourceConfig": { "type": "object", @@ -7358,7 +7295,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -7367,15 +7304,8 @@ "description": "Time of the most recent synchronization, or null before the first sync." }, "lastSyncError": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Most recent synchronization error, or null when none is recorded." + "description": "Most recent synchronization error, or null when none is recorded.", + "type": ["string", "null"] }, "lastSyncDocCount": { "anyOf": [ @@ -7395,7 +7325,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -7412,13 +7342,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "Time the connector was created." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "Time the connector was last updated." }, "syncLogs": { @@ -7700,26 +7630,12 @@ "description": "Document filename." }, "externalId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Identifier assigned by the external source." + "description": "Identifier assigned by the external source.", + "type": ["string", "null"] }, "sourceUrl": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Original external source URL." + "description": "Original external source URL.", + "type": ["string", "null"] }, "enabled": { "type": "boolean", @@ -7732,7 +7648,7 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "Time the document was first synchronized." }, "processingStatus": { @@ -7765,15 +7681,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -7899,27 +7808,13 @@ "examples": ["b2d4f8a0-1c3e-4a5b-9d7c-2e6f0a8b4c12"] }, "documentName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "Filename of the source document, or null when unavailable.", - "examples": ["getting-started.pdf"] + "examples": ["getting-started.pdf"], + "type": ["string", "null"] }, "sourceUrl": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Original source URL, or null for a directly uploaded document." + "description": "Original source URL, or null for a directly uploaded document.", + "type": ["string", "null"] }, "content": { "type": "string", @@ -8090,30 +7985,13 @@ ] }, "value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ], "description": "Tag value to compare against.", - "examples": ["billing"] + "examples": ["billing"], + "type": ["string", "number", "boolean"] }, "valueTo": { "description": "Upper bound for the `between` operator, and required whenever that operator is used.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - } - ] + "type": ["string", "number"] } }, "required": ["tagName", "value"], @@ -8243,15 +8121,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits." + "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -8314,17 +8185,10 @@ "examples": [true] }, "createdAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp when the document was uploaded, or null.", "format": "date-time", - "examples": ["2025-06-18T16:45:00Z"] + "examples": ["2025-06-18T16:45:00Z"], + "type": ["string", "null"] }, "tags": { "type": "object", @@ -8332,21 +8196,8 @@ "type": "string" }, "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "description": "Tag value; dates are ISO 8601 strings and an unset tag is null." + "description": "Tag value; dates are ISO 8601 strings and an unset tag is null.", + "type": ["string", "number", "boolean", "null"] }, "description": "Document tag values keyed by display name. Writes use slots such as `tag1`; use List tags to map names to slots.", "examples": [ @@ -8386,15 +8237,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -8545,17 +8389,10 @@ "examples": [true] }, "createdAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp when the document was uploaded, or null.", "format": "date-time", - "examples": ["2025-06-18T16:45:00Z"] + "examples": ["2025-06-18T16:45:00Z"], + "type": ["string", "null"] } }, "required": [ @@ -8648,19 +8485,12 @@ "expiresAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 upload-session expiration time." }, "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Terminal upload error, or null when none occurred." + "description": "Terminal upload error, or null when none occurred.", + "type": ["string", "null"] }, "document": { "anyOf": [ @@ -8937,17 +8767,10 @@ "examples": [true] }, "createdAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp when the document was uploaded, or null.", "format": "date-time", - "examples": ["2025-06-18T16:45:00Z"] + "examples": ["2025-06-18T16:45:00Z"], + "type": ["string", "null"] }, "tags": { "type": "object", @@ -8955,21 +8778,8 @@ "type": "string" }, "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "description": "Tag value; dates are ISO 8601 strings and an unset tag is null." + "description": "Tag value; dates are ISO 8601 strings and an unset tag is null.", + "type": ["string", "number", "boolean", "null"] }, "description": "Document tag values keyed by display name. Writes use slots such as `tag1`; use List tags to map names to slots.", "examples": [ @@ -8980,74 +8790,32 @@ ] }, "processingError": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Processing error message, or null when processing has not failed." + "description": "Processing error message, or null when processing has not failed.", + "type": ["string", "null"] }, "processingStartedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp when processing started, or null.", "format": "date-time", - "examples": ["2025-06-18T16:45:05Z"] + "examples": ["2025-06-18T16:45:05Z"], + "type": ["string", "null"] }, "processingCompletedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp when processing completed, or null.", "format": "date-time", - "examples": ["2025-06-18T16:45:42Z"] + "examples": ["2025-06-18T16:45:42Z"], + "type": ["string", "null"] }, "connectorId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Connector identifier for a synced document, or null for a direct upload." + "description": "Connector identifier for a synced document, or null for a direct upload.", + "type": ["string", "null"] }, "connectorType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Connector type for a synced document, or null for a direct upload." + "description": "Connector type for a synced document, or null for a direct upload.", + "type": ["string", "null"] }, "sourceUrl": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Original source URL for a synced document, or null for a direct upload." + "description": "Original source URL for a synced document, or null for a direct upload.", + "type": ["string", "null"] } }, "required": [ @@ -9295,15 +9063,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits." + "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -9594,92 +9355,43 @@ "description": "Character offset just past the end of the chunk." }, "tag1": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Text tag value inherited from the document, or null when the slot is unset." + "description": "Text tag value inherited from the document, or null when the slot is unset.", + "type": ["string", "null"] }, "tag2": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Text tag value inherited from the document, or null when the slot is unset." + "description": "Text tag value inherited from the document, or null when the slot is unset.", + "type": ["string", "null"] }, "tag3": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Text tag value inherited from the document, or null when the slot is unset." + "description": "Text tag value inherited from the document, or null when the slot is unset.", + "type": ["string", "null"] }, "tag4": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Text tag value inherited from the document, or null when the slot is unset." + "description": "Text tag value inherited from the document, or null when the slot is unset.", + "type": ["string", "null"] }, "tag5": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Text tag value inherited from the document, or null when the slot is unset." + "description": "Text tag value inherited from the document, or null when the slot is unset.", + "type": ["string", "null"] }, "tag6": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Text tag value inherited from the document, or null when the slot is unset." + "description": "Text tag value inherited from the document, or null when the slot is unset.", + "type": ["string", "null"] }, "tag7": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Text tag value inherited from the document, or null when the slot is unset." + "description": "Text tag value inherited from the document, or null when the slot is unset.", + "type": ["string", "null"] }, "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the chunk was created." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the chunk was last modified." } }, @@ -9717,15 +9429,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -10037,16 +9742,9 @@ "type": "object", "properties": { "nextAvailableSlot": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "The free slot a create would take, or null when the field type is exhausted.", - "examples": ["tag3"] + "examples": ["tag3"], + "type": ["string", "null"] }, "fieldType": { "type": "string", @@ -10142,15 +9840,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits." + "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], diff --git a/apps/docs/openapi-v2-logs.json b/apps/docs/openapi-v2-logs.json index 52c8878d3e4..42a537a4078 100644 --- a/apps/docs/openapi-v2-logs.json +++ b/apps/docs/openapi-v2-logs.json @@ -686,7 +686,6 @@ "required": false, "description": "Whether buckets with no runs are included in every series. Off by default, so each series carries only the buckets that hold at least one run; set it to publish exactly `segmentCount` buckets per series, empty ones included. The listed spellings are the whole accepted vocabulary and are case-sensitive; any other value is rejected.", "schema": { - "default": "false", "description": "Whether buckets with no runs are included in every series. Off by default, so each series carries only the buckets that hold at least one run; set it to publish exactly `segmentCount` buckets per series, empty ones included. The listed spellings are the whole accepted vocabulary and are case-sensitive; any other value is rejected.", "enum": [ "true", @@ -702,7 +701,8 @@ "n", "disabled" ], - "type": "string" + "type": "string", + "default": "false" } } ], @@ -850,7 +850,7 @@ "schema": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "title": "Rate limit reset", "description": "ISO 8601 timestamp when the current rate-limit window resets." } @@ -1127,26 +1127,12 @@ "description": "Unique run identifier." }, "workflowId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workflow identifier, or null when unavailable." + "description": "Workflow identifier, or null when unavailable.", + "type": ["string", "null"] }, "deploymentVersionId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Deployment version identifier, or null when unavailable." + "description": "Deployment version identifier, or null when unavailable.", + "type": ["string", "null"] }, "status": { "type": "string", @@ -1172,7 +1158,7 @@ "startedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 execution start timestamp." }, "endedAt": { @@ -1180,7 +1166,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -1189,15 +1175,8 @@ "description": "ISO 8601 execution end timestamp, or null while the run is active." }, "totalDurationMs": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Total execution duration in milliseconds, or null while unavailable." + "description": "Total execution duration in milliseconds, or null while unavailable.", + "type": ["number", "null"] }, "cost": { "anyOf": [ @@ -1240,30 +1219,16 @@ "type": "object", "properties": { "id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workflow identifier, or null when unavailable." + "description": "Workflow identifier, or null when unavailable.", + "type": ["string", "null"] }, "name": { "type": "string", "description": "Workflow name." }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workflow description, or null when unset." + "description": "Workflow description, or null when unset.", + "type": ["string", "null"] }, "deleted": { "type": "boolean", @@ -1519,15 +1484,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -1575,26 +1533,12 @@ "description": "Unique run identifier." }, "workflowId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workflow identifier, or null when unavailable." + "description": "Workflow identifier, or null when unavailable.", + "type": ["string", "null"] }, "deploymentVersionId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Deployment version identifier, or null when unavailable." + "description": "Deployment version identifier, or null when unavailable.", + "type": ["string", "null"] }, "status": { "type": "string", @@ -1620,7 +1564,7 @@ "startedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 execution start timestamp." }, "endedAt": { @@ -1628,7 +1572,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -1637,15 +1581,8 @@ "description": "ISO 8601 execution end timestamp, or null while the run is active." }, "totalDurationMs": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Total execution duration in milliseconds, or null while unavailable." + "description": "Total execution duration in milliseconds, or null while unavailable.", + "type": ["number", "null"] }, "files": { "anyOf": [ @@ -1666,7 +1603,7 @@ { "type": "string", "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" }, { "type": "null" @@ -1678,30 +1615,16 @@ "type": "object", "properties": { "id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workflow identifier, or null when unavailable." + "description": "Workflow identifier, or null when unavailable.", + "type": ["string", "null"] }, "name": { "type": "string", "description": "Workflow name." }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workflow description, or null when unset." + "description": "Workflow description, or null when unset.", + "type": ["string", "null"] }, "folderPath": { "anyOf": [ @@ -1722,7 +1645,7 @@ { "type": "string", "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" }, { "type": "null" @@ -1732,22 +1655,15 @@ "deprecated": true }, "workspaceId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Owning workspace identifier, or null when unavailable." + "description": "Owning workspace identifier, or null when unavailable.", + "type": ["string", "null"] }, "createdAt": { "anyOf": [ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -1760,7 +1676,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -1893,7 +1809,7 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 log creation timestamp." } }, @@ -2048,7 +1964,7 @@ "timestamp": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 start of the bucket." }, "totalExecutions": { @@ -2112,13 +2028,13 @@ "start": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 start of the window." }, "end": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 end of the window." } }, diff --git a/apps/docs/openapi-v2-resources.json b/apps/docs/openapi-v2-resources.json index 72c2e52157f..c8400e3c2cb 100644 --- a/apps/docs/openapi-v2-resources.json +++ b/apps/docs/openapi-v2-resources.json @@ -2093,7 +2093,7 @@ "schema": { "type": "string", "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", + "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "description": "Email address of a current workspace member." } } @@ -14076,7 +14076,7 @@ "schema": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "title": "Rate limit reset", "description": "ISO 8601 timestamp when the current rate-limit window resets." } @@ -14406,15 +14406,8 @@ "description": "Workspace color as a hexadecimal color value." }, "logoUrl": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workspace logo URL, or null when none is configured." + "description": "Workspace logo URL, or null when none is configured.", + "type": ["string", "null"] }, "memberCount": { "type": "integer", @@ -14425,13 +14418,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the workspace was created." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the workspace was last updated." } }, @@ -14451,15 +14444,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -14519,7 +14505,7 @@ "email": { "type": "string", "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", + "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "description": "Member email address." }, "name": { @@ -14527,15 +14513,8 @@ "description": "Member display name." }, "image": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Member profile image URL, or null when absent." + "description": "Member profile image URL, or null when absent.", + "type": ["string", "null"] }, "role": { "type": "string", @@ -14549,7 +14528,7 @@ "joinedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when access was granted." } }, @@ -14569,15 +14548,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -14650,14 +14622,7 @@ }, "lastError": { "description": "Message from the most recent failed tool connection, or null when absent. Successful discovery or re-registration with changed connection inputs clears it.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] + "type": ["string", "null"] }, "toolCount": { "description": "Number of tools discovered on the server.", @@ -14667,25 +14632,25 @@ "description": "ISO 8601 timestamp of the most recent tool-list refresh.", "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, "lastConnected": { "description": "ISO 8601 timestamp of the most recent successful tool connection. Absent until one succeeds, or after re-registration changes connection inputs.", "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, "createdAt": { "description": "ISO 8601 timestamp when the server was registered.", "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, "updatedAt": { "description": "ISO 8601 timestamp when the server was last updated.", "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, "oauthClientId": { "description": "Pre-registered OAuth client identifier, when configured.", @@ -14734,15 +14699,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -15215,15 +15173,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits." + "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -15276,13 +15227,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the skill was created. Built-in skills report the Unix epoch." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the skill was last updated. Built-in skills report the Unix epoch." } }, @@ -15302,15 +15253,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -15355,13 +15299,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the skill was created. Built-in skills report the Unix epoch." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the skill was last updated. Built-in skills report the Unix epoch." }, "content": { @@ -15579,30 +15523,16 @@ "email": { "type": "string", "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", + "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "description": "Email address of the skill editor." }, "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Display name of the skill editor." + "description": "Display name of the skill editor.", + "type": ["string", "null"] }, "image": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Profile image URL of the skill editor." + "description": "Profile image URL of the skill editor.", + "type": ["string", "null"] }, "isWorkspaceAdmin": { "type": "boolean", @@ -15625,15 +15555,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -15689,7 +15612,7 @@ "email": { "type": "string", "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", + "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "description": "Email address of a current workspace member." } }, @@ -15710,7 +15633,7 @@ "email": { "type": "string", "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", + "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "description": "Email address whose explicit editor grant was revoked." }, "revoked": { @@ -15828,13 +15751,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the tool was created." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the tool was last updated." } }, @@ -15854,15 +15777,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -16346,44 +16262,23 @@ "description": "Image build state. `null` when the deployment installs dependencies at run time and has nothing to build." }, "errorCode": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Classified build failure code, or `null`." + "description": "Classified build failure code, or `null`.", + "type": ["string", "null"] }, "errorMessage": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Human-readable build failure summary, or `null`." + "description": "Human-readable build failure summary, or `null`.", + "type": ["string", "null"] }, "errorDetail": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Tail of the installer log for a failed build, or `null`." + "description": "Tail of the installer log for a failed build, or `null`.", + "type": ["string", "null"] }, "builtAt": { "anyOf": [ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -16394,13 +16289,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the sandbox was created." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the sandbox was last updated." } }, @@ -16434,15 +16329,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -16798,37 +16686,16 @@ "description": "Credential display name." }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Optional credential description." + "description": "Optional credential description.", + "type": ["string", "null"] }, "providerId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Integration provider authenticated by this credential." + "description": "Integration provider authenticated by this credential.", + "type": ["string", "null"] }, "accountId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Linked account identifier for OAuth credentials." + "description": "Linked account identifier for OAuth credentials.", + "type": ["string", "null"] }, "hasServiceAccountKey": { "type": "boolean", @@ -16842,13 +16709,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the credential was created." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the credential was last updated." } }, @@ -16879,15 +16746,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -17251,15 +17111,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits." + "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -17421,7 +17274,7 @@ "expiresAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the connection link expires." } }, @@ -17736,15 +17589,8 @@ "description": "Whether the secret belongs to the workspace or to the caller. A personal secret belongs to the caller across every workspace, not to one workspace." }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "What the secret is for, as set on the workspace secret. Always null for a personal secret, which has no shared audience." + "description": "What the secret is for, as set on the workspace secret. Always null for a personal secret, which has no shared audience.", + "type": ["string", "null"] }, "unredacted": { "type": "boolean", @@ -17758,13 +17604,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the secret was created." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the secret was last updated." }, "value": { @@ -17796,15 +17642,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -17854,15 +17693,8 @@ "description": "Whether the secret belongs to the workspace or to the caller. A personal secret belongs to the caller across every workspace, not to one workspace." }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "What the secret is for, as set on the workspace secret. Always null for a personal secret, which has no shared audience." + "description": "What the secret is for, as set on the workspace secret. Always null for a personal secret, which has no shared audience.", + "type": ["string", "null"] }, "unredacted": { "type": "boolean", @@ -17876,13 +17708,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the secret was created." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the secret was last updated." } }, @@ -18045,7 +17877,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -18093,15 +17925,8 @@ "description": "Server display name, shown to connecting MCP clients." }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Optional server description, or null when unset." + "description": "Optional server description, or null when unset.", + "type": ["string", "null"] }, "isPublic": { "type": "boolean", @@ -18162,15 +17987,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] }, "toolNamesTruncated": { "type": "boolean", @@ -18213,15 +18031,8 @@ "description": "Server display name, shown to connecting MCP clients." }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Optional server description, or null when unset." + "description": "Optional server description, or null when unset.", + "type": ["string", "null"] }, "isPublic": { "type": "boolean", @@ -18375,15 +18186,8 @@ "description": "Name an MCP client calls. Derived from the supplied name or the workflow name, normalized to the MCP tool-name grammar." }, "toolDescription": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Description shown to MCP clients." + "description": "Description shown to MCP clients.", + "type": ["string", "null"] }, "mcpServerUrl": { "type": "string", @@ -18436,15 +18240,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits." + "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits.", + "type": ["string", "null"] }, "truncated": { "type": "boolean", @@ -18596,15 +18393,8 @@ "description": "Name an MCP client calls. Derived from the supplied name or the workflow name, normalized to the MCP tool-name grammar." }, "toolDescription": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Description shown to MCP clients." + "description": "Description shown to MCP clients.", + "type": ["string", "null"] }, "mcpServerUrl": { "type": "string", @@ -19094,15 +18884,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -19413,17 +19196,7 @@ { "type": "array", "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] + "type": ["string", "number", "boolean"] } } ], @@ -19456,17 +19229,7 @@ { "type": "array", "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] + "type": ["string", "number", "boolean"] } } ] @@ -20301,15 +20064,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -20774,15 +20530,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -20960,15 +20709,8 @@ "description": "Group name, unique within the organization." }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Optional description of the group." + "description": "Optional description of the group.", + "type": ["string", "null"] }, "config": { "type": "object", @@ -21296,13 +21038,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "When the group was created." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "When the group was last updated." } }, @@ -21334,15 +21076,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -22284,41 +22019,20 @@ "assignedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "When the member was assigned." }, "userName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Member display name." + "description": "Member display name.", + "type": ["string", "null"] }, "userEmail": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Member email address." + "description": "Member email address.", + "type": ["string", "null"] }, "userImage": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Member avatar URL." + "description": "Member avatar URL.", + "type": ["string", "null"] } }, "required": ["id", "userId", "assignedAt", "userName", "userEmail", "userImage"], @@ -22337,15 +22051,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -22394,7 +22101,7 @@ "assignedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "When the assignment was created." } }, @@ -22574,15 +22281,8 @@ "description": "Organization slug." }, "logo": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Organization logo URL, or null when unset." + "description": "Organization logo URL, or null when unset.", + "type": ["string", "null"] }, "role": { "type": "string", @@ -22592,7 +22292,7 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "When the organization was created." } }, @@ -22612,15 +22312,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -22696,15 +22389,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -22746,7 +22432,7 @@ "joinedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "When the user joined the organization." } }, @@ -22766,15 +22452,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -22916,13 +22595,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "When the invitation was created." }, "expiresAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "When the invitation expires." } }, @@ -22952,15 +22631,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -23022,7 +22694,7 @@ "minLength": 1, "maxLength": 254, "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", + "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "description": "Email address of the person to invite." }, "role": { @@ -23092,7 +22764,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -23117,15 +22789,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -23258,26 +22923,12 @@ "description": "Identity provider issuer URL." }, "oidcConfig": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "JSON configuration with the client secret redacted; null for SAML." + "description": "JSON configuration with the client secret redacted; null for SAML.", + "type": ["string", "null"] }, "samlConfig": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "JSON configuration without private keys; null for OIDC." + "description": "JSON configuration without private keys; null for OIDC.", + "type": ["string", "null"] }, "jitProvisioningEnabled": { "type": "boolean", @@ -23310,15 +22961,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -23360,26 +23004,12 @@ "description": "Identity provider issuer URL." }, "oidcConfig": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "JSON configuration with the client secret redacted; null for SAML." + "description": "JSON configuration with the client secret redacted; null for SAML.", + "type": ["string", "null"] }, "samlConfig": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "JSON configuration without private keys; null for OIDC." + "description": "JSON configuration without private keys; null for OIDC.", + "type": ["string", "null"] }, "jitProvisioningEnabled": { "type": "boolean", @@ -23876,7 +23506,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -23889,15 +23519,8 @@ "description": "DNS host where the verification TXT record must be published." }, "txtRecordValue": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "TXT record value for a pending domain; only administrators receive it." + "description": "TXT record value for a pending domain; only administrators receive it.", + "type": ["string", "null"] } }, "required": [ @@ -23913,15 +23536,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -23954,7 +23570,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -23967,15 +23583,8 @@ "description": "DNS host where the verification TXT record must be published." }, "txtRecordValue": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "TXT record value for a pending domain; only administrators receive it." + "description": "TXT record value for a pending domain; only administrators receive it.", + "type": ["string", "null"] } }, "required": ["id", "domain", "status", "verifiedAt", "challengeHost", "txtRecordValue"], @@ -24028,7 +23637,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -24041,15 +23650,8 @@ "description": "DNS host where the verification TXT record must be published." }, "txtRecordValue": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "TXT record value for a pending domain; only administrators receive it." + "description": "TXT record value for a pending domain; only administrators receive it.", + "type": ["string", "null"] } }, "required": ["id", "domain", "status", "verifiedAt", "challengeHost", "txtRecordValue"], @@ -24130,7 +23732,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -24139,37 +23741,16 @@ "description": "When the explicit grant started; null for an inherited-only grant." }, "userName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Member display name." + "description": "Member display name.", + "type": ["string", "null"] }, "userEmail": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Member email." + "description": "Member email.", + "type": ["string", "null"] }, "userImage": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Member avatar URL." + "description": "Member avatar URL.", + "type": ["string", "null"] }, "roleSource": { "type": "string", @@ -24193,15 +23774,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -24291,26 +23865,12 @@ "type": "object", "properties": { "permissionGroupId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Identifier of the group governing the caller; null when no group applies." + "description": "Identifier of the group governing the caller; null when no group applies.", + "type": ["string", "null"] }, "groupName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Name of the governing permission group." + "description": "Name of the governing permission group.", + "type": ["string", "null"] }, "config": { "anyOf": [ @@ -24628,15 +24188,8 @@ "description": "Whether organization permission governance is active." }, "organizationId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Organization that owns the workspace; null for a personal workspace." + "description": "Organization that owns the workspace; null for a personal workspace.", + "type": ["string", "null"] }, "isOrgAdmin": { "type": "boolean", @@ -24810,7 +24363,7 @@ "type": "string", "maxLength": 320, "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" }, "description": "Email addresses to invite. Each address is processed separately; inspect failed for unsuccessful recipients." }, @@ -24847,15 +24400,8 @@ "description": "Credits used by this person during the organization billing period." }, "creditLimit": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Per-person credit cap. Null means no per-person cap; organization limits still apply. Zero prevents further credit-consuming usage." + "description": "Per-person credit cap. Null means no per-person cap; organization limits still apply. Zero prevents further credit-consuming usage.", + "type": ["number", "null"] }, "billingInterval": { "type": "string", @@ -24967,13 +24513,13 @@ "start": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "Inclusive reporting-window start." }, "end": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "Exclusive reporting-window end." }, "source": { @@ -25030,7 +24576,7 @@ "timestamp": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "Start of this calendar bucket." }, "credits": { @@ -25226,7 +24772,7 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "When the usage event was recorded." }, "source": { @@ -25250,15 +24796,8 @@ "description": "Usage event description, such as a model name." }, "workflowName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workflow name, or null for non-workflow usage or a deleted workflow." + "description": "Workflow name, or null for non-workflow usage or a deleted workflow.", + "type": ["string", "null"] }, "credits": { "type": "number", @@ -25291,15 +24830,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -25577,15 +25109,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -25868,7 +25393,7 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "When the request was submitted." }, "decidedAt": { @@ -25876,7 +25401,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -25885,15 +25410,8 @@ "description": "When the request was resolved; null while pending." }, "groupName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Name of the governing group when the request was submitted; null for credit-cap requests." + "description": "Name of the governing group when the request was submitted; null for credit-cap requests.", + "type": ["string", "null"] }, "requester": { "type": "object", @@ -25905,15 +25423,8 @@ "description": "Requester user identifier." }, "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Requester display name." + "description": "Requester display name.", + "type": ["string", "null"] }, "email": { "type": "string", @@ -25953,15 +25464,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -26307,15 +25811,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -26351,15 +25848,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -26705,15 +26195,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -27022,7 +26505,7 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "When the request was submitted." }, "decidedAt": { @@ -27030,7 +26513,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -27039,15 +26522,8 @@ "description": "When the request was resolved; null while pending." }, "groupName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Name of the governing group when the request was submitted; null for credit-cap requests." + "description": "Name of the governing group when the request was submitted; null for credit-cap requests.", + "type": ["string", "null"] }, "requester": { "type": "object", @@ -27059,15 +26535,8 @@ "description": "Requester user identifier." }, "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Requester display name." + "description": "Requester display name.", + "type": ["string", "null"] }, "email": { "type": "string", @@ -27584,7 +27053,7 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "When the request was submitted." }, "decidedAt": { @@ -27592,7 +27061,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -27601,15 +27070,8 @@ "description": "When the request was resolved; null while pending." }, "groupName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Name of the governing group when the request was submitted; null for credit-cap requests." + "description": "Name of the governing group when the request was submitted; null for credit-cap requests.", + "type": ["string", "null"] }, "requester": { "type": "object", @@ -27621,15 +27083,8 @@ "description": "Requester user identifier." }, "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Requester display name." + "description": "Requester display name.", + "type": ["string", "null"] }, "email": { "type": "string", diff --git a/apps/docs/openapi-v2-tables.json b/apps/docs/openapi-v2-tables.json index 1efe55b277d..c052e8e5447 100644 --- a/apps/docs/openapi-v2-tables.json +++ b/apps/docs/openapi-v2-tables.json @@ -5711,7 +5711,7 @@ "schema": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "title": "Rate limit reset", "description": "ISO 8601 timestamp when the current rate-limit window resets." } @@ -6049,20 +6049,13 @@ "description": "Table name." }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Table description, or null when none is set." + "description": "Table description, or null when none is set.", + "type": ["string", "null"] }, "ownerEmail": { "type": "string", "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", + "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "description": "Current email address of the table owner.", "examples": ["owner@example.com"] }, @@ -6200,13 +6193,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the table was created." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the table was last modified." } }, @@ -6233,15 +6226,8 @@ "type": "object", "properties": { "id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Background job identifier, or null when unavailable." + "description": "Background job identifier, or null when unavailable.", + "type": ["string", "null"] }, "type": { "anyOf": [ @@ -6265,15 +6251,8 @@ "description": "Number of rows processed by the job." }, "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Failure reason, or null when the job has not failed." + "description": "Failure reason, or null when the job has not failed.", + "type": ["string", "null"] } }, "required": ["id", "type", "status", "rowsProcessed", "error"], @@ -6292,15 +6271,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -7020,13 +6992,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the row was created." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the row was last modified." } }, @@ -7061,30 +7033,16 @@ "description": "Lifecycle state of the most recent run for this cell: `pending`, `queued`, `running`, `completed`, `error`, or `canceled`." }, "executionId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workflow execution identifier, or null before a worker claimed the cell." + "description": "Workflow execution identifier, or null before a worker claimed the cell.", + "type": ["string", "null"] }, "workflowId": { "type": "string", "description": "Workflow the group runs for this cell." }, "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Failure reason, or null when the run did not fail." + "description": "Failure reason, or null when the run did not fail.", + "type": ["string", "null"] }, "runningBlockIds": { "type": "array", @@ -7108,7 +7066,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -7141,15 +7099,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -7747,15 +7698,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -7894,7 +7838,7 @@ { "type": "string", "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" }, { "type": "null" @@ -7905,13 +7849,13 @@ "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the view was created." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the view was last modified." } }, @@ -8021,15 +7965,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits." + "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -8486,15 +8423,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits." + "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -9091,15 +9021,8 @@ "type": "object", "properties": { "dispatchId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Run dispatch ID, or null when no dispatch is available to poll. Use row reads with `includeRunState` to check cell outcomes." + "description": "Run dispatch ID, or null when no dispatch is available to poll. Use row reads with `includeRunState` to check cell outcomes.", + "type": ["string", "null"] } }, "required": ["dispatchId"], @@ -9457,15 +9380,8 @@ "description": "New or existing table import target." }, "tableId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Resulting or target table identifier." + "description": "Resulting or target table identifier.", + "type": ["string", "null"] }, "rowsProcessed": { "type": "integer", @@ -9493,26 +9409,19 @@ "description": "Bounded sample of the dropped records, for locating them in the source file." }, "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Terminal failure reason, or null." + "description": "Terminal failure reason, or null.", + "type": ["string", "null"] }, "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 creation timestamp." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 last-update timestamp." }, "completedAt": { @@ -9520,7 +9429,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -9575,7 +9484,7 @@ "expiresAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 expiration time for this signed URL. This is the URL's own expiry and is normally earlier than the upload session's expiresAt: the session stays open for later part, status, completion, and abort requests, but the bytes must be uploaded before this time. Once it passes, the storage provider rejects the upload and a new upload session must be created." } }, @@ -9699,15 +9608,8 @@ "description": "New or existing table import target." }, "tableId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Resulting or target table identifier." + "description": "Resulting or target table identifier.", + "type": ["string", "null"] }, "rowsProcessed": { "type": "integer", @@ -9735,26 +9637,19 @@ "description": "Bounded sample of the dropped records, for locating them in the source file." }, "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Terminal failure reason, or null." + "description": "Terminal failure reason, or null.", + "type": ["string", "null"] }, "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 creation timestamp." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 last-update timestamp." }, "completedAt": { @@ -9762,7 +9657,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -10043,15 +9938,8 @@ "description": "New or existing table import target." }, "tableId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Resulting or target table identifier." + "description": "Resulting or target table identifier.", + "type": ["string", "null"] }, "rowsProcessed": { "type": "integer", @@ -10079,26 +9967,19 @@ "description": "Bounded sample of the dropped records, for locating them in the source file." }, "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Terminal failure reason, or null." + "description": "Terminal failure reason, or null.", + "type": ["string", "null"] }, "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 creation timestamp." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 last-update timestamp." }, "completedAt": { @@ -10106,7 +9987,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -10188,7 +10069,7 @@ "expiresAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 expiration time for the signed URL." } }, @@ -10297,26 +10178,19 @@ "description": "Rows exported so far." }, "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Terminal failure reason, or null." + "description": "Terminal failure reason, or null.", + "type": ["string", "null"] }, "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 creation timestamp." }, "updatedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 last-update timestamp." }, "completedAt": { @@ -10324,7 +10198,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -10430,7 +10304,7 @@ "expiresAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 URL expiration timestamp." } }, @@ -10561,15 +10435,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits." + "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -10901,7 +10768,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -10914,7 +10781,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -10931,15 +10798,8 @@ "description": "Sum of per-provider hosted-key cost in USD; zero when not recorded." }, "matchedProvider": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Provider that produced the match, or null when none did." + "description": "Provider that produced the match, or null when none did.", + "type": ["string", "null"] }, "aborted": { "type": "boolean", @@ -10994,15 +10854,8 @@ "description": "Wall-clock milliseconds this provider took; zero if skipped." }, "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Failure reason when `status` is `error`, else null." + "description": "Failure reason when `status` is `error`, else null.", + "type": ["string", "null"] } }, "required": ["id", "label", "toolId", "status", "cost", "durationMs", "error"], @@ -11159,7 +11012,7 @@ "requestedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the dispatch was created." }, "completedAt": { @@ -11167,7 +11020,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -11180,7 +11033,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -11244,15 +11097,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits." + "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], diff --git a/apps/docs/openapi-v2-workflows.json b/apps/docs/openapi-v2-workflows.json index 30bc2c5dc8f..7609ea856c9 100644 --- a/apps/docs/openapi-v2-workflows.json +++ b/apps/docs/openapi-v2-workflows.json @@ -7127,7 +7127,7 @@ "schema": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "title": "Rate limit reset", "description": "ISO 8601 timestamp when the current rate-limit window resets." } @@ -7524,15 +7524,8 @@ "examples": ["Customer support triage"] }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workflow description, or null when none is set." + "description": "Workflow description, or null when none is set.", + "type": ["string", "null"] }, "folderPath": { "type": "string", @@ -7550,16 +7543,9 @@ "description": "Whether the workflow has an active deployment." }, "deployedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 activation timestamp, or null when not deployed.", - "format": "date-time" + "format": "date-time", + "type": ["string", "null"] }, "runCount": { "type": "integer", @@ -7568,16 +7554,9 @@ "description": "Settled runs — completed, failed, or cancelled — counted as each one finishes; a paused run is counted once it settles. The counter is never reduced when a run ages out of log retention, so it can exceed the results returned by List workflow runs." }, "lastRunAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp of the latest settled run, whatever its outcome, or null when the workflow has never run.", - "format": "date-time" + "format": "date-time", + "type": ["string", "null"] }, "createdAt": { "type": "string", @@ -7619,15 +7598,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -7696,15 +7668,8 @@ "examples": ["Customer support triage"] }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workflow description, or null when none is set." + "description": "Workflow description, or null when none is set.", + "type": ["string", "null"] }, "folderPath": { "type": "string", @@ -7722,16 +7687,9 @@ "description": "Whether the workflow has an active deployment." }, "deployedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 activation timestamp, or null when not deployed.", - "format": "date-time" + "format": "date-time", + "type": ["string", "null"] }, "runCount": { "type": "integer", @@ -7740,16 +7698,9 @@ "description": "Settled runs — completed, failed, or cancelled — counted as each one finishes; a paused run is counted once it settles. The counter is never reduced when a run ages out of log retention, so it can exceed the results returned by List workflow runs." }, "lastRunAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp of the latest settled run, whatever its outcome, or null when the workflow has never run.", - "format": "date-time" + "format": "date-time", + "type": ["string", "null"] }, "createdAt": { "type": "string", @@ -8078,25 +8029,11 @@ }, "sourceHandle": { "description": "Source port, or null for the block default.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] + "type": ["string", "null"] }, "targetHandle": { "description": "Target port, or null for the block default.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] + "type": ["string", "null"] }, "type": { "description": "Edge renderer type.", @@ -8361,26 +8298,12 @@ "description": "Block the finding is about." }, "blockName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Display name of the block, when it has one." + "description": "Display name of the block, when it has one.", + "type": ["string", "null"] }, "blockType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Registered type of the block, when it has one." + "description": "Registered type of the block, when it has one.", + "type": ["string", "null"] } }, "required": ["blockId", "blockName", "blockType"], @@ -8398,26 +8321,12 @@ "description": "Block the finding is about." }, "blockName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Display name of the block, when it has one." + "description": "Display name of the block, when it has one.", + "type": ["string", "null"] }, "blockType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Registered type of the block, when it has one." + "description": "Registered type of the block, when it has one.", + "type": ["string", "null"] } }, "required": ["blockId", "blockName", "blockType"], @@ -8435,26 +8344,12 @@ "description": "Block the finding is about." }, "blockName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Display name of the block, when it has one." + "description": "Display name of the block, when it has one.", + "type": ["string", "null"] }, "blockType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Registered type of the block, when it has one." + "description": "Registered type of the block, when it has one.", + "type": ["string", "null"] } }, "required": ["blockId", "blockName", "blockType"], @@ -8472,26 +8367,12 @@ "description": "Block the finding is about." }, "blockName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Display name of the block, when it has one." + "description": "Display name of the block, when it has one.", + "type": ["string", "null"] }, "blockType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Registered type of the block, when it has one." + "description": "Registered type of the block, when it has one.", + "type": ["string", "null"] }, "handle": { "type": "string", @@ -8517,26 +8398,12 @@ "description": "Block the finding is about." }, "blockName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Display name of the block, when it has one." + "description": "Display name of the block, when it has one.", + "type": ["string", "null"] }, "blockType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Registered type of the block, when it has one." + "description": "Registered type of the block, when it has one.", + "type": ["string", "null"] }, "sourceHandle": { "type": "string", @@ -8562,26 +8429,12 @@ "description": "Block the edge leaves." }, "sourceBlockName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Display name of the source block." + "description": "Display name of the source block.", + "type": ["string", "null"] }, "sourceHandle": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Handle the edge leaves from." + "description": "Handle the edge leaves from.", + "type": ["string", "null"] }, "targetBlockId": { "type": "string", @@ -8613,26 +8466,12 @@ "description": "Block the finding is about." }, "blockName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Display name of the block, when it has one." + "description": "Display name of the block, when it has one.", + "type": ["string", "null"] }, "blockType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Registered type of the block, when it has one." + "description": "Registered type of the block, when it has one.", + "type": ["string", "null"] }, "missingRequiredFields": { "type": "array", @@ -8651,15 +8490,8 @@ "description": "Canonical parameter the two sub-block modes share." }, "activeMemberId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Sub-block the runtime reads, where the value should live." + "description": "Sub-block the runtime reads, where the value should live.", + "type": ["string", "null"] }, "inactiveMemberId": { "type": "string", @@ -8698,26 +8530,12 @@ "description": "Block the finding is about." }, "blockName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Display name of the block, when it has one." + "description": "Display name of the block, when it has one.", + "type": ["string", "null"] }, "blockType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Registered type of the block, when it has one." + "description": "Registered type of the block, when it has one.", + "type": ["string", "null"] }, "field": { "type": "string", @@ -8769,26 +8587,12 @@ "description": "Block the finding is about." }, "blockName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Display name of the block, when it has one." + "description": "Display name of the block, when it has one.", + "type": ["string", "null"] }, "blockType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Registered type of the block, when it has one." + "description": "Registered type of the block, when it has one.", + "type": ["string", "null"] }, "field": { "type": "string", @@ -9108,25 +8912,11 @@ }, "sourceHandle": { "description": "Source port, or null for the block default.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] + "type": ["string", "null"] }, "targetHandle": { "description": "Target port, or null for the block default.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] + "type": ["string", "null"] }, "type": { "description": "Edge renderer type.", @@ -10619,15 +10409,8 @@ "examples": ["Customer support triage"] }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workflow description, or null when none is set." + "description": "Workflow description, or null when none is set.", + "type": ["string", "null"] }, "folderPath": { "type": "string", @@ -10645,16 +10428,9 @@ "description": "Whether the workflow has an active deployment." }, "deployedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 activation timestamp, or null when not deployed.", - "format": "date-time" + "format": "date-time", + "type": ["string", "null"] }, "runCount": { "type": "integer", @@ -10663,16 +10439,9 @@ "description": "Settled runs — completed, failed, or cancelled — counted as each one finishes; a paused run is counted once it settles. The counter is never reduced when a run ages out of log retention, so it can exceed the results returned by List workflow runs." }, "lastRunAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp of the latest settled run, whatever its outcome, or null when the workflow has never run.", - "format": "date-time" + "format": "date-time", + "type": ["string", "null"] }, "createdAt": { "type": "string", @@ -10876,25 +10645,11 @@ }, "name": { "description": "Optional deployment-version label.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] + "type": ["string", "null"] }, "description": { "description": "Optional deployment-version release note.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] + "type": ["string", "null"] }, "isActive": { "type": "boolean", @@ -10907,14 +10662,7 @@ }, "deployedBy": { "description": "Display name of the user who created the deployment, when available.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] + "type": ["string", "null"] }, "latestOperationStatus": { "description": "Latest lifecycle-operation status for this version.", @@ -10945,15 +10693,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -11612,26 +11353,12 @@ "description": "Monotonically increasing deployment version number." }, "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Version label, or null when unset." + "description": "Version label, or null when unset.", + "type": ["string", "null"] }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Version release note, or null when unset." + "description": "Version release note, or null when unset.", + "type": ["string", "null"] }, "isActive": { "type": "boolean", @@ -11691,26 +11418,12 @@ "description": "Monotonically increasing deployment version number." }, "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Version label, or null when unset." + "description": "Version label, or null when unset.", + "type": ["string", "null"] }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Version release note, or null when unset." + "description": "Version release note, or null when unset.", + "type": ["string", "null"] } }, "required": ["version", "name", "description"], @@ -11839,14 +11552,7 @@ "activatedAt": { "description": "ISO 8601 activation timestamp, or null before activation completes.", "format": "date-time", - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] + "type": ["string", "null"] }, "error": { "description": "Deployment failure details, or null when no failure occurred.", @@ -11935,19 +11641,12 @@ "isDeployed": { "type": "boolean", "description": "Whether a workflow version is currently live and available for API execution." - }, - "deployedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], + }, + "deployedAt": { "description": "ISO 8601 timestamp associated with the deployment, or null when unavailable.", "format": "date-time", - "examples": ["2026-06-12T10:30:00.000Z"] + "examples": ["2026-06-12T10:30:00.000Z"], + "type": ["string", "null"] }, "warnings": { "type": "array", @@ -12014,17 +11713,10 @@ "description": "Whether a workflow version is currently live and available for API execution." }, "deployedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp associated with the deployment, or null when unavailable.", "format": "date-time", - "examples": ["2026-06-12T10:30:00.000Z"] + "examples": ["2026-06-12T10:30:00.000Z"], + "type": ["string", "null"] }, "warnings": { "type": "array", @@ -12186,26 +11878,12 @@ "type": "object", "properties": { "blockId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Trigger block the URL delivers to, or null for a legacy row that recorded none." + "description": "Trigger block the URL delivers to, or null for a legacy row that recorded none.", + "type": ["string", "null"] }, "provider": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Webhook provider the endpoint verifies inbound requests against, e.g. `generic`, `github`, or `slack`." + "description": "Webhook provider the endpoint verifies inbound requests against, e.g. `generic`, `github`, or `slack`.", + "type": ["string", "null"] }, "url": { "type": "string", @@ -12232,17 +11910,10 @@ "description": "Whether a workflow version is currently live and available for API execution." }, "deployedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp associated with the deployment, or null when unavailable.", "format": "date-time", - "examples": ["2026-06-12T10:30:00.000Z"] + "examples": ["2026-06-12T10:30:00.000Z"], + "type": ["string", "null"] }, "warnings": { "type": "array", @@ -12426,17 +12097,10 @@ "description": "Whether a workflow version is currently live and available for API execution." }, "deployedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp associated with the deployment, or null when unavailable.", "format": "date-time", - "examples": ["2026-06-12T10:30:00.000Z"] + "examples": ["2026-06-12T10:30:00.000Z"], + "type": ["string", "null"] }, "warnings": { "type": "array", @@ -12614,17 +12278,10 @@ "description": "Whether a workflow version is currently live and available for API execution." }, "deployedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp associated with the deployment, or null when unavailable.", "format": "date-time", - "examples": ["2026-06-12T10:30:00.000Z"] + "examples": ["2026-06-12T10:30:00.000Z"], + "type": ["string", "null"] }, "warnings": { "type": "array", @@ -12788,26 +12445,12 @@ "description": "Name of the exported workflow." }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Description of the exported workflow, or null when unset." + "description": "Description of the exported workflow, or null when unset.", + "type": ["string", "null"] }, "workspaceId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Identifier of the source workspace, or null for legacy exports." + "description": "Identifier of the source workspace, or null for legacy exports.", + "type": ["string", "null"] }, "folderPath": { "type": "string", @@ -13009,15 +12652,8 @@ "description": "Display name of the workflow or workspace." }, "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Imported workflow description." + "description": "Imported workflow description.", + "type": ["string", "null"] }, "workspaceId": { "type": "string", @@ -13666,15 +13302,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -14496,27 +14125,13 @@ "format": "date-time" }, "endedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 timestamp when the run ended, or null while active.", - "format": "date-time" + "format": "date-time", + "type": ["string", "null"] }, "durationMs": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Run duration in milliseconds, or null while active." + "description": "Run duration in milliseconds, or null while active.", + "type": ["number", "null"] }, "cost": { "anyOf": [ @@ -14563,15 +14178,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -14624,15 +14232,8 @@ "description": "Path to fetch this file's bytes from, relative to the API host." }, "base64": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Base64-encoded contents when `includeFileBase64` was requested and the file fits the inline ceiling, otherwise null." + "description": "Base64-encoded contents when `includeFileBase64` was requested and the file fits the inline ceiling, otherwise null.", + "type": ["string", "null"] } }, "required": ["id", "name", "size", "type", "downloadPath", "base64"], @@ -14670,50 +14271,22 @@ "description": "Current or terminal run status. `redacting` is transient, reported while a finished run's output is being scrubbed. `paused` means the run is waiting at a human or time pause, or a resume attempt did not complete. The single-run response provides the pause kind, resume time, and any automatic-resume waiting reason." }, "trigger": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Trigger type that started the run. Backfilled as `api` for a run that is still queued, so it is populated from the first poll." + "description": "Trigger type that started the run. Backfilled as `api` for a run that is still queued, so it is populated from the first poll.", + "type": ["string", "null"] }, "startedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 start timestamp. A queued run reports the time it was enqueued, so it is populated from the first poll.", - "format": "date-time" + "format": "date-time", + "type": ["string", "null"] }, "endedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], "description": "ISO 8601 end timestamp, or null while nonterminal.", - "format": "date-time" + "format": "date-time", + "type": ["string", "null"] }, "durationMs": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Run duration in milliseconds, or null while active." + "description": "Run duration in milliseconds, or null while active.", + "type": ["number", "null"] }, "paused": { "anyOf": [ @@ -14721,20 +14294,13 @@ "type": "object", "properties": { "contextId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Resume context identifier, or null while every pause point is mid-resume." + "description": "Resume context identifier, or null while every pause point is mid-resume.", + "type": ["string", "null"] }, "pausedAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 timestamp when the execution entered the paused state." }, "resumeAt": { @@ -14742,7 +14308,7 @@ { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$" }, { "type": "null" @@ -14763,26 +14329,12 @@ "description": "Whether the pause waits for time or human input, or null when unspecified." }, "blockedOnBlockId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Workflow block awaiting resume, or null when no block is identified." + "description": "Workflow block awaiting resume, or null when no block is identified.", + "type": ["string", "null"] }, "automaticResumeWaitingReason": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Recorded automatic-resume failure, or null when no failure is recorded. Inspect `pauseKind` and `resumeAt` to distinguish a scheduled time pause from human input. Cleared after a successful resume. A non-retryable or exhausted failure starts with `Automatic resume requires manual intervention: `." + "description": "Recorded automatic-resume failure, or null when no failure is recorded. Inspect `pauseKind` and `resumeAt` to distinguish a scheduled time pause from human input. Cleared after a successful resume. A non-retryable or exhausted failure starts with `Automatic resume requires manual intervention: `.", + "type": ["string", "null"] }, "pausePointCount": { "type": "number", @@ -15189,15 +14741,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits." + "description": "Always `null`. This list has no `cursor` or `limit` parameters; see the operation for inventory limits.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -17418,15 +16963,8 @@ "description": "Display name of the workflow or workspace." }, "organizationId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Owning organization, or null for a personal workspace." + "description": "Owning organization, or null for a personal workspace.", + "type": ["string", "null"] } }, "required": ["id", "name", "organizationId"], @@ -17450,15 +16988,8 @@ "description": "Display name of the workflow or workspace." }, "organizationId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Owning organization, or null for a personal workspace." + "description": "Owning organization, or null for a personal workspace.", + "type": ["string", "null"] } }, "required": ["id", "name", "organizationId"], @@ -17504,20 +17035,13 @@ "description": "Display name of the workflow or workspace." }, "organizationId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Owning organization, or null for a personal workspace." + "description": "Owning organization, or null for a personal workspace.", + "type": ["string", "null"] }, "createdAt": { "type": "string", "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "description": "ISO 8601 creation timestamp." } }, @@ -17537,15 +17061,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -17568,25 +17085,11 @@ }, "folderId": { "description": "Containing folder identifier, or null at the workspace root.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] + "type": ["string", "null"] }, "folderName": { "description": "Containing folder name, or null at the workspace root.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] + "type": ["string", "null"] } }, "required": ["id", "label"], @@ -17605,15 +17108,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -17683,15 +17179,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], @@ -19035,15 +18524,8 @@ "description": "Items in the current page." }, "nextCursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself." + "description": "Opaque cursor for the next page. Send it back as `cursor`; `null` means there are no more pages. Do not construct a cursor yourself.", + "type": ["string", "null"] } }, "required": ["data", "nextCursor"], diff --git a/apps/docs/package.json b/apps/docs/package.json index 37683bf97e6..08855abdfc5 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -44,7 +44,7 @@ "shiki": "4.5.0", "streamdown": "2.5.0", "framer-motion": "^12.5.0", - "zod": "4.3.6" + "zod": "4.6.7" }, "devDependencies": { "@playwright/test": "1.61.1", diff --git a/apps/realtime/package.json b/apps/realtime/package.json index e1ab2cd0645..1705b51c126 100644 --- a/apps/realtime/package.json +++ b/apps/realtime/package.json @@ -39,7 +39,7 @@ "socket.io": "^4.8.4", "y-protocols": "1.0.7", "yjs": "13.6.33", - "zod": "4.3.6" + "zod": "4.6.7" }, "devDependencies": { "@sim/testing": "workspace:*", diff --git a/apps/sim/lib/api/contracts/logs.ts b/apps/sim/lib/api/contracts/logs.ts index 0c85e989a31..ecf6f2d147b 100644 --- a/apps/sim/lib/api/contracts/logs.ts +++ b/apps/sim/lib/api/contracts/logs.ts @@ -1,5 +1,9 @@ import { z } from 'zod' -import { booleanQueryFlagSchema, userFileSchema } from '@/lib/api/contracts/primitives' +import { + booleanQueryFlagSchema, + isoDateTimeSchema, + userFileSchema, +} from '@/lib/api/contracts/primitives' import { defineRouteContract } from '@/lib/api/contracts/types' const comparisonOperatorSchema = z.enum(['=', '>', '<', '>=', '<=', '!=']) @@ -45,9 +49,9 @@ export const listLogsQuerySchema = logFilterQuerySchema.extend({ /** Include a fingerprint of matching rows and their sort values for change detection. */ includeRevision: booleanQueryFlagSchema.optional(), /** Bound run start times for pagination; mutable fields remain live on the server. */ - snapshotAt: z.union([z.literal('now'), z.iso.datetime()]).optional(), + snapshotAt: z.union([z.literal('now'), isoDateTimeSchema()]).optional(), /** Count or list runs started after the displayed snapshot, within the other filters. */ - startedAfter: z.iso.datetime().optional(), + startedAfter: isoDateTimeSchema().optional(), }) export type ListLogsQuery = z.input diff --git a/apps/sim/lib/api/contracts/primitives.test.ts b/apps/sim/lib/api/contracts/primitives.test.ts index b0ebb7b262e..8b120de97ff 100644 --- a/apps/sim/lib/api/contracts/primitives.test.ts +++ b/apps/sim/lib/api/contracts/primitives.test.ts @@ -3,6 +3,7 @@ import { z } from 'zod' import { customPatternSchema, isCanonicalBase64, + isoDateTimeSchema, MAX_ID_LENGTH, optionalNumberQuerySchema, organizationIdSchema, @@ -369,3 +370,34 @@ describe('optionalNumberQuerySchema', () => { expect(optionalNumberQuerySchema.safeParse('abc').success).toBe(false) }) }) + +describe('isoDateTimeSchema', () => { + it('accepts minute precision with Z, and with an offset when offset is enabled', () => { + expect(isoDateTimeSchema().safeParse('2026-01-01T06:15Z').success).toBe(true) + expect(isoDateTimeSchema({ offset: true }).safeParse('2026-01-01T06:15+05:30').success).toBe( + true + ) + }) + + it.each([ + 'garbage', + '2026-01-01', + '2026-01-01T06:15', + '2026-02-30T06:15Z', + '2026-01-01T24:00Z', + '2026-01-01T06:15+0530', + ])('rejects %s', (value) => { + expect(isoDateTimeSchema({ offset: true }).safeParse(value).success).toBe(false) + }) + + it('rejects an offset unless offset is enabled', () => { + expect(isoDateTimeSchema().safeParse('2026-01-01T06:15:00+05:30').success).toBe(false) + }) + + it('publishes date-time format', () => { + expect(z.toJSONSchema(isoDateTimeSchema())).toMatchObject({ + type: 'string', + format: 'date-time', + }) + }) +}) diff --git a/apps/sim/lib/api/contracts/primitives.ts b/apps/sim/lib/api/contracts/primitives.ts index c583cab62a3..abb9e99121b 100644 --- a/apps/sim/lib/api/contracts/primitives.ts +++ b/apps/sim/lib/api/contracts/primitives.ts @@ -641,6 +641,38 @@ export const optionalNumberQuerySchema = z.preprocess((value) => { return typeof value === 'string' && value.trim() === '' ? undefined : value }, z.coerce.number().optional()) +const ISO_DATE_SOURCE = z.regexes.date.source.slice(1, -1) +const ISO_TIME_SOURCE = '(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?' +const UTC_OFFSET_SOURCE = '([+-](?:[01]\\d|2[0-3]):[0-5]\\d)' + +function isoDateTimeRegex(offset: boolean): RegExp { + const zone = offset ? `Z|${UTC_OFFSET_SOURCE}` : 'Z' + return new RegExp(`^${ISO_DATE_SOURCE}T(?:${ISO_TIME_SOURCE}(?:${zone}))$`) +} + +const ISO_DATETIME_UTC_REGEX = isoDateTimeRegex(false) + +/** {@link isoDateTimeSchema}'s `offset: true` pattern, for checks outside Zod (SQL). */ +export const ISO_DATETIME_OFFSET_REGEX = isoDateTimeRegex(true) + +/** + * An ISO 8601 timestamp at an untrusted input boundary: `Z` (or, with `offset`, + * a `±HH:MM` offset), seconds and fractional seconds optional. + * + * Zod 4.6 made `z.iso.datetime()` strict RFC 3339 and rejects a minute-precision + * timestamp such as `2026-01-01T06:15Z`, which every boundary accepted under 4.3. + * This keeps the 4.3 grammar, issue (`invalid_format`, format `datetime`), and + * JSON Schema (`format: date-time` plus the pattern). Values Sim produces with + * `toISOString()` keep the strict `z.iso.datetime()`. + */ +export function isoDateTimeSchema(options: { offset?: boolean; error?: string } = {}) { + return z.stringFormat( + 'datetime', + options.offset ? ISO_DATETIME_OFFSET_REGEX : ISO_DATETIME_UTC_REGEX, + options.error === undefined ? undefined : { error: options.error } + ) +} + /** Exactly one routed owner for resources shared by Search surfaces. */ export const resourceOwnerSchema = z .object({ diff --git a/apps/sim/lib/api/contracts/tables-predicate.test.ts b/apps/sim/lib/api/contracts/tables-predicate.test.ts index 9d0891e3995..af6ae6aa6d8 100644 --- a/apps/sim/lib/api/contracts/tables-predicate.test.ts +++ b/apps/sim/lib/api/contracts/tables-predicate.test.ts @@ -3,6 +3,7 @@ * predicate tree. The contract validates structure; column-level validation * (unknown field, json-op) runs server-side in `validate.ts`. */ +import { inlineRootRef } from '@sim/utils/json-schema' import { describe, expect, it } from 'vitest' import { z } from 'zod' import { @@ -178,7 +179,9 @@ function rowQueryStringSchemaProbe(input: Record) { * it. These assertions are the join. */ describe('the published predicate schema', () => { - const published = z.toJSONSchema(predicateSchema, { io: 'input', unrepresentable: 'any' }) + const published = inlineRootRef( + z.toJSONSchema(predicateSchema, { io: 'input', unrepresentable: 'any' }) + ) const leaf = (published.oneOf as JsonSchemaNode[])[0].properties.all.items.anyOf[1] it('names the leaf keys the server actually requires', () => { diff --git a/apps/sim/lib/api/contracts/tools/aws/cloudtrail-lookup-events.ts b/apps/sim/lib/api/contracts/tools/aws/cloudtrail-lookup-events.ts index dc940512aef..809023e1c6b 100644 --- a/apps/sim/lib/api/contracts/tools/aws/cloudtrail-lookup-events.ts +++ b/apps/sim/lib/api/contracts/tools/aws/cloudtrail-lookup-events.ts @@ -1,4 +1,5 @@ import { z } from 'zod' +import { isoDateTimeSchema } from '@/lib/api/contracts/primitives' import type { ContractBody, ContractBodyInput, @@ -35,8 +36,8 @@ const LookupEventsSchema = z .min(1, 'Lookup attribute value cannot be empty') .max(2000, 'Lookup attribute value cannot exceed 2000 characters') .optional(), - startTime: z.string().datetime({ offset: true }).optional(), - endTime: z.string().datetime({ offset: true }).optional(), + startTime: isoDateTimeSchema({ offset: true }).optional(), + endTime: isoDateTimeSchema({ offset: true }).optional(), eventCategory: z.literal('insight').optional(), maxResults: z.preprocess( (v) => (v === '' || v === undefined || v === null ? undefined : v), diff --git a/apps/sim/lib/api/contracts/tools/aws/lambda-create-event-source-mapping.ts b/apps/sim/lib/api/contracts/tools/aws/lambda-create-event-source-mapping.ts index beb8de0ac07..764de1b9467 100644 --- a/apps/sim/lib/api/contracts/tools/aws/lambda-create-event-source-mapping.ts +++ b/apps/sim/lib/api/contracts/tools/aws/lambda-create-event-source-mapping.ts @@ -1,4 +1,5 @@ import { z } from 'zod' +import { isoDateTimeSchema } from '@/lib/api/contracts/primitives' import { lambdaConnectionFields, lambdaEventSourceMappingSchema, @@ -23,9 +24,10 @@ const CreateEventSourceMappingSchema = z batchSize: z.number().int().min(1).max(10000).optional(), maximumBatchingWindowInSeconds: z.number().int().min(0).max(300).optional(), startingPosition: z.enum(['TRIM_HORIZON', 'LATEST', 'AT_TIMESTAMP']).optional(), - startingPositionTimestamp: z.iso - .datetime({ offset: true, message: 'startingPositionTimestamp must be an ISO 8601 datetime' }) - .optional(), + startingPositionTimestamp: isoDateTimeSchema({ + offset: true, + error: 'startingPositionTimestamp must be an ISO 8601 datetime', + }).optional(), parallelizationFactor: z.number().int().min(1).max(10).optional(), maximumRecordAgeInSeconds: z.number().int().min(-1).max(604800).optional(), maximumRetryAttempts: z.number().int().min(-1).max(10000).optional(), diff --git a/apps/sim/lib/api/contracts/v2/shared.ts b/apps/sim/lib/api/contracts/v2/shared.ts index d73c885d5fd..73a68de891d 100644 --- a/apps/sim/lib/api/contracts/v2/shared.ts +++ b/apps/sim/lib/api/contracts/v2/shared.ts @@ -1,5 +1,5 @@ import { z } from 'zod' -import { workspaceIdSchema } from '@/lib/api/contracts/primitives' +import { isoDateTimeSchema, workspaceIdSchema } from '@/lib/api/contracts/primitives' import { LIST_SORT_ORDERS, type ListSortOrder } from '@/lib/api/list-query' import { FORBIDDEN_DETAIL_CODES } from '@/lib/core/application/forbidden' import { @@ -390,7 +390,7 @@ export function v2PaginationFields(options: V2LimitOptions = {}) { * and fail inside the driver's timestamp mapper — a caller-reachable 500. * Validating the format here is what keeps that a 400. * - * The form is `z.datetime()`, which is UTC-only: a date with no time + * The form is {@link isoDateTimeSchema} without `offset`, which is UTC-only: a date with no time * (`2026-08-06`) and an offset-bearing timestamp (`2026-08-06T00:00:00+02:00`) * are both rejected. `GET /logs` and `GET /workflows/{workflowId}/runs` are sibling * reads over the same runs, so the same timestamp must work on both — sharing @@ -408,9 +408,9 @@ export function v2PaginationFields(options: V2LimitOptions = {}) { */ export function v2RunWindowBoundSchema(field: 'startDate' | 'endDate') { const boundary = field === 'startDate' ? 'at or after' : 'at or before' - return z - .string() - .datetime({ error: `${field} must be a UTC ISO 8601 timestamp, e.g. 2026-08-06T00:00:00Z` }) + return isoDateTimeSchema({ + error: `${field} must be a UTC ISO 8601 timestamp, e.g. 2026-08-06T00:00:00Z`, + }) .refine((value) => new Date(value).getUTCFullYear() >= 1, { error: `${field} must name a storable instant; there is no year 0000`, }) diff --git a/apps/sim/lib/api/contracts/webhooks.ts b/apps/sim/lib/api/contracts/webhooks.ts index 25597f9281f..a156e9ecb80 100644 --- a/apps/sim/lib/api/contracts/webhooks.ts +++ b/apps/sim/lib/api/contracts/webhooks.ts @@ -1,4 +1,5 @@ import { z } from 'zod' +import { isoDateTimeSchema } from '@/lib/api/contracts/primitives' import { defineRouteContract } from '@/lib/api/contracts/types' export const webhooksRouteQuerySchema = z.object({ @@ -353,7 +354,7 @@ export const quickBooksWebhookEventSchema = z.object({ source: z.string().min(1).max(2048), type: z.string().min(1).max(255), datacontenttype: z.string().min(1).max(255).optional(), - time: z.string().datetime({ offset: true }), + time: isoDateTimeSchema({ offset: true }), intuitentityid: z.string().min(1).max(255), intuitaccountid: z.string().min(1).max(255), data: z.unknown().optional(), diff --git a/apps/sim/lib/api/contracts/workspace-files.ts b/apps/sim/lib/api/contracts/workspace-files.ts index 3dc8ba11c6c..f3eb90f2a7a 100644 --- a/apps/sim/lib/api/contracts/workspace-files.ts +++ b/apps/sim/lib/api/contracts/workspace-files.ts @@ -4,6 +4,7 @@ import { folderIdSchema, inlineFileRefQuerySchema, isCanonicalBase64, + isoDateTimeSchema, workspaceFileNameSchema, workspaceIdSchema, } from '@/lib/api/contracts/primitives' @@ -60,7 +61,7 @@ export const updateWorkspaceFileContentBodySchema = z content: z.string().max(70_000_000, 'Content is too large'), encoding: z.enum(['base64', 'utf-8']).optional(), /** The content-version timestamp returned with the bytes this edit was based on. */ - expectedUpdatedAt: z.iso.datetime().optional(), + expectedUpdatedAt: isoDateTimeSchema().optional(), }) .superRefine(({ content, encoding }, ctx) => { if (encoding === 'base64' && !isCanonicalBase64(content)) { diff --git a/apps/sim/lib/api/mcp/catalog.test.ts b/apps/sim/lib/api/mcp/catalog.test.ts index 54cab3aa78c..4b0982588f6 100644 --- a/apps/sim/lib/api/mcp/catalog.test.ts +++ b/apps/sim/lib/api/mcp/catalog.test.ts @@ -50,6 +50,7 @@ describe('Sim MCP catalog', () => { `${name} ${slot}` ).toBeGreaterThan(0) expect(description.input[slot]).not.toHaveProperty('$schema') + expect(description.input[slot], `${name} ${slot}`).not.toHaveProperty('$ref') } } }, 120_000) @@ -59,4 +60,8 @@ describe('Sim MCP catalog', () => { expect(callerHeaderNames('listTables')).toEqual([]) expect((await describeOperation('listTables')).input.headers).toBeUndefined() }) + + it('exposes the headers of a contract whose header schema carries a component id', () => { + expect(callerHeaderNames('executeWorkflow')).toEqual(['x-run-id', 'x-sim-via']) + }) }) diff --git a/apps/sim/lib/api/mcp/catalog.ts b/apps/sim/lib/api/mcp/catalog.ts index c89c18c1d1b..53c104c3d0a 100644 --- a/apps/sim/lib/api/mcp/catalog.ts +++ b/apps/sim/lib/api/mcp/catalog.ts @@ -1,3 +1,4 @@ +import { inlineRootRef } from '@sim/utils/json-schema' import { omit, toRecord } from '@sim/utils/object' import { z } from 'zod' import type { ApiSchema } from '@/lib/api/contracts/types' @@ -194,7 +195,9 @@ export async function searchOperations(options: { } function toJsonSchema(schema: ApiSchema): JsonSchema { - const { $schema: _, ...json } = z.toJSONSchema(schema, { io: 'input', unrepresentable: 'any' }) + const { $schema: _, ...json } = inlineRootRef( + z.toJSONSchema(schema, { io: 'input', unrepresentable: 'any' }) + ) return json } diff --git a/apps/sim/lib/internal/buffer/input.ts b/apps/sim/lib/internal/buffer/input.ts index ed126bfb2b9..ade0a5f1553 100644 --- a/apps/sim/lib/internal/buffer/input.ts +++ b/apps/sim/lib/internal/buffer/input.ts @@ -1,4 +1,5 @@ import { z } from 'zod' +import { isoDateTimeSchema } from '@/lib/api/contracts/primitives' import { FileInputSchema } from '@/lib/uploads/utils/file-schemas' import { parseBufferInput } from '@/tools/buffer/schema' @@ -27,9 +28,7 @@ const assetsInput = z.unknown().transform((value, ctx) => { const sharedFields = { apiKey: z.string().min(1, 'API key is required'), text: z.string().max(50000, 'text is too long').optional().nullable(), - dueAt: z - .string() - .datetime({ offset: true, message: 'dueAt must be an ISO 8601 timestamp' }) + dueAt: isoDateTimeSchema({ offset: true, error: 'dueAt must be an ISO 8601 timestamp' }) .optional() .nullable(), saveToDraft: z.boolean().optional().nullable(), diff --git a/apps/sim/lib/internal/resend/schema.ts b/apps/sim/lib/internal/resend/schema.ts index b818c98da8c..255c19c82a6 100644 --- a/apps/sim/lib/internal/resend/schema.ts +++ b/apps/sim/lib/internal/resend/schema.ts @@ -1,4 +1,5 @@ import { z } from 'zod' +import { isoDateTimeSchema } from '@/lib/api/contracts/primitives' export const resendSendInputSchema = z.object({ fromAddress: z.string().min(1, 'From address is required'), @@ -19,7 +20,7 @@ export const resendSendInputSchema = z.object({ .union([z.string().min(1), z.array(z.string().min(1))]) .optional() .nullable(), - scheduledAt: z.string().datetime().optional().nullable(), + scheduledAt: isoDateTimeSchema().optional().nullable(), tags: z.string().optional().nullable(), }) diff --git a/apps/sim/lib/internal/sailpoint/schema.ts b/apps/sim/lib/internal/sailpoint/schema.ts index abde70b0b8b..30fd2595139 100644 --- a/apps/sim/lib/internal/sailpoint/schema.ts +++ b/apps/sim/lib/internal/sailpoint/schema.ts @@ -1,5 +1,6 @@ import { isRecordLike } from '@sim/utils/object' import { z } from 'zod' +import { isoDateTimeSchema } from '@/lib/api/contracts/primitives' import { FileInputSchema } from '@/lib/uploads/utils/file-schemas' const MAX_ID_LENGTH = 1024 @@ -134,8 +135,8 @@ const requestedItemSchema = z.object({ type: z.enum(['ACCESS_PROFILE', 'ROLE', 'ENTITLEMENT']), id: requiredString('Requested item ID'), comment: optionalString(10_000), - removeDate: z.string().datetime({ offset: true }).optional(), - startDate: z.string().datetime({ offset: true }).optional(), + removeDate: isoDateTimeSchema({ offset: true }).optional(), + startDate: isoDateTimeSchema({ offset: true }).optional(), assignmentId: optionalString(MAX_ID_LENGTH).nullable(), nativeIdentity: optionalString(10_000).nullable(), formInstanceId: optionalString(MAX_ID_LENGTH).nullable(), @@ -180,13 +181,13 @@ const reviewDecisionSchema = z .object({ id: requiredString('Review item ID'), decision: z.enum(['APPROVE', 'REVOKE']), - proposedEndDate: z.string().datetime({ offset: true }).optional(), + proposedEndDate: isoDateTimeSchema({ offset: true }).optional(), bulk: z.boolean(), recommendation: z .object({ recommendation: z.string().nullable().optional(), reasons: z.array(z.string().max(10_000)).max(100).optional(), - timestamp: z.string().datetime({ offset: true }).optional(), + timestamp: isoDateTimeSchema({ offset: true }).optional(), }) .nullable() .optional(), diff --git a/apps/sim/lib/mothership/chat/post.ts b/apps/sim/lib/mothership/chat/post.ts index e0ed949b5c4..cbacdeea68c 100644 --- a/apps/sim/lib/mothership/chat/post.ts +++ b/apps/sim/lib/mothership/chat/post.ts @@ -11,6 +11,7 @@ import { } from '@/lib/api/contracts/knowledge/search' import { chatContextSchema } from '@/lib/api/contracts/mothership-chat-context' import { mothershipResourceAttachmentSchema as ResourceAttachmentSchema } from '@/lib/api/contracts/mothership-resources' +import { isoDateTimeSchema } from '@/lib/api/contracts/primitives' import { isZodError, validationErrorResponse } from '@/lib/api/server' import { getSession } from '@/lib/auth' import { @@ -182,7 +183,7 @@ const ChatMessageSchema = z .max(253) .regex(/^[a-z0-9.-]+$/), evidence: z.enum(['sign-in-completed', 'cookies']), - lastObservedAt: z.string().datetime(), + lastObservedAt: isoDateTimeSchema(), }) ) .max(20) diff --git a/apps/sim/lib/mothership/generated/tool-catalog-v1.ts b/apps/sim/lib/mothership/generated/tool-catalog-v1.ts index 2ece49b3f3c..2327c716548 100644 --- a/apps/sim/lib/mothership/generated/tool-catalog-v1.ts +++ b/apps/sim/lib/mothership/generated/tool-catalog-v1.ts @@ -6053,7 +6053,7 @@ export const SearchWorkspace: ToolCatalogEntry = { type: 'string', format: 'date-time', pattern: - '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', + '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', }, endDate: { description: @@ -6061,7 +6061,7 @@ export const SearchWorkspace: ToolCatalogEntry = { type: 'string', format: 'date-time', pattern: - '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', + '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', }, sortBy: { description: @@ -6080,14 +6080,14 @@ export const SearchWorkspace: ToolCatalogEntry = { type: 'string', format: 'date-time', pattern: - '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', + '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', }, modifiedBefore: { description: 'ISO datetime; restricts results to documents modified before this time.', type: 'string', format: 'date-time', pattern: - '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', + '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', }, documentIds: { description: diff --git a/apps/sim/lib/mothership/generated/tool-schemas-v1.ts b/apps/sim/lib/mothership/generated/tool-schemas-v1.ts index 7b184bd3fd3..00b4b4a8ed3 100644 --- a/apps/sim/lib/mothership/generated/tool-schemas-v1.ts +++ b/apps/sim/lib/mothership/generated/tool-schemas-v1.ts @@ -5993,7 +5993,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { type: 'string', format: 'date-time', pattern: - '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', + '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', }, endDate: { description: @@ -6001,7 +6001,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { type: 'string', format: 'date-time', pattern: - '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', + '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', }, sortBy: { description: @@ -6020,14 +6020,14 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { type: 'string', format: 'date-time', pattern: - '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', + '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', }, modifiedBefore: { description: 'ISO datetime; restricts results to documents modified before this time.', type: 'string', format: 'date-time', pattern: - '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', + '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$', }, documentIds: { description: diff --git a/apps/sim/lib/table/analytics/schema.ts b/apps/sim/lib/table/analytics/schema.ts index 3e001094ff9..35dc0d036be 100644 --- a/apps/sim/lib/table/analytics/schema.ts +++ b/apps/sim/lib/table/analytics/schema.ts @@ -1,5 +1,6 @@ import { getErrorMessage } from '@sim/utils/errors' import { z } from 'zod' +import { isoDateTimeSchema } from '@/lib/api/contracts/primitives' import { FILTER_OPS } from '@/lib/table/constants' import { normalizeTablePredicate } from '@/lib/table/query-builder/predicate' import { validatePredicateShape } from '@/lib/table/query-builder/validate' @@ -82,8 +83,8 @@ export const analyticsSelectionSchema = z export const analyticsQuerySchema = analyticsSelectionSchema .extend({ - from: z.iso.datetime({ offset: true }), - to: z.iso.datetime({ offset: true }), + from: isoDateTimeSchema({ offset: true }), + to: isoDateTimeSchema({ offset: true }), }) .superRefine((value, ctx) => { const fail = (message: string) => ctx.addIssue({ code: 'custom', message }) diff --git a/apps/sim/lib/table/ttl-values.ts b/apps/sim/lib/table/ttl-values.ts index 96896ab95f0..27bfcbe94b1 100644 --- a/apps/sim/lib/table/ttl-values.ts +++ b/apps/sim/lib/table/ttl-values.ts @@ -1,15 +1,15 @@ -import { z } from 'zod' +import { ISO_DATETIME_OFFSET_REGEX, isoDateTimeSchema } from '@/lib/api/contracts/primitives' export const TTL_FORMAT_ERROR = 'Expiration must be an ISO timestamp with Z or an explicit UTC offset (for example, 2026-09-07T14:30:00-07:00), with at most 6 fractional second digits' /** Zod owns the ISO format; SQL also checks native timestamptz validity before casting. */ export const TTL_TIMESTAMP_VALIDATION = { - pattern: z.regexes.datetime({ offset: true }).source, + pattern: ISO_DATETIME_OFFSET_REGEX.source, maxFractionDigits: 6, } as const -const timestampSchema = z.iso.datetime({ offset: true }) +const timestampSchema = isoDateTimeSchema({ offset: true }) function parseTtlTimestamp(value: unknown) { if (typeof value !== 'string' || value !== value.trim()) return null diff --git a/apps/sim/package.json b/apps/sim/package.json index a9b5db56c7b..b219f6be2f5 100644 --- a/apps/sim/package.json +++ b/apps/sim/package.json @@ -281,7 +281,7 @@ "y-protocols": "1.0.7", "yauzl": "3.4.0", "yjs": "13.6.33", - "zod": "4.3.6", + "zod": "4.6.7", "zustand": "^5.0.15" }, "devDependencies": { diff --git a/bun.lock b/bun.lock index 264cbaac58d..036b72461a3 100644 --- a/bun.lock +++ b/bun.lock @@ -34,7 +34,7 @@ "unified": "11.0.5", "unist-util-visit": "5.1.0", "vitest": "^5.0.4", - "zod": "4.3.6", + "zod": "4.6.7", }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.4.1", @@ -110,7 +110,7 @@ "remark-gfm": "4.0.1", "shiki": "4.5.0", "streamdown": "2.5.0", - "zod": "4.3.6", + "zod": "4.6.7", }, "devDependencies": { "@playwright/test": "1.61.1", @@ -153,7 +153,7 @@ "socket.io": "^4.8.4", "y-protocols": "1.0.7", "yjs": "13.6.33", - "zod": "4.3.6", + "zod": "4.6.7", }, "devDependencies": { "@sim/testing": "workspace:*", @@ -395,7 +395,7 @@ "y-protocols": "1.0.7", "yauzl": "3.4.0", "yjs": "13.6.33", - "zod": "4.3.6", + "zod": "4.6.7", "zustand": "^5.0.15", }, "devDependencies": { @@ -534,7 +534,7 @@ "@sim/terminal-protocol": "workspace:*", "@sim/utils": "workspace:*", "micromatch": "4.0.8", - "zod": "4.3.6", + "zod": "4.6.7", }, "devDependencies": { "@sim/tsconfig": "workspace:*", @@ -550,7 +550,7 @@ "@sim/utils": "workspace:*", "clsx": "^2.1.1", "tailwind-merge": "3.7.0", - "zod": "4.3.6", + "zod": "4.6.7", }, "devDependencies": { "@radix-ui/react-avatar": "1.3.1", @@ -638,7 +638,7 @@ "name": "@sim/realtime-protocol", "version": "0.1.0", "dependencies": { - "zod": "4.3.6", + "zod": "4.6.7", }, "devDependencies": { "@sim/tsconfig": "workspace:*", @@ -893,7 +893,7 @@ "socket.io-parser": "4.2.7", "source-map-js": "1.2.2", "ws": "8.21.3", - "zod": "4.3.6", + "zod": "4.6.7", }, "packages": { "@1password/sdk": ["@1password/sdk@0.5.0", "", { "dependencies": { "@1password/sdk-core": "0.5.0" } }, "sha512-k6kov3pcA7PRg2tev9CgTfEf/3JSyAp11BPQNCEsqAD32QbqM032OXC1rfjyC8Ba0sfH+NHYZxcifUZToyGyYA=="], @@ -4852,7 +4852,7 @@ "zip-stream": ["zip-stream@7.0.5", "", { "dependencies": { "compress-commons": "^7.0.0", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-dSvYKdvLsAHCDqPOhIwk/q5CvuWtTB3Dgpoe0uVEFjTzIOAmsQpprX25InCvrvJsirEbu1OHyy67n/kAj1Sw/w=="], - "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + "zod": ["zod@4.6.7", "", {}, "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg=="], "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], diff --git a/package.json b/package.json index 78ea6bb3339..56ddac270d8 100644 --- a/package.json +++ b/package.json @@ -145,7 +145,7 @@ "minimatch": "10.2.6", "marked": "18.0.11", "mermaid": "11.16.1", - "zod": "4.3.6", + "zod": "4.6.7", "e2b": "2.50.0", "@ai-sdk/provider-utils": "3.0.28", "@grpc/grpc-js": "1.14.6", @@ -214,7 +214,7 @@ "unified": "11.0.5", "unist-util-visit": "5.1.0", "vitest": "^5.0.4", - "zod": "4.3.6" + "zod": "4.6.7" }, "lint-staged": { "*.{js,jsx,ts,tsx,json,css,scss}": [ diff --git a/packages/desktop-bridge/package.json b/packages/desktop-bridge/package.json index 29faed82fbe..846bf819b46 100644 --- a/packages/desktop-bridge/package.json +++ b/packages/desktop-bridge/package.json @@ -44,7 +44,7 @@ "@sim/terminal-protocol": "workspace:*", "@sim/utils": "workspace:*", "micromatch": "4.0.8", - "zod": "4.3.6" + "zod": "4.6.7" }, "devDependencies": { "@sim/tsconfig": "workspace:*", diff --git a/packages/emcn/package.json b/packages/emcn/package.json index 734ca605ac8..7f2cc2d40b9 100644 --- a/packages/emcn/package.json +++ b/packages/emcn/package.json @@ -43,7 +43,7 @@ "@sim/utils": "workspace:*", "clsx": "^2.1.1", "tailwind-merge": "3.7.0", - "zod": "4.3.6" + "zod": "4.6.7" }, "peerDependencies": { "@radix-ui/react-avatar": "^1.1.10", diff --git a/packages/realtime-protocol/package.json b/packages/realtime-protocol/package.json index 8db1ec9ec38..42373f1f600 100644 --- a/packages/realtime-protocol/package.json +++ b/packages/realtime-protocol/package.json @@ -49,7 +49,7 @@ "format:check": "biome format ." }, "dependencies": { - "zod": "4.3.6" + "zod": "4.6.7" }, "devDependencies": { "@sim/tsconfig": "workspace:*", diff --git a/packages/utils/package.json b/packages/utils/package.json index f27d613b91b..bbce3b3ecbe 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -46,6 +46,10 @@ "types": "./src/fractional-indexing.ts", "default": "./src/fractional-indexing.ts" }, + "./json-schema": { + "types": "./src/json-schema.ts", + "default": "./src/json-schema.ts" + }, "./object": { "types": "./src/object.ts", "default": "./src/object.ts" diff --git a/packages/utils/src/json-schema.ts b/packages/utils/src/json-schema.ts new file mode 100644 index 00000000000..5638a7287d4 --- /dev/null +++ b/packages/utils/src/json-schema.ts @@ -0,0 +1,48 @@ +import { isRecordLike, omit } from '@sim/utils/object' + +const DEFINITION_KEYWORDS = ['$defs', 'definitions'] as const + +function decodePointerSegment(segment: string): string { + return segment.replaceAll('~1', '/').replaceAll('~0', '~') +} + +function referencesRef(value: unknown, ref: string): boolean { + if (Array.isArray(value)) return value.some((entry) => referencesRef(entry, ref)) + if (!isRecordLike(value)) return false + return Object.entries(value).some( + ([key, entry]) => (key === '$ref' && entry === ref) || referencesRef(entry, ref) + ) +} + +/** + * Inlines a JSON Schema whose root is nothing but a `$ref` into its own + * definitions, the shape `z.toJSONSchema` (zod 4.6+) emits for a root schema + * carrying `.meta({ id })`. The referenced definition becomes the root body and + * stays in `$defs`/`definitions` only while something still references it, so + * a recursive schema keeps resolving. A schema whose root is not such a local + * reference is returned unchanged. + */ +export function inlineRootRef(schema: Record): Record { + const ref = schema.$ref + if (typeof ref !== 'string') return schema + for (const keyword of DEFINITION_KEYWORDS) { + const prefix = `#/${keyword}/` + if (!ref.startsWith(prefix)) continue + const definitions = schema[keyword] + if (!isRecordLike(definitions)) return schema + const name = decodePointerSegment(ref.slice(prefix.length)) + const root = definitions[name] + if (!isRecordLike(root)) return schema + + const { $ref: _ref, $schema, [keyword]: _definitions, ...siblings } = schema + const body = { ...root, ...siblings } + const others = omit(definitions, [name]) + const remaining = referencesRef([body, others], ref) ? definitions : others + return { + ...($schema === undefined ? {} : { $schema }), + ...body, + ...(Object.keys(remaining).length > 0 ? { [keyword]: remaining } : {}), + } + } + return schema +} diff --git a/scripts/check-openapi-specs.ts b/scripts/check-openapi-specs.ts index 250973e12fc..03e11455e53 100644 --- a/scripts/check-openapi-specs.ts +++ b/scripts/check-openapi-specs.ts @@ -40,6 +40,7 @@ import { readdirSync, readFileSync } from 'node:fs' import path from 'node:path' +import { inlineRootRef } from '@sim/utils/json-schema' import Ajv2020 from 'ajv/dist/2020' import { z } from 'zod' import { OPENAPI_SPEC_FILES } from '../apps/docs/lib/openapi-specs' @@ -268,12 +269,14 @@ const jsonSchemaCache = new WeakMap>() function toJsonSchema(schema: z.ZodType, io: SchemaIo): Json { const cached = jsonSchemaCache.get(schema)?.get(io) if (cached) return cached - const converted = z.toJSONSchema(schema, { - io, - target: 'draft-2020-12', - unrepresentable: 'any', - cycles: 'ref', - }) as Json + const converted = inlineRootRef( + z.toJSONSchema(schema, { + io, + target: 'draft-2020-12', + unrepresentable: 'any', + cycles: 'ref', + }) + ) const byIo = jsonSchemaCache.get(schema) ?? new Map() byIo.set(io, converted) jsonSchemaCache.set(schema, byIo) diff --git a/scripts/generate-v2-cli-api.ts b/scripts/generate-v2-cli-api.ts index 4b9af6376a0..987654c4a0c 100644 --- a/scripts/generate-v2-cli-api.ts +++ b/scripts/generate-v2-cli-api.ts @@ -30,6 +30,7 @@ import { spawnSync } from 'node:child_process' import { readdirSync, readFileSync, writeFileSync } from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' +import { inlineRootRef } from '@sim/utils/json-schema' import { z } from 'zod' const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') @@ -255,6 +256,26 @@ export async function collectOperations(): Promise { type JsonSchema = Record +/** + * A contract schema as JSON Schema, with a component-id'd root inlined rather + * than referenced, and a `.meta({ default })` kept on the input side of a + * transforming schema, where zod would otherwise drop it. + */ +function toJsonSchema(schema: z.ZodType, io: 'input' | 'output' = 'input'): JsonSchema { + return inlineRootRef( + z.toJSONSchema(schema, { + io, + unrepresentable: 'any', + override: ({ zodSchema, jsonSchema }) => { + const metaDefault = z.globalRegistry.get(zodSchema)?.default + if (metaDefault !== undefined && jsonSchema.default === undefined) { + jsonSchema.default = metaDefault + } + }, + }) + ) +} + /** * Emits a TypeScript type for the subset of JSON Schema that `z.toJSONSchema` * produces from these contracts. @@ -293,6 +314,12 @@ function toTypeScript(schema: JsonSchema, indent = 0, refs?: Map return schema.allOf.map((v: JsonSchema) => toTypeScript(v, indent, refs)).join(' & ') } + if (Array.isArray(schema.type)) { + return schema.type + .map((type: string) => toTypeScript({ ...schema, type }, indent, refs)) + .join(' | ') + } + switch (schema.type) { case 'string': return 'string' @@ -350,7 +377,7 @@ interface GeneratedType { } function schemaToType(schema: z.ZodType, io: 'input' | 'output', name: string): GeneratedType { - const json = z.toJSONSchema(schema, { io, unrepresentable: 'any' }) as JsonSchema + const json = toJsonSchema(schema, io) const defs = json.$defs as Record | undefined if (!defs) return { type: toTypeScript(json), declarations: [] } @@ -381,7 +408,7 @@ function pathParams(routePath: string): string[] { function pathParamDocs(schema: z.ZodType | undefined): Record { if (!schema) return {} - const json = z.toJSONSchema(schema, { io: 'input', unrepresentable: 'any' }) as JsonSchema + const json = toJsonSchema(schema) const docs: Record = {} for (const [key, property] of Object.entries(json.properties ?? {})) { @@ -453,7 +480,7 @@ function fieldKind(schema: JsonSchema): FieldKind { * runtime still has to know the rest of the body must come in as JSON. */ function isUnionSlot(schema: z.ZodType): boolean { - const json = z.toJSONSchema(schema, { io: 'input', unrepresentable: 'any' }) as JsonSchema + const json = toJsonSchema(schema) return Object.keys(json.properties ?? {}).length === 0 && Boolean(json.anyOf ?? json.oneOf) } @@ -467,17 +494,12 @@ function discriminatedSlot(schema: z.ZodType) { if (!(option instanceof z.ZodObject)) return null for (const [field, value] of Object.entries(option.shape)) { if (field === discriminator) continue - const kind = fieldKind( - z.toJSONSchema(value as z.ZodType, { io: 'input', unrepresentable: 'any' }) as JsonSchema - ) + const kind = fieldKind(toJsonSchema(value as z.ZodType)) const previous = fieldKinds.get(field) if (previous && previous !== kind) return null fieldKinds.set(field, kind) } - const tag = z.toJSONSchema(option.shape[discriminator], { - io: 'input', - unrepresentable: 'any', - }) as JsonSchema + const tag = toJsonSchema(option.shape[discriminator]) const values: unknown[] = tag.enum ?? (tag.const !== undefined ? [tag.const] : []) if (!values.length || values.some((value) => typeof value !== 'string')) return null for (const value of values) variants.push({ value: value as string, schema: option }) @@ -521,7 +543,7 @@ export function renderSlotMap( ): string | null { if (!schema) return null - const json = z.toJSONSchema(schema, { io: 'input', unrepresentable: 'any' }) as JsonSchema + const json = toJsonSchema(schema) let properties: Record = json.properties ?? {} let required = new Set(json.required ?? []) const discriminated = discriminatedSlot(schema) diff --git a/scripts/openapi/generator.ts b/scripts/openapi/generator.ts index a233ace8868..85bcb37541c 100644 --- a/scripts/openapi/generator.ts +++ b/scripts/openapi/generator.ts @@ -1,3 +1,4 @@ +import { inlineRootRef } from '@sim/utils/json-schema' import { omit } from '@sim/utils/object' import Ajv2020 from 'ajv/dist/2020' import { z } from 'zod' @@ -137,13 +138,15 @@ function comparableSchema(schema: ApiSchema, io: SchemaIo): unknown { const comparable = stripSchemaDocumentation( sanitizeSchema( - z.toJSONSchema(schema, { - io, - target: 'draft-2020-12', - unrepresentable: 'any', - cycles: 'ref', - reused: 'inline', - }) + inlineRootRef( + z.toJSONSchema(schema, { + io, + target: 'draft-2020-12', + unrepresentable: 'any', + cycles: 'ref', + reused: 'inline', + }) + ) ) ) const byIo = comparableSchemaCache.get(schema) ?? new Map() @@ -226,20 +229,26 @@ function generateSchema( const metadata = schemaMetadata(schema, label) let generatedWithDefinitions = generatedSchemaCache.get(schema)?.get(io) if (!generatedWithDefinitions) { - generatedWithDefinitions = z.toJSONSchema(schema, { - io, - target: 'draft-2020-12', - unrepresentable: 'any', - cycles: 'ref', - reused: 'inline', - override: ({ zodSchema, jsonSchema, path }) => { - const current = zodSchema as ApiSchema - const metadata = z.globalRegistry.get(current) - const schemaLabel = `${label} at ${path.join('.') || ''}` - validateExamples(current, metadata?.examples, io, schemaLabel) - omitEnumValuesFromOpenApi(metadata, jsonSchema as JsonObject, schemaLabel) - }, - }) as JsonObject + generatedWithDefinitions = inlineRootRef( + z.toJSONSchema(schema, { + io, + target: 'draft-2020-12', + unrepresentable: 'any', + cycles: 'ref', + reused: 'inline', + override: ({ zodSchema, jsonSchema, path }) => { + const current = zodSchema as ApiSchema + const metadata = z.globalRegistry.get(current) + const schemaLabel = `${label} at ${path.join('.') || ''}` + validateExamples(current, metadata?.examples, io, schemaLabel) + omitEnumValuesFromOpenApi(metadata, jsonSchema as JsonObject, schemaLabel) + // zod drops `default` from a transforming schema's input side, even one authored in `.meta()` + if (metadata?.default !== undefined && jsonSchema.default === undefined) { + jsonSchema.default = metadata.default + } + }, + }) + ) const byIo = generatedSchemaCache.get(schema) ?? new Map() byIo.set(io, generatedWithDefinitions) generatedSchemaCache.set(schema, byIo) @@ -934,11 +943,13 @@ export function generateOpenApiDocument(definition: OpenApiDocumentDefinition): { description: metadata.description, schema: sanitizeSchema( - z.toJSONSchema(header.schema, { - io: 'output', - unrepresentable: 'throw', - cycles: 'throw', - }) + inlineRootRef( + z.toJSONSchema(header.schema, { + io: 'output', + unrepresentable: 'throw', + cycles: 'throw', + }) + ) ), }, ] From 76f524aa5668573b449b21ce5a079f8d4bfe77a3 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Mon, 26 Oct 2026 16:58:17 -0700 Subject: [PATCH 2/2] fix(deps): keep absent unknown/any keys accepted under zod 4.6 --- apps/sim/lib/api/contracts/admin.ts | 3 +- apps/sim/lib/api/contracts/audit-logs.ts | 4 +- .../lib/api/contracts/knowledge/documents.ts | 6 +-- apps/sim/lib/api/contracts/logs.ts | 7 ++-- apps/sim/lib/api/contracts/memory.ts | 4 +- apps/sim/lib/api/contracts/organization.ts | 3 +- apps/sim/lib/api/contracts/primitives.test.ts | 17 +++++++++ apps/sim/lib/api/contracts/primitives.ts | 11 ++++++ apps/sim/lib/api/contracts/subscription.ts | 4 +- .../api/contracts/tools/aws/lambda-invoke.ts | 3 +- .../sim/lib/api/contracts/tools/confluence.ts | 3 +- .../lib/api/contracts/tools/crowdstrike.ts | 3 +- apps/sim/lib/api/contracts/tools/jsm.ts | 3 +- apps/sim/lib/api/contracts/tools/workday.ts | 7 ++-- apps/sim/lib/api/contracts/v1/admin/shared.ts | 3 +- .../lib/api/contracts/v1/admin/workflows.ts | 3 +- apps/sim/lib/api/contracts/v1/audit-logs.ts | 3 +- .../lib/api/contracts/v1/knowledge/index.ts | 4 +- apps/sim/lib/api/contracts/v1/tables/index.ts | 4 +- apps/sim/lib/api/contracts/v1/workflows.ts | 5 ++- apps/sim/lib/api/contracts/v2/audit-logs.ts | 3 +- apps/sim/lib/api/contracts/v2/catalog.ts | 5 ++- apps/sim/lib/api/contracts/v2/logs.ts | 29 +++++++++------ apps/sim/lib/api/contracts/v2/workflows.ts | 37 ++++++++++++------- .../lib/api/contracts/workflow-comparison.ts | 8 +++- apps/sim/lib/api/contracts/workflows.ts | 9 +++-- apps/sim/lib/internal/llm/input.ts | 4 +- apps/sim/lib/internal/stagehand/schema.ts | 6 +-- apps/sim/lib/internal/zoominfo/schema.ts | 7 ++-- .../sim/lib/mothership/tools/server/router.ts | 3 +- apps/sim/lib/permission-groups/fields.ts | 15 +++++--- apps/sim/lib/workflow-tests/protocol.ts | 5 ++- packages/realtime-protocol/src/schemas.ts | 20 +++++++--- 33 files changed, 165 insertions(+), 86 deletions(-) diff --git a/apps/sim/lib/api/contracts/admin.ts b/apps/sim/lib/api/contracts/admin.ts index 2d4d57f0c55..323365dd6e5 100644 --- a/apps/sim/lib/api/contracts/admin.ts +++ b/apps/sim/lib/api/contracts/admin.ts @@ -1,4 +1,5 @@ import { z } from 'zod' +import { omittable } from '@/lib/api/contracts/primitives' import { workflowStateSchema } from '@/lib/api/contracts/workflows' import { workspacePermissionSchema } from '@/lib/api/contracts/workspaces' @@ -167,7 +168,7 @@ export const adminWorkflowVariableSchema = z.object({ id: z.string(), name: z.string(), type: z.enum(['string', 'number', 'boolean', 'object', 'array', 'plain']), - value: z.unknown(), + value: omittable(z.unknown()), }) export const adminWorkflowExportStateSchema = workflowStateSchema.extend({ diff --git a/apps/sim/lib/api/contracts/audit-logs.ts b/apps/sim/lib/api/contracts/audit-logs.ts index c2d7999ec60..c9e0ad9cbac 100644 --- a/apps/sim/lib/api/contracts/audit-logs.ts +++ b/apps/sim/lib/api/contracts/audit-logs.ts @@ -1,5 +1,5 @@ import { z } from 'zod' -import { organizationIdSchema, workspaceIdSchema } from '@/lib/api/contracts/primitives' +import { omittable, organizationIdSchema, workspaceIdSchema } from '@/lib/api/contracts/primitives' import { defineRouteContract } from '@/lib/api/contracts/types' export const auditLogsQuerySchema = z.object({ @@ -53,7 +53,7 @@ export const enterpriseAuditLogEntrySchema = z.object({ resourceId: z.string().nullable(), resourceName: z.string().nullable(), description: z.string().nullable(), - metadata: z.unknown(), + metadata: omittable(z.unknown()), createdAt: z.string(), }) diff --git a/apps/sim/lib/api/contracts/knowledge/documents.ts b/apps/sim/lib/api/contracts/knowledge/documents.ts index cf61931c859..17416d0b548 100644 --- a/apps/sim/lib/api/contracts/knowledge/documents.ts +++ b/apps/sim/lib/api/contracts/knowledge/documents.ts @@ -12,7 +12,7 @@ import { successResponseSchema, wireDateSchema, } from '@/lib/api/contracts/knowledge/shared' -import { privateSecretProvenanceBundleSchema } from '@/lib/api/contracts/primitives' +import { omittable, privateSecretProvenanceBundleSchema } from '@/lib/api/contracts/primitives' import { defineRouteContract } from '@/lib/api/contracts/types' import { PRIVATE_SECRET_PROVENANCE_FIELD } from '@/lib/execution/private-tool-metadata' import { @@ -29,7 +29,7 @@ export const documentTagFilterSchema = z tagSlot: z.string().min(1), fieldType: z.enum(['text', 'number', 'date', 'boolean']), operator: z.string().min(1), - value: z.unknown(), + value: omittable(z.unknown()), valueTo: z.unknown().optional(), }) .superRefine((filter, ctx) => { @@ -411,7 +411,7 @@ export const deleteKnowledgeDocumentContract = defineRouteContract({ params: knowledgeDocumentParamsSchema, response: { mode: 'json', - schema: successResponseSchema(z.unknown()), + schema: successResponseSchema(omittable(z.unknown())), }, }) diff --git a/apps/sim/lib/api/contracts/logs.ts b/apps/sim/lib/api/contracts/logs.ts index ecf6f2d147b..456478d1d18 100644 --- a/apps/sim/lib/api/contracts/logs.ts +++ b/apps/sim/lib/api/contracts/logs.ts @@ -2,6 +2,7 @@ import { z } from 'zod' import { booleanQueryFlagSchema, isoDateTimeSchema, + omittable, userFileSchema, } from '@/lib/api/contracts/primitives' import { defineRouteContract } from '@/lib/api/contracts/types' @@ -184,8 +185,8 @@ const blockExecutionSchema = z.object({ status: z.enum(['success', 'error', 'skipped']), errorMessage: z.string().optional(), errorStackTrace: z.string().optional(), - inputData: z.unknown(), - outputData: z.unknown(), + inputData: omittable(z.unknown()), + outputData: omittable(z.unknown()), cost: costSummarySchema.optional(), metadata: z.record(z.string(), z.unknown()).optional(), }) @@ -404,7 +405,7 @@ export const executionSnapshotDataSchema = z.object({ startedAt: z.string(), endedAt: z.string().optional(), totalDurationMs: z.number().nullable().optional(), - cost: z.unknown().nullable(), + cost: omittable(z.unknown().nullable()), totalTokens: z.number().nullable().optional(), }), }) diff --git a/apps/sim/lib/api/contracts/memory.ts b/apps/sim/lib/api/contracts/memory.ts index c0f1259cb06..d447bff94d4 100644 --- a/apps/sim/lib/api/contracts/memory.ts +++ b/apps/sim/lib/api/contracts/memory.ts @@ -1,5 +1,5 @@ import { z } from 'zod' -import { privateSecretProvenanceBundleSchema } from '@/lib/api/contracts/primitives' +import { omittable, privateSecretProvenanceBundleSchema } from '@/lib/api/contracts/primitives' import { defineRouteContract } from '@/lib/api/contracts/types' import { PRIVATE_SECRET_PROVENANCE_FIELD } from '@/lib/execution/private-tool-metadata' @@ -53,7 +53,7 @@ const memorySuccessResponseSchema = (dataSchema: T) => const memoryRecordSchema = z.object({ conversationId: z.string(), - data: z.unknown(), + data: omittable(z.unknown()), }) export const listMemoriesContract = defineRouteContract({ diff --git a/apps/sim/lib/api/contracts/organization.ts b/apps/sim/lib/api/contracts/organization.ts index db305b83b7b..fead2c412d8 100644 --- a/apps/sim/lib/api/contracts/organization.ts +++ b/apps/sim/lib/api/contracts/organization.ts @@ -1,5 +1,6 @@ import { z } from 'zod' import { + omittable, organizationRoleSchema, type PiiRedactionSettings, piiRedactionSettingsSchema, @@ -494,7 +495,7 @@ export const getOrganizationResponseSchema = z.object({ name: z.string(), slug: z.string(), logo: z.string().nullable(), - metadata: z.unknown().describe('Organization-defined JSON metadata.'), + metadata: omittable(z.unknown().describe('Organization-defined JSON metadata.')), createdAt: z.string(), updatedAt: z.string(), seats: organizationSeatInfoSchema.optional(), diff --git a/apps/sim/lib/api/contracts/primitives.test.ts b/apps/sim/lib/api/contracts/primitives.test.ts index 8b120de97ff..1c5939da4ee 100644 --- a/apps/sim/lib/api/contracts/primitives.test.ts +++ b/apps/sim/lib/api/contracts/primitives.test.ts @@ -5,6 +5,7 @@ import { isCanonicalBase64, isoDateTimeSchema, MAX_ID_LENGTH, + omittable, optionalNumberQuerySchema, organizationIdSchema, organizationRoleSchema, @@ -401,3 +402,19 @@ describe('isoDateTimeSchema', () => { }) }) }) + +describe('omittable', () => { + const schema = z.object({ value: omittable(z.unknown()) }) + + it('accepts an absent key without inventing one', () => { + const result = schema.safeParse({}) + expect(result.success).toBe(true) + expect(result.data).toEqual({}) + expect(schema.parse({ value: null })).toEqual({ value: null }) + }) + + it('keeps the key required in the published schema', () => { + expect(z.toJSONSchema(schema, { io: 'input' }).required).toEqual(['value']) + expect(z.toJSONSchema(schema, { io: 'output' }).required).toEqual(['value']) + }) +}) diff --git a/apps/sim/lib/api/contracts/primitives.ts b/apps/sim/lib/api/contracts/primitives.ts index abb9e99121b..beaf239040b 100644 --- a/apps/sim/lib/api/contracts/primitives.ts +++ b/apps/sim/lib/api/contracts/primitives.ts @@ -641,6 +641,17 @@ export const optionalNumberQuerySchema = z.preprocess((value) => { return typeof value === 'string' && value.trim() === '' ? undefined : value }, z.coerce.number().optional()) +/** + * An object key whose schema accepts `undefined` (`z.unknown()`, `z.any()`) that a sender may + * omit, as `JSON.stringify` does with an `undefined` value. Zod 4.6 rejects an absent key unless + * its schema is optional-in; `.optional()` would also make the key optional in the inferred type + * and drop it from JSON Schema `required`. A `.catch` that can never fire changes only the + * absent-key rule, so the type and the published schema stay as they were under zod 4.3. + */ +export function omittable>(schema: T) { + return schema.catch(undefined) +} + const ISO_DATE_SOURCE = z.regexes.date.source.slice(1, -1) const ISO_TIME_SOURCE = '(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?' const UTC_OFFSET_SOURCE = '([+-](?:[01]\\d|2[0-3]):[0-5]\\d)' diff --git a/apps/sim/lib/api/contracts/subscription.ts b/apps/sim/lib/api/contracts/subscription.ts index 8242b4ac1f3..a145e708e8f 100644 --- a/apps/sim/lib/api/contracts/subscription.ts +++ b/apps/sim/lib/api/contracts/subscription.ts @@ -1,5 +1,5 @@ import { z } from 'zod' -import { workspaceIdSchema } from '@/lib/api/contracts/primitives' +import { omittable, workspaceIdSchema } from '@/lib/api/contracts/primitives' import { defineRouteContract } from '@/lib/api/contracts/types' import { usageLimitReadSchema, @@ -76,7 +76,7 @@ export const subscriptionBillingDataSchema = z organizationId: z.string().nullable(), status: z.string().nullable(), seats: z.number().nullable(), - metadata: z.unknown().nullable(), + metadata: omittable(z.unknown().nullable()), stripeSubscriptionId: z.string().nullable(), periodEnd: z.string().nullable(), cancelAtPeriodEnd: z.boolean(), diff --git a/apps/sim/lib/api/contracts/tools/aws/lambda-invoke.ts b/apps/sim/lib/api/contracts/tools/aws/lambda-invoke.ts index e711f7a8c99..6ab87ef5a8b 100644 --- a/apps/sim/lib/api/contracts/tools/aws/lambda-invoke.ts +++ b/apps/sim/lib/api/contracts/tools/aws/lambda-invoke.ts @@ -1,4 +1,5 @@ import { z } from 'zod' +import { omittable } from '@/lib/api/contracts/primitives' import { lambdaConnectionFields } from '@/lib/api/contracts/tools/aws/lambda-shared' import type { ContractBody, @@ -31,7 +32,7 @@ const InvokeResponseSchema = z.object({ success: z.literal(true), output: z.object({ statusCode: z.number().nullable(), - payload: z.unknown(), + payload: omittable(z.unknown()), functionError: z.string().nullable(), logResult: z.string().nullable(), executedVersion: z.string().nullable(), diff --git a/apps/sim/lib/api/contracts/tools/confluence.ts b/apps/sim/lib/api/contracts/tools/confluence.ts index 482f7e67e3e..bc1f4f89893 100644 --- a/apps/sim/lib/api/contracts/tools/confluence.ts +++ b/apps/sim/lib/api/contracts/tools/confluence.ts @@ -1,4 +1,5 @@ import { z } from 'zod' +import { omittable } from '@/lib/api/contracts/primitives' import type { ContractBody, ContractQuery } from '@/lib/api/contracts/types' import { defineRouteContract } from '@/lib/api/contracts/types' import { validateAlphanumericId } from '@/lib/core/security/input-validation' @@ -148,7 +149,7 @@ export const confluenceListPagePropertiesQuerySchema = confluencePageScopedSchem export const confluenceCreatePagePropertyBodySchema = confluencePageScopedSchema.extend({ key: z.string({ error: 'Property key is required' }).min(1, 'Property key is required'), - value: z.unknown(), + value: omittable(z.unknown()), }) export const confluenceUpdatePagePropertyBodySchema = confluenceCreatePagePropertyBodySchema.extend( diff --git a/apps/sim/lib/api/contracts/tools/crowdstrike.ts b/apps/sim/lib/api/contracts/tools/crowdstrike.ts index 788983bd260..c89508c2f81 100644 --- a/apps/sim/lib/api/contracts/tools/crowdstrike.ts +++ b/apps/sim/lib/api/contracts/tools/crowdstrike.ts @@ -1,4 +1,5 @@ import { z } from 'zod' +import { omittable } from '@/lib/api/contracts/primitives' import type { ContractBody, ContractBodyInput, @@ -63,7 +64,7 @@ const crowdstrikeAggregateBucketSchema: z.ZodType diff --git a/apps/sim/lib/api/contracts/v1/admin/workflows.ts b/apps/sim/lib/api/contracts/v1/admin/workflows.ts index 8ef61531579..20ab9e1ecb3 100644 --- a/apps/sim/lib/api/contracts/v1/admin/workflows.ts +++ b/apps/sim/lib/api/contracts/v1/admin/workflows.ts @@ -3,6 +3,7 @@ import { activeDeploymentSummarySchema, deploymentOperationSummarySchema, } from '@/lib/api/contracts/deployments' +import { omittable } from '@/lib/api/contracts/primitives' import { type ContractJsonResponse, defineRouteContract } from '@/lib/api/contracts/types' import { adminV1ExportFormatQuerySchema, @@ -45,7 +46,7 @@ export const adminV1WorkflowVariableSchema = z.object({ id: z.string(), name: z.string(), type: z.enum(['string', 'number', 'boolean', 'object', 'array', 'plain']), - value: z.unknown(), + value: omittable(z.unknown()), }) export const adminV1WorkflowExportStateSchema = workflowStateSchema.extend({ diff --git a/apps/sim/lib/api/contracts/v1/audit-logs.ts b/apps/sim/lib/api/contracts/v1/audit-logs.ts index fc0dd538547..041f45b4c5a 100644 --- a/apps/sim/lib/api/contracts/v1/audit-logs.ts +++ b/apps/sim/lib/api/contracts/v1/audit-logs.ts @@ -1,4 +1,5 @@ import { z } from 'zod' +import { omittable } from '@/lib/api/contracts/primitives' import { defineRouteContract } from '@/lib/api/contracts/types' import { adminV1ListResponseSchema, @@ -67,7 +68,7 @@ const v1AuditLogEntrySchema = z.object({ resourceId: z.string().nullable(), resourceName: z.string().nullable(), description: z.string().nullable(), - metadata: z.unknown(), + metadata: omittable(z.unknown()), createdAt: z.string(), }) diff --git a/apps/sim/lib/api/contracts/v1/knowledge/index.ts b/apps/sim/lib/api/contracts/v1/knowledge/index.ts index 412fa140c2d..a1c842a370b 100644 --- a/apps/sim/lib/api/contracts/v1/knowledge/index.ts +++ b/apps/sim/lib/api/contracts/v1/knowledge/index.ts @@ -5,7 +5,7 @@ import { knowledgeDocumentParamsSchema, successResponseSchema, } from '@/lib/api/contracts/knowledge/shared' -import { requiredFieldSchema, workspaceIdSchema } from '@/lib/api/contracts/primitives' +import { omittable, requiredFieldSchema, workspaceIdSchema } from '@/lib/api/contracts/primitives' import { defineRouteContract } from '@/lib/api/contracts/types' import { DEFAULT_CHUNKING_CONFIG, @@ -205,7 +205,7 @@ export type V1UpdateKnowledgeBaseBody = z.output export type V1KnowledgeSearchBody = z.output -const v1KnowledgeApiResponseSchema = successResponseSchema(z.unknown()).passthrough() +const v1KnowledgeApiResponseSchema = successResponseSchema(omittable(z.unknown())).passthrough() export const v1ListKnowledgeBasesContract = defineRouteContract({ method: 'GET', diff --git a/apps/sim/lib/api/contracts/v1/tables/index.ts b/apps/sim/lib/api/contracts/v1/tables/index.ts index aa4490889f7..529bae4d6f8 100644 --- a/apps/sim/lib/api/contracts/v1/tables/index.ts +++ b/apps/sim/lib/api/contracts/v1/tables/index.ts @@ -1,6 +1,6 @@ import { isRecordLike } from '@sim/utils/object' import { z } from 'zod' -import { requiredFieldSchema, workspaceIdSchema } from '@/lib/api/contracts/primitives' +import { omittable, requiredFieldSchema, workspaceIdSchema } from '@/lib/api/contracts/primitives' import { createTableBodySchema, createTableColumnBodySchema, @@ -108,7 +108,7 @@ const successResponseSchema = (dataSchema: T) => data: dataSchema, }) -const v1TableApiResponseSchema = successResponseSchema(z.unknown()).passthrough() +const v1TableApiResponseSchema = successResponseSchema(omittable(z.unknown())).passthrough() export const v1ListTablesContract = defineRouteContract({ method: 'GET', diff --git a/apps/sim/lib/api/contracts/v1/workflows.ts b/apps/sim/lib/api/contracts/v1/workflows.ts index c840ee37c41..10491e3c7d0 100644 --- a/apps/sim/lib/api/contracts/v1/workflows.ts +++ b/apps/sim/lib/api/contracts/v1/workflows.ts @@ -6,6 +6,7 @@ import { } from '@/lib/api/contracts/deployments' import { booleanQueryFlagSchema, + omittable, versionNumberSchema, workspaceIdSchema, } from '@/lib/api/contracts/primitives' @@ -36,7 +37,7 @@ export type V1ListWorkflowsQuery = z.output */ const v1WorkflowApiResponseWithLimitsSchema = z .object({ - data: z.unknown(), + data: omittable(z.unknown()), limits: z.unknown().optional(), }) .passthrough() @@ -163,7 +164,7 @@ const v1WorkflowExportVariableSchema = z.object({ id: z.string(), name: z.string(), type: z.enum(['string', 'number', 'boolean', 'object', 'array', 'plain']), - value: z.unknown(), + value: omittable(z.unknown()), }) /** diff --git a/apps/sim/lib/api/contracts/v2/audit-logs.ts b/apps/sim/lib/api/contracts/v2/audit-logs.ts index de5ded5af94..e778f0a92b7 100644 --- a/apps/sim/lib/api/contracts/v2/audit-logs.ts +++ b/apps/sim/lib/api/contracts/v2/audit-logs.ts @@ -1,6 +1,7 @@ import { z } from 'zod' import { booleanQueryFlagSchema, + omittable, organizationIdSchema, workspaceIdSchema, } from '@/lib/api/contracts/primitives' @@ -64,7 +65,7 @@ export const v2AuditLogEntrySchema = z .describe('Affected resource ID. Null for folder events, which identify folders by path.'), resourceName: z.string().nullable().describe('Display name of the affected resource.'), description: z.string().nullable().describe('Human-readable description of the action.'), - metadata: z.unknown().describe('Additional JSON details specific to the action.'), + metadata: omittable(z.unknown().describe('Additional JSON details specific to the action.')), createdAt: z .string() .describe('ISO 8601 timestamp when the action occurred.') diff --git a/apps/sim/lib/api/contracts/v2/catalog.ts b/apps/sim/lib/api/contracts/v2/catalog.ts index dd905cd2008..0bb43a74117 100644 --- a/apps/sim/lib/api/contracts/v2/catalog.ts +++ b/apps/sim/lib/api/contracts/v2/catalog.ts @@ -2,6 +2,7 @@ import { z } from 'zod' import { booleanQueryFlagSchema, noInputSchema, + omittable, workspaceIdSchema, } from '@/lib/api/contracts/primitives' import { defineRouteContract } from '@/lib/api/contracts/types' @@ -494,7 +495,9 @@ export const v2ToolExecutionSchema = z .enum(['succeeded', 'failed']) .describe('Whether the tool reported success. A failed tool call is still a 200.'), // untyped-response: every tool declares its own output shape, already published by GET /api/v2/tools/{toolId} - output: z.unknown().describe('Whatever the tool produced, shaped by its declared outputs.'), + output: omittable( + z.unknown().describe('Whatever the tool produced, shaped by its declared outputs.') + ), error: z .object({ message: z.string().describe('Why the tool call did not succeed.') }) .nullable() diff --git a/apps/sim/lib/api/contracts/v2/logs.ts b/apps/sim/lib/api/contracts/v2/logs.ts index f5847eac519..75de54f3b1e 100644 --- a/apps/sim/lib/api/contracts/v2/logs.ts +++ b/apps/sim/lib/api/contracts/v2/logs.ts @@ -2,6 +2,7 @@ import { z } from 'zod' import { traceSpansSchema } from '@/lib/api/contracts/logs' import { booleanQueryFlagSchema, + omittable, runIdSchema, workspaceIdSchema, } from '@/lib/api/contracts/primitives' @@ -309,21 +310,25 @@ export const v2LogDetailSchema = z * generator refuses to emit undescribed, and the outer one documents the * union itself. Collapsing them to one fails `generate:openapi`. */ - finalOutput: z - .unknown() - .describe('Materialized final workflow output value.') - .nullable() - .describe('Materialized final workflow output, or null when none was produced.'), + finalOutput: omittable( + z + .unknown() + .describe('Materialized final workflow output value.') + .nullable() + .describe('Materialized final workflow output, or null when none was produced.') + ), cost: v2LogDetailCostSchema, // untyped-response: workflow input is the caller-supplied trigger payload, which has no server-side schema /** Doubly described for the reason `finalOutput` above is. */ - workflowInput: z - .unknown() - .describe('Caller-supplied trigger payload for the run.') - .nullable() - .describe( - 'Input the run was triggered with, or null when the run recorded none. Credential-bearing and PII-masked values are redacted the same way `finalOutput` is.' - ), + workflowInput: omittable( + z + .unknown() + .describe('Caller-supplied trigger payload for the run.') + .nullable() + .describe( + 'Input the run was triggered with, or null when the run recorded none. Credential-bearing and PII-masked values are redacted the same way `finalOutput` is.' + ) + ), createdAt: v2TimestampSchema.describe('ISO 8601 log creation timestamp.'), }) .meta({ diff --git a/apps/sim/lib/api/contracts/v2/workflows.ts b/apps/sim/lib/api/contracts/v2/workflows.ts index f3ad518de4d..71f57df61a8 100644 --- a/apps/sim/lib/api/contracts/v2/workflows.ts +++ b/apps/sim/lib/api/contracts/v2/workflows.ts @@ -19,6 +19,7 @@ import { MAX_ID_LENGTH, missingFieldError, noInputSchema, + omittable, runIdSchema, versionNumberSchema, workspaceIdSchema, @@ -1561,7 +1562,9 @@ export const v2ExecuteWorkflowDataSchema = z status: z .enum(['completed', 'failed', 'paused', 'cancelled']) .describe('Terminal or paused run status.'), - output: z.unknown().describe('Workflow output, including partial output on failure.'), + output: omittable( + z.unknown().describe('Workflow output, including partial output on failure.') + ), blockOutputs: z .record(z.string(), z.unknown().describe('Output value produced by one workflow block.')) .nullable() @@ -1916,13 +1919,15 @@ export const v2WorkflowRunStatusSchema = z 'Structured execution failure, or null when none occurred. Reclassified from the persisted error message, so `blockId`/`blockName`/`blockType` are absent and a block-level failure reports `EXECUTION_FAILED` here even when the same run reported `BLOCK_EXECUTION_FAILED` on its synchronous execute response.' ), /** Populated only with `includeOutput=true` on completed runs. */ - output: z - .unknown() - .describe('Final workflow output value.') - .nullable() - .describe( - 'Final output when `includeOutput=true`, or null when not requested or hidden by organization permission groups.' - ), + output: omittable( + z + .unknown() + .describe('Final workflow output value.') + .nullable() + .describe( + 'Final output when `includeOutput=true`, or null when not requested or hidden by organization permission groups.' + ) + ), blockOutputs: z .record(z.string(), z.unknown().describe('Output value produced by one workflow block.')) .nullable() @@ -2618,7 +2623,9 @@ const v2WorkflowSubBlockSchema = z .object({ id: z.string().min(1, 'subBlock id cannot be empty').describe('Sub-block identifier.'), type: z.string().min(1, 'subBlock type cannot be empty').describe('Sub-block input type.'), - value: z.unknown().describe('Configured value; shape depends on the sub-block type.'), + value: omittable( + z.unknown().describe('Configured value; shape depends on the sub-block type.') + ), }) .describe('One configurable input on a block.') @@ -2813,9 +2820,9 @@ function workflowVariableSchema(id: string, mode: 'input' | 'stored' = 'input') id: z.string().min(1, 'variable id cannot be empty').describe('Variable identifier.'), name: name.describe('Variable name, referenced from block inputs.'), type: type.describe('Declared variable type.'), - value: z - .unknown() - .describe('Variable value; free-form and validated per `type` at use time.'), + value: omittable( + z.unknown().describe('Variable value; free-form and validated per `type` at use time.') + ), }) .meta({ id, title: 'Workflow variable', description: 'A workflow-scoped variable.' }) } @@ -3646,7 +3653,7 @@ export const v2ApplyWorkflowVariablesBodySchema = z .max(255, 'name is too long') .describe('Variable name.'), type: v2WorkflowVariableInputSchema.shape.type.describe('Declared variable type.'), - value: z.unknown().describe('Variable value, coerced to `type`.'), + value: omittable(z.unknown().describe('Variable value, coerced to `type`.')), }) .strict(), z @@ -3662,7 +3669,9 @@ export const v2ApplyWorkflowVariablesBodySchema = z type: v2WorkflowVariableInputSchema.shape.type .optional() .describe('Replacement type; the stored type is kept when omitted.'), - value: z.unknown().describe('Replacement value, coerced to the effective type.'), + value: omittable( + z.unknown().describe('Replacement value, coerced to the effective type.') + ), }) .strict(), z diff --git a/apps/sim/lib/api/contracts/workflow-comparison.ts b/apps/sim/lib/api/contracts/workflow-comparison.ts index 3139cb1d168..3c389225bdd 100644 --- a/apps/sim/lib/api/contracts/workflow-comparison.ts +++ b/apps/sim/lib/api/contracts/workflow-comparison.ts @@ -1,5 +1,9 @@ import { z } from 'zod' -import { versionNumberPathSchema, versionNumberSchema } from '@/lib/api/contracts/primitives' +import { + omittable, + versionNumberPathSchema, + versionNumberSchema, +} from '@/lib/api/contracts/primitives' export const compareWorkflowVersionsQuerySchema = z .object({ @@ -24,7 +28,7 @@ export const workflowComparisonValueSchema = z.discriminatedUnion('kind', [ z.object({ kind: z.literal('value').describe('The field value is included.'), // untyped-response: workflow field values are user-authored JSON with a shape defined by each subblock - value: z.unknown().describe('The complete user-authored field value.'), + value: omittable(z.unknown().describe('The complete user-authored field value.')), }), ]) export type WorkflowComparisonValue = z.output diff --git a/apps/sim/lib/api/contracts/workflows.ts b/apps/sim/lib/api/contracts/workflows.ts index e9aa60fca3c..3ee5a0706b4 100644 --- a/apps/sim/lib/api/contracts/workflows.ts +++ b/apps/sim/lib/api/contracts/workflows.ts @@ -6,6 +6,7 @@ import { } from '@sim/workflow-types/workflow' import { z } from 'zod' import { + omittable, privateSecretProvenanceBundleSchema, requiredFieldSchema, workflowIdSchema, @@ -52,7 +53,7 @@ const workflowBlockDataSchema = z.object({ const workflowSubBlockStateSchema = z.object({ id: z.string(), type: z.string(), - value: z.unknown(), + value: omittable(z.unknown()), }) const workflowBlockOutputSchema = z.unknown() @@ -157,7 +158,7 @@ export const workflowVariableWriteSchema = z.object({ id: z.string(), name: z.string(), type: z.enum(['string', 'number', 'boolean', 'object', 'array', 'plain']), - value: z.unknown(), + value: omittable(z.unknown()), validationError: z.string().optional(), }) @@ -554,7 +555,7 @@ const pausedWorkflowExecutionsResponseSchema = z.object({ }) const pausedWorkflowExecutionDetailSchema = pausedWorkflowExecutionSummarySchema.extend({ - executionSnapshot: z.unknown(), + executionSnapshot: omittable(z.unknown()), queue: z.array(z.record(z.string(), z.unknown())), }) @@ -615,7 +616,7 @@ const workflowExecutionStatusResponseSchema = z.object({ paused: workflowExecutionPausedDetailSchema.nullable(), cost: z.object({ total: z.number() }).nullable(), error: z.string().nullable(), - finalOutput: z.unknown().nullable(), + finalOutput: omittable(z.unknown().nullable()), blockOutputs: z.record(z.string(), z.unknown()).nullable(), }) diff --git a/apps/sim/lib/internal/llm/input.ts b/apps/sim/lib/internal/llm/input.ts index 926db4af854..d794d2b7bdc 100644 --- a/apps/sim/lib/internal/llm/input.ts +++ b/apps/sim/lib/internal/llm/input.ts @@ -1,5 +1,5 @@ import { z } from 'zod' -import { resolvedSecretTraceProvenanceSchema } from '@/lib/api/contracts/primitives' +import { omittable, resolvedSecretTraceProvenanceSchema } from '@/lib/api/contracts/primitives' import { RESOLVED_SECRET_PROVENANCE_FIELD } from '@/lib/execution/private-tool-metadata' const providerToolSchema = z @@ -49,7 +49,7 @@ const providerMessageSchema = z const providerResponseFormatSchema = z .object({ name: z.string(), - schema: z.unknown(), + schema: omittable(z.unknown()), strict: z.boolean().optional(), }) .passthrough() diff --git a/apps/sim/lib/internal/stagehand/schema.ts b/apps/sim/lib/internal/stagehand/schema.ts index f9ac03a7197..d6daa23ac6d 100644 --- a/apps/sim/lib/internal/stagehand/schema.ts +++ b/apps/sim/lib/internal/stagehand/schema.ts @@ -1,11 +1,11 @@ import { z } from 'zod' -import { unknownRecordSchema } from '@/lib/api/contracts/primitives' +import { omittable, unknownRecordSchema } from '@/lib/api/contracts/primitives' export const stagehandAgentInputSchema = z.object({ task: z.string().min(1), startUrl: z.string().url(), - outputSchema: z.unknown(), - variables: z.unknown(), + outputSchema: omittable(z.unknown()), + variables: omittable(z.unknown()), provider: z.enum(['openai', 'anthropic']).optional().default('openai'), apiKey: z.string(), mode: z.enum(['dom', 'hybrid', 'cua']).optional().default('dom'), diff --git a/apps/sim/lib/internal/zoominfo/schema.ts b/apps/sim/lib/internal/zoominfo/schema.ts index 60f57e34a1f..b675cff2695 100644 --- a/apps/sim/lib/internal/zoominfo/schema.ts +++ b/apps/sim/lib/internal/zoominfo/schema.ts @@ -1,5 +1,6 @@ import { isPrivateIpHost } from '@sim/security/ssrf' import { z } from 'zod' +import { omittable } from '@/lib/api/contracts/primitives' export const ZOOMINFO_API_BASE = 'https://api.zoominfo.com/gtm' export const ZOOMINFO_TOKEN_URL = `${ZOOMINFO_API_BASE}/oauth/v1/token` @@ -72,18 +73,18 @@ export const zoomInfoSearchContactsInputSchema = zoomInfoAuthSchema.extend({ }) export const zoomInfoEnrichCompaniesInputSchema = zoomInfoAuthSchema.extend({ - matchCompanyInput: z.unknown(), + matchCompanyInput: omittable(z.unknown()), outputFields: optionalToolField, }) export const zoomInfoEnrichContactsInputSchema = zoomInfoAuthSchema.extend({ - matchPersonInput: z.unknown(), + matchPersonInput: omittable(z.unknown()), outputFields: optionalToolField, requiredFields: optionalToolField, }) export const zoomInfoSearchIntentInputSchema = zoomInfoAuthSchema.extend({ - topics: z.unknown(), + topics: omittable(z.unknown()), signalStartDate: optionalToolField, signalEndDate: optionalToolField, signalScoreMin: optionalToolField, diff --git a/apps/sim/lib/mothership/tools/server/router.ts b/apps/sim/lib/mothership/tools/server/router.ts index 918d2c300e2..fe07c34256b 100644 --- a/apps/sim/lib/mothership/tools/server/router.ts +++ b/apps/sim/lib/mothership/tools/server/router.ts @@ -1,6 +1,7 @@ import { createLogger } from '@sim/logger' import { isRecordLike } from '@sim/utils/object' import { z } from 'zod' +import { omittable } from '@/lib/api/contracts/primitives' import { getValidationErrorMessage, isZodError } from '@/lib/api/server/validation' import { OAUTH_API_WRITE_SCOPE } from '@/lib/auth/oauth-provider' import { requireDelegatedApiScope } from '@/lib/core/application/oauth-authorization' @@ -45,7 +46,7 @@ export type ExecuteResponseSuccess = z.output item: TItem, fallback: TFallback ): z.ZodType[] | TFallback> { - return z.unknown().transform((raw) => { - if (!Array.isArray(raw)) return fallback - return raw.flatMap((entry) => { - const parsed = item.safeParse(entry) - return parsed.success ? [parsed.data as z.infer] : [] + return z + .unknown() + .optional() + .transform((raw) => { + if (!Array.isArray(raw)) return fallback + return raw.flatMap((entry) => { + const parsed = item.safeParse(entry) + return parsed.success ? [parsed.data as z.infer] : [] + }) }) - }) } interface BooleanRestrictionField { diff --git a/apps/sim/lib/workflow-tests/protocol.ts b/apps/sim/lib/workflow-tests/protocol.ts index b5618e2e870..849e3aa6acf 100644 --- a/apps/sim/lib/workflow-tests/protocol.ts +++ b/apps/sim/lib/workflow-tests/protocol.ts @@ -1,4 +1,5 @@ import { z } from 'zod' +import { omittable } from '@/lib/api/contracts/primitives' /** * The wire between the workflow-test harness (inside the isolate) and the host brokers. @@ -36,7 +37,7 @@ export const testStartArgsSchema = z.object({ workflow: nameSchema, /** The trigger block that starts the run, by name; needed when the workflow has several. */ trigger: nameSchema.nullable(), - input: z.unknown(), + input: omittable(z.unknown()), targets: z.array(testTargetSchema).max(MAX_TARGETS), }) @@ -49,7 +50,7 @@ export const testReplyArgsSchema = z.union([ z.object({ runId: z.string().min(1), callId: z.string().min(1), error: z.string().max(10_000) }), // Strict, so a reply carrying an `error` (one past the cap included) is never read as an output. z - .object({ runId: z.string().min(1), callId: z.string().min(1), output: z.unknown() }) + .object({ runId: z.string().min(1), callId: z.string().min(1), output: omittable(z.unknown()) }) .strict(), ]) diff --git a/packages/realtime-protocol/src/schemas.ts b/packages/realtime-protocol/src/schemas.ts index 2cb07c02595..a86d2c2d707 100644 --- a/packages/realtime-protocol/src/schemas.ts +++ b/packages/realtime-protocol/src/schemas.ts @@ -1,4 +1,14 @@ import { z } from 'zod' + +/** + * A payload key the sender may omit (`JSON.stringify` drops `undefined`). Zod 4.6 rejects an + * absent key unless its schema is optional-in; a `.catch` that never fires restores that without + * changing the inferred type, which `.optional()` would. + */ +function omittable>(schema: T) { + return schema.catch(undefined) +} + import { BLOCK_OPERATIONS, BLOCKS_OPERATIONS, @@ -125,8 +135,8 @@ const VariableOperationSchema = z.union([ payload: z.object({ id: z.string(), name: z.string(), - type: z.any(), - value: z.any(), + type: omittable(z.any()), + value: omittable(z.any()), workflowId: z.string(), }), timestamp: z.number(), @@ -147,7 +157,7 @@ const WorkflowStateOperationSchema = z.object({ operation: z.literal(WORKFLOW_OPERATIONS.REPLACE_STATE), target: z.literal(OPERATION_TARGETS.WORKFLOW), payload: z.object({ - state: z.any(), + state: omittable(z.any()), }), timestamp: z.number(), operationId: z.string().optional(), @@ -161,7 +171,7 @@ const SubblockOperationSchema = z.object({ z.object({ blockId: z.string(), subblockId: z.string(), - value: z.any(), + value: omittable(z.any()), expectedValue: z.any().optional(), }) ), @@ -181,7 +191,7 @@ const SubblockCanonicalModesUpdateSchema = z.object({ payload: z.object({ blockId: z.string(), subblockId: z.string(), - value: z.any(), + value: omittable(z.any()), canonicalModes: z.record(z.string(), CanonicalModeSchema), }), timestamp: z.number(),