{
  "openapi": "3.1.0",
  "info": {
    "title": "Workflow Tools API",
    "version": "0.1-experimental",
    "description": "Build and edit Omniscope **workflows** over HTTP. Every operation the in-app Workflow Ninja\nassistant performs - add a block, wire blocks together, set options, run the workflow, read the\nresults - is available here as a plain REST call. A whole workflow can also be exported and imported\nas a single portable JSON document (the **workflow document**, described in full below). No AI model\nis involved: you send a request, you get a result.\n\n> **Status: experimental.** Ready to explore and build against, but not yet a stable contract:\n> tool and argument names, request and response shapes, and the authentication flow\n> may all change as it develops. The tools and their arguments below are generated directly from the\n> running software (generated 2026-09-23), so they always match it.\n\n## Roadmap - what's not here yet\nThis documents every tool with its arguments and typed result, the full per-block-type options\ncatalogue, and the workflow-document format. Still to come:\n\n- **Settled per-block-type routes** - the `configure_<type>` routes are **experimental**: a type id, an\n  option name or the route's own shape may change before general release. The generic tools are settled.\n\n## Who it's for\nDevelopers and integrators who want to create or modify Omniscope workflows programmatically - from a\nscript, a backend service, another automation tool, or by copy-pasting a workflow document between\nprojects.\n\n## What you can do\n- **Inspect** a workflow: list its blocks, read a block's configuration and output, export the whole thing.\n- **Build**: add blocks, set their options, rename / move / remove them, or replace the whole workflow at once.\n- **Connect**: wire block outputs to block inputs, and unwire them.\n- **Organise**: add shapes and notes, group and ungroup blocks.\n- **Run**: execute individual blocks or the whole workflow and read the results.\n- **Discover**: list the available block types, an option's valid choices, and formula functions.\n\n## The endpoint\nEach tool has its own URL. To call one, **POST its arguments as the JSON body** to that tool's path:\n\n```\nPOST https://<your-server>/<project-path>.iox/api/tools/<tool>\nContent-Type: application/json\n```\n\nFor example, `POST .../api/tools/configure_file_source` with body `{\"name\": \"Sales\", \"options\": {\"path\": \"Sales.csv\"}}`\nadds a File block; the same route with `\"block\": \"Sales\"` reconfigures the existing one.\nEvery tool is listed in the sidebar with its own page, arguments and example. Replace `<your-server>`\nwith your Omniscope host and `<project-path>` with the project's path exactly as it appears in its\nOmniscope URL - this **includes any containing folders** (e.g. `Finance/Budgets/Q3 Model`), not just the\nproject name; a project at the root is simply its name. URL-encode each segment (a space becomes `%20`).\n\n> The door was originally served at `.../api/dm/ai/hl/tools/<tool>`, which remains a working alias\n> for the same route; new clients should use the canonical path above.\n\n## Authentication and access\nSend an Omniscope **API key** as a bearer token:\n\n```\nAuthorization: Bearer omsk_...\n```\n\nAn administrator issues a key against a permission **group** on the project folder (the group's\nauthentication mechanisms include *API keys*); the secret is shown once, when it is generated. The\nkey authenticates the caller into that group, and the group's folder permissions then decide what\nthe caller may do - so access is the same folder access model as everywhere else in Omniscope,\nreached with a credential a machine client can hold. This surface needs *Full project access via\nAPIs* together with a project role - viewer to read, editor to change or run anything. The two are a\nconjunction and neither implies the other, so granting either alone gets a 403. Grant a read-only\nintegration viewer, not editor.\n\nA key carries no scope of its own: scoping is the group's job, so the intended shape is one group\nper integration. Revoke by deleting the key, which takes effect immediately. A request with a\nmissing, wrong or deleted key is rejected with **401** - never silently treated as anonymous.\n\n## Results\nA call returns the tool's **own result as the response body** - no wrapper. A read tool returns what it\nread (e.g. `export_workflow` returns the workflow document); an edit tool returns a short confirmation.\nOutcomes are conveyed by **HTTP status**:\n\n- **200** - success; the body is the result (JSON).\n- **400** - the call failed: a tool-logic error (e.g. \"no such block\"), or a malformed request. The body\n  is `{ \"error\": \"...\" }`.\n- **401** - missing/invalid credentials.\n\nEach tool's own page shows its result shape and an example.\n\n## Arguments are tolerant\nOptional arguments can be omitted - the server fills sensible defaults. Send only what you mean to\nset. (The in-app assistant uses a stricter variant of these same schemas; both are accepted here.)\n\n## The workflow document\nA workflow can be handled as a single, portable JSON document. **`export_workflow`** produces it and\n**`set_workflow`** consumes it - so you can copy a workflow between projects, keep it in version\ncontrol, diff it, or hand-edit it. (`get_workflow` returns a lighter overview, not this full document.)\nHere is a minimal one (a file source feeding a report):\n\n```json\n{\n  \"blocks\": [\n    {\n      \"name\": \"Sales\",\n      \"type\": \"fileSource\",\n      \"options\": {\n        \"path\": \"Sales.csv\"\n      }\n    },\n    {\n      \"name\": \"Report\",\n      \"type\": \"report:insightExplorer\"\n    }\n  ],\n  \"connections\": {\n    \"Sales\": [\n      \"Report\"\n    ]\n  }\n}\n```\n\n### Document shape\n```jsonc\n{\n  \"v\": 1,                 // format version; omit to mean 1 (see Versioning)\n  \"blocks\": [ ... ],      // the blocks (array)\n  \"connections\": { ... }, // wiring, keyed by source block name (see Connections)\n  \"shapes\": [ ... ],      // optional: canvas annotations (notes, arrows)\n  \"groups\": [ ... ]       // optional: block groupings\n}\n```\n(A `parameters` key is reserved for a future workflow-parameters feature; leave it out for now.)\n\n### Blocks\nEach block is `{ \"name\", \"type\", \"position\"?, \"options\"? }`:\n\n- **`name`** - a unique identity within the workflow. Connections refer to blocks by this name.\n- **`type`** - a block-type id from `describe_block_type`, e.g. `fileSource` or `report:insightExplorer`\n  (a base id, or `base:preset`).\n- **`position`** - optional `[x, y]` canvas coordinates. **Omit it** and the importer auto-lays-out the\n  workflow - the clean default when sharing.\n- **`options`** - per-type configuration; the keys depend on the block type (see *Build & edit blocks*\n  for how types and options work, and how to discover them). Omit to use defaults.\n\n### Connections\n`connections` is **keyed by the source (upstream) block's name**, mapping it to where its output goes:\n\n- **One output** (the common case) - the value is an **array of targets**:\n  ```json\n  { \"Sales\": [\"Report\", \"Summary\"] }\n  ```\n  A target is a block name, or `{ \"block\": \"Join\", \"input\": \"input2\" }` when you must name a specific\n  input (e.g. the second input of a join). A bare name means \"the block's single input\".\n- **Several outputs** - the value is an **object keyed by output name**, each mapping to its own list of\n  targets:\n  ```json\n  { \"Filter\": { \"matched\": [\"Report\"], \"rejected\": [\"Rejects\"] } }\n  ```\n\nOmit an output name when the block has a single output, and an input name when the target has a single\ninput. The importer also accepts a fully-explicit form (every output and input named) and a flat list\nof edges (`[{ \"sourceBlock\", \"sourceOutput\"?, \"targetBlock\", \"targetInput\"? }, ...]`, the same fields\nas the `connect` tool) - so an export always re-imports, however it was produced.\n\n### Option values & choices\nOption values are human-readable names, not internal codes. An option backed by a **fixed list** of\nchoices validates strictly (an unknown value is rejected on import). An option whose choices are\n**open or computed** (e.g. a field or file name) accepts any value and is checked when the block runs,\nso a workflow that references something not present yet still imports. Unset an optional value by\nomitting it or passing `null`.\n\n### Versioning\nThe document carries a format version `v` (currently `1`; omit it to mean `1`). The format is\nexperimental and may change.\n\n### Editing round-trip\nExport with `export_workflow`, edit the JSON, then apply with `set_workflow`. `set_workflow` is\n**destructive** (it replaces the whole workflow), so call it first with `confirm` omitted to preview\nwhat would change, then again with `confirm: true` to apply."
  },
  "servers": [
    {
      "url": "https://{server}/{projectPath}.iox/api",
      "variables": {
        "server": {
          "default": "your-omniscope-server",
          "description": "Your Omniscope host (with port, if non-standard)."
        },
        "projectPath": {
          "default": "My-Project",
          "description": "The project's path exactly as it appears in its Omniscope URL, INCLUDING any containing folders - e.g. \"Finance/Budgets/Q3 Model\" for a project inside Finance/Budgets, or just \"Q3 Model\" for one at the root. URL-encode each segment (a space becomes %20)."
        }
      }
    }
  ],
  "tags": [
    {
      "name": "Inspect the workflow"
    },
    {
      "name": "Build & edit blocks",
      "description": "### Block types & their options\n\nEvery block has a **type** (a block-type id such as `fileSource` or `report:insightExplorer`) and a per-type **options** object. The available option keys depend on the type.\n\n**Each block type has its own route**, listed under *Add & configure blocks, by type* - `POST .../tools/configure_join`, `configure_field_organiser`, and so on. One route both **adds and configures**: leave `block` unset to create a new block, or name an existing block to reconfigure it. Each route documents that type's own options, so you can read exactly what a Join or a File takes without a discovery round-trip.\n\nTo explore at runtime instead:\n\n- **`describe_block_type`** - list every block type available on the server.\n- **`describe_block`** - show a specific block's current options and their meanings.\n- **`list_block_option_choices`** - list the valid choices for one option (for enum-like options).\n\n> **Experimental.** The per-block-type routes may change before general release.\n"
    },
    {
      "name": "Add & configure blocks, by type"
    },
    {
      "name": "Connect blocks"
    },
    {
      "name": "Shapes & groups"
    },
    {
      "name": "Discover types & options"
    },
    {
      "name": "Files"
    },
    {
      "name": "Run the workflow"
    }
  ],
  "security": [
    {
      "omniscopeApiKey": []
    }
  ],
  "paths": {
    "/tools/add_shape": {
      "post": {
        "tags": [
          "Shapes & groups"
        ],
        "summary": "add_shape",
        "operationId": "add_shape",
        "description": "Add a decorative shape to the canvas (a note, section rectangle, text label, arrow, line or speech bubble) to document or organise the workflow. Purely visual - never affects execution. Returns the new shape's index.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Add a decorative shape (note, section rectangle, label, arrow, line or speech bubble) to the workflow canvas. Shapes are purely visual - they document/organise the workflow and never affect execution. Coordinates are virtual canvas coordinates; omit them to let the server place it.",
                "properties": {
                  "shape": {
                    "description": "The shape to add.\nA decorative canvas annotation (note, section rectangle, label, arrow, line or speech bubble). Does not affect execution - it documents/organises the workflow.",
                    "anyOf": [
                      {
                        "type": "object",
                        "description": "A rectangle, e.g. to frame a section of the workflow.",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "rectangle"
                          },
                          "text": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                          },
                          "colour": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                          },
                          "group": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "width": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional width in canvas units. Null for a default size."
                          },
                          "height": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional height in canvas units. Null for a default size."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "text",
                          "colour",
                          "group",
                          "x",
                          "y",
                          "width",
                          "height"
                        ]
                      },
                      {
                        "type": "object",
                        "description": "A sticky note (rectangle with a folded corner), for a comment.",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "note"
                          },
                          "text": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                          },
                          "colour": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                          },
                          "group": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "width": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional width in canvas units. Null for a default size."
                          },
                          "height": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional height in canvas units. Null for a default size."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "text",
                          "colour",
                          "group",
                          "x",
                          "y",
                          "width",
                          "height"
                        ]
                      },
                      {
                        "type": "object",
                        "description": "An ellipse.",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "ellipse"
                          },
                          "text": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                          },
                          "colour": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                          },
                          "group": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "width": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional width in canvas units. Null for a default size."
                          },
                          "height": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional height in canvas units. Null for a default size."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "text",
                          "colour",
                          "group",
                          "x",
                          "y",
                          "width",
                          "height"
                        ]
                      },
                      {
                        "type": "object",
                        "description": "A free-standing text label (no fill or border).",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "text"
                          },
                          "text": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                          },
                          "colour": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                          },
                          "group": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "width": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional width in canvas units. Null for a default size."
                          },
                          "height": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional height in canvas units. Null for a default size."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "text",
                          "colour",
                          "group",
                          "x",
                          "y",
                          "width",
                          "height"
                        ]
                      },
                      {
                        "type": "object",
                        "description": "An arrow pointing from its start (x,y) to its tip (endX,endY).",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "arrow"
                          },
                          "text": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                          },
                          "colour": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                          },
                          "group": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "endX": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "x coordinate of the tip/end the arrow or line points to. Null for a default length."
                          },
                          "endY": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "y coordinate of the tip/end the arrow or line points to. Null for a default length."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "text",
                          "colour",
                          "group",
                          "x",
                          "y",
                          "endX",
                          "endY"
                        ]
                      },
                      {
                        "type": "object",
                        "description": "A line from its start (x,y) to its end (endX,endY).",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "line"
                          },
                          "text": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                          },
                          "colour": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                          },
                          "group": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "endX": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "x coordinate of the tip/end the arrow or line points to. Null for a default length."
                          },
                          "endY": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "y coordinate of the tip/end the arrow or line points to. Null for a default length."
                          },
                          "arrowhead": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "True to draw a small arrowhead on the line's end. Null/false for a plain line."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "text",
                          "colour",
                          "group",
                          "x",
                          "y",
                          "endX",
                          "endY",
                          "arrowhead"
                        ]
                      },
                      {
                        "type": "object",
                        "description": "A speech bubble whose tail points at (pointsAtX,pointsAtY).",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "bubble"
                          },
                          "text": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                          },
                          "colour": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                          },
                          "group": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "width": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional width in canvas units. Null for a default size."
                          },
                          "height": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional height in canvas units. Null for a default size."
                          },
                          "pointsAtX": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "x coordinate the speech-bubble tail points at. Null for a default tail."
                          },
                          "pointsAtY": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "y coordinate the speech-bubble tail points at. Null for a default tail."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "text",
                          "colour",
                          "group",
                          "x",
                          "y",
                          "width",
                          "height",
                          "pointsAtX",
                          "pointsAtY"
                        ]
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "shape"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call add_shape",
                  "value": {
                    "shape": {
                      "type": "rectangle",
                      "text": null,
                      "colour": null,
                      "group": null,
                      "x": null,
                      "y": null,
                      "width": null,
                      "height": null
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string",
                  "description": "A human-readable confirmation or summary message (this tool returns prose, not a structured object)."
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/confirm": {
      "post": {
        "tags": [
          "Build & edit blocks"
        ],
        "summary": "confirm",
        "operationId": "confirm",
        "description": "Satisfy a block's confirmation gate (connect a database/cloud source, or confirm custom SQL) so it can be executed.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Satisfy a block's confirmation gate (e.g. a database/cloud connection, or confirmed custom SQL) so the block can be executed. For a connection gate this actually connects and only succeeds if the connection does - on failure the connection error is returned and the gate stays unconfirmed. Set the block's connection/options first (configure_<type>), then confirm. If you later change what was confirmed, the gate resets - confirm again.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Name of the block whose confirmation gate to satisfy."
                  },
                  "option": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Dot-path of the confirm option to satisfy, in AI names - the same field (a 'Confirmation gate' boolean) you see in describe_block / the options schema. Examples: `confirmConnection`, `confirmedCustomSQL`."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "option"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call confirm",
                  "value": {
                    "block": null,
                    "option": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/connect": {
      "post": {
        "tags": [
          "Connect blocks"
        ],
        "summary": "connect",
        "operationId": "connect",
        "description": "Connect a source block's output to a target block's input.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Connect a source block's output to a target block's input. Connector names are exactly the strings shown in `describe_block` (live wiring) or `describe_block_type(type)` (declared connector model) - do not invent names.",
                "properties": {
                  "sourceBlock": {
                    "type": "string",
                    "description": "Source block name."
                  },
                  "sourceOutput": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Source connector name, taken verbatim from `describe_block.outputs[].name` (or `describe_block_type(type).outputs[].name`). Send null for single-output blocks to use the source's default output."
                  },
                  "targetBlock": {
                    "type": "string",
                    "description": "Target block name."
                  },
                  "targetInput": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Target connector name, taken verbatim from `describe_block.inputs[].connectorName` (or `describe_block_type(type).inputs[].name`). Send null for single-input blocks. For variadic targets (e.g. Append, Report), send null for `targetInput` to append a new slot - this is the recommended default. To overwrite an existing slot pass its realized name (e.g. `input2`) verbatim from `describe_block.inputs[].connectorName`, or use `targetSlot`."
                  },
                  "targetSlot": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Optional 0-based slot index to OVERWRITE exactly - including the first slot (0), which `targetInput` cannot address by name on a variadic connector. Takes precedence over `targetInput` and never appends: use it for an unambiguous in-place replace of one source. To set a whole ordered source list, reorder, insert or remove, use `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "sourceBlock",
                  "sourceOutput",
                  "targetBlock",
                  "targetInput",
                  "targetSlot"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call connect",
                  "value": {
                    "sourceBlock": "MyBlock",
                    "sourceOutput": null,
                    "targetBlock": "MyBlock",
                    "targetInput": null,
                    "targetSlot": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/describe_block": {
      "post": {
        "tags": [
          "Inspect the workflow"
        ],
        "summary": "describe_block",
        "operationId": "describe_block",
        "description": "Describe one existing block INSTANCE: type, position, wiring, output schema, current options. For a block TYPE rather than an instance - what a type does, its connectors and its options - use describe_block_type(type: \"<id>\").\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Describe one block: its type, current parameters, input wiring, output meta (record count, schema, last-run time when available), and any error state.",
                "properties": {
                  "block": {
                    "type": "string",
                    "description": "Block name."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call describe_block",
                  "value": {
                    "block": "MyBlock"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "type": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "This block's type, always the bare base type - the id `describe_block_type` takes. Never preset-qualified: what it was created from is `createdFromPreset`, which never names a tool. The tool that configures it is given in full as `configureTool` by `describe_block` and `describe_block_type` - do not build a tool name out of this id."
                    },
                    "configureTool": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The tool that creates and reconfigures blocks of this type - call it by this exact name. It is not a transformation of `type` for you to perform: the type id is camelCase and the tool name is snake_case (`fileSource` gives `configure_file_source`)."
                    },
                    "createdFromPreset": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The preset this block was created from, as the `preset` argument that would recreate it (e.g. `customPythonScript`). Provenance - it answers why the block has the options it has, and it is NOT part of the tool name. Absent when the block came from no preset, and also when it no longer matches that preset: a report reshaped out of Insight Explorer shape is a plain report, and its Insight Explorer options are no longer live."
                    },
                    "x": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "y": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "errors": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "Errors on this block - configuration (block setup invalid) or execution (running the block failed). Empty/absent when there are no errors.",
                      "items": {
                        "$ref": "#/components/schemas/ErrorEntry"
                      }
                    },
                    "warnings": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "Warnings on this block - configuration concerns or non-fatal execution issues. Empty/absent when there are no warnings.",
                      "items": {
                        "$ref": "#/components/schemas/ErrorEntry"
                      }
                    },
                    "rawPreview": {
                      "type": [
                        "object",
                        "null"
                      ],
                      "description": "fileSource blocks only: the first lines of the raw file before parsing. Compare against `schemaPerOutput` to spot misaligned headers - if the parsed sample's first row looks like column names, or columns are auto-named, the raw lines show where the real header is so you can fix `firstHeaderRow`/`firstDataRow`.",
                      "properties": {
                        "lines": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "description": "First lines of the source file as raw text, before any delimiter parsing. lines[0] is file line 1, lines[1] is line 2, etc.",
                          "items": {
                            "type": "string"
                          }
                        },
                        "truncated": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "True if the file continues beyond this sample (line- or byte-capped)."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "lines",
                        "truncated"
                      ]
                    },
                    "outputMeta": {
                      "type": [
                        "object",
                        "null"
                      ],
                      "properties": {
                        "outputs": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "items": {
                            "type": "object",
                            "properties": {
                              "recordCount": {
                                "type": [
                                  "integer",
                                  "null"
                                ]
                              },
                              "fieldCount": {
                                "type": [
                                  "integer",
                                  "null"
                                ]
                              }
                            },
                            "additionalProperties": false,
                            "required": [
                              "recordCount",
                              "fieldCount"
                            ]
                          }
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "outputs"
                      ]
                    },
                    "inputs": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "object",
                        "properties": {
                          "connectorName": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Connector name addressing this slot. Pass this exact string as `targetInput` on connect/disconnect."
                          },
                          "slot": {
                            "type": [
                              "integer",
                              "null"
                            ],
                            "description": "0-based slot index, or null when this entry is the trailing variadic placeholder."
                          },
                          "isVarArg": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "True if this slot belongs to a variadic connector (more slots can be appended)."
                          },
                          "optional": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "True if the block can run without this slot wired."
                          },
                          "description": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Human description of what this input accepts."
                          },
                          "sourceBlock": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Block whose output is wired into this slot, or null if unwired."
                          },
                          "sourceOutput": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Output connector name on the source block. Null implies the source's default output."
                          },
                          "recordCount": {
                            "type": [
                              "integer",
                              "null"
                            ],
                            "description": "Rows arriving on this slot, on execute_blocks results. Compare against the block's own output `recordCount`: an unexplained change is a defect to fix or report, not a detail - an inner join silently dropping every unmatched row looks exactly like a clean run. Absent when the source has not been executed, so absence is not zero."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "connectorName",
                          "slot",
                          "isVarArg",
                          "optional",
                          "description",
                          "sourceBlock",
                          "sourceOutput",
                          "recordCount"
                        ]
                      }
                    },
                    "nextVarArgInput": {
                      "description": "Present only on variadic-input blocks. Describes the next variadic slot that will be allocated on `connect` (e.g. `input3` when slots 0/1 are already wired as `input`/`input2`). Pass this name as `targetInput` on connect to append a new slot, or omit `targetInput` entirely - both append. To overwrite an existing variadic slot, pass its realized name from `inputs[].connectorName`.",
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/ConnectorInfo"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "outputs": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "$ref": "#/components/schemas/ConnectorInfo"
                      }
                    },
                    "schemaPerOutput": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "object",
                        "properties": {
                          "outputName": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "dataConfidence": {
                            "description": "How much of this output's data is on hand, which governs what you may conclude from it. `execute`: full execution data - schema and row count accurate. `sample`: the execution data has since been degraded to a retained sample - schema is correct and the row count is the true total captured at execution. `preview`: preview-quality - the schema may be partial and the row count is omitted because it cannot be trusted. `none`: no readable data on this output. Execute the block if you have not; if you just did, then the block produced none - the execute is not the missing step. Counts and CONTENTS are not equally trustworthy: whatever the level, any rows you can see here are a truncation (see `sample`), so never conclude anything about the data as a whole from them.",
                            "anyOf": [
                              {
                                "type": "string",
                                "description": "Enum values:\n - \"execute\"\n - \"sample\"\n - \"preview\"\n - \"none\"\n",
                                "enum": [
                                  "execute",
                                  "sample",
                                  "preview",
                                  "none"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "recordCount": {
                            "type": [
                              "integer",
                              "null"
                            ]
                          },
                          "fields": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ]
                                },
                                "type": {
                                  "type": [
                                    "string",
                                    "null"
                                  ]
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "name",
                                "type"
                              ]
                            }
                          },
                          "sample": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "A few rows, for seeing the SHAPE of the data - field names, value formats, obvious mis-parses. Always a truncation, at every `dataConfidence` level, and not a random one: do not generalise from it to the output as a whole. In particular, a column that is empty in these rows is not evidence that it is empty in the data - that inference has deleted a populated column from a 316,834-row table.",
                            "items": {
                              "type": [
                                "object",
                                "null"
                              ],
                              "additionalProperties": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "number"
                                  },
                                  {
                                    "type": "string",
                                    "description": "A UTC date in one of these ISO 8601 formats: 1997-07-16, 1997-07-16T19:20:30Z, 1997-07-16T19:20:30.452Z"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "outputName",
                          "dataConfidence",
                          "recordCount",
                          "fields",
                          "sample"
                        ]
                      }
                    },
                    "options": {
                      "type": [
                        "object",
                        "null"
                      ],
                      "description": "Reverse-mapped current options object for this block (the block-type-specific options shape, same as this type's `configure_<type>` tool takes). May be null if the block type isn't yet covered by the AI surface (see `optionsPartial` for hints)."
                    },
                    "optionsPartial": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "Field names where the live Omniscope option doesn't fully round-trip into the AI surface. The block has these settings but they're not visible/editable here. Use `configure_<type>` carefully on blocks with partial fields - your replacement will drop them.",
                      "items": {
                        "type": "string"
                      }
                    },
                    "optionNotes": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "On `describe_block` only: option guidance for this block's TYPE - what its `options` fields mean, which the `configure_<type>` schema does not carry. Sent at most once per type per conversation, so absent means either that you already have it earlier in this conversation or that the type has no authored guidance - never that you are missing something. Read it before composing `options`, which is a full replace."
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "type",
                    "configureTool",
                    "createdFromPreset",
                    "x",
                    "y",
                    "errors",
                    "warnings",
                    "rawPreview",
                    "outputMeta",
                    "inputs",
                    "nextVarArgInput",
                    "outputs",
                    "schemaPerOutput",
                    "options",
                    "optionsPartial",
                    "optionNotes"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/describe_block_type": {
      "post": {
        "tags": [
          "Discover types & options"
        ],
        "summary": "describe_block_type",
        "operationId": "describe_block_type",
        "description": "Describe one block TYPE in full (pass `type`), or discover types by search or category. This is the type-level call - describe_block describes an existing block instance, so a type not yet on the workflow can only be read here.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Discover block types. Combine any of: `query` (keyword search), `category` (browse a picker section, most-useful-first), `type` (fetch one block at full detail - the way to \"describe\" a specific type). With no arguments, returns the list of categories so you can browse.",
                "properties": {
                  "query": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Optional keyword search over every block's title, summary, description and example. Words are matched case-insensitively; pass what the block does (e.g. \"filter rows\", \"join\", \"pivot\", \"read csv\"). May be combined with `category` to search within a section."
                  },
                  "category": {
                    "description": "Optional. Browse one block-picker category, returned in the picker's own most-useful-first order. The categories mirror the block picker's sections.",
                    "anyOf": [
                      {
                        "type": "string",
                        "description": "Enum values:\n - \"inputs\": Inputs: read data in - files, demo data, generators, manual entry.\n - \"connectors\": Connectors: pull data from external systems - databases, APIs, cloud services.\n - \"preparation\": Preparation: reshape and clean data - field organiser, filter, aggregate, join, pivot, append.\n - \"controlFlow\": Control flow: branch, batch, loop and orchestrate the pipeline.\n - \"analytics\": Analytics: statistics, forecasting, prediction and other computed analyses.\n - \"outputs\": Outputs: write data out - files, databases, cloud destinations, publishing.\n - \"codeAndAi\": Code & AI: custom-script and AI blocks (Python, R, JavaScript, LLM completion).\n - \"reports\": Reports: present data - the Report block and its view-type presets (e.g. Insight Explorer).\n - \"macros\": Macros: reusable sub-workflows packaged as a single block.\n - \"sharedMacros\": Shared macros: macros shared across projects.\n",
                        "enum": [
                          "inputs",
                          "connectors",
                          "preparation",
                          "controlFlow",
                          "analytics",
                          "outputs",
                          "codeAndAi",
                          "reports",
                          "macros",
                          "sharedMacros"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "type": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Optional exact block-type id (the bare colon-id, no `omni:` prefix), e.g. `fileSource`, `fieldOrganiser`, `report:insightExplorer`. Returns just that block at FULL detail (connectors + example options). This is how you inspect one specific type in depth."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "query",
                  "category",
                  "type"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call describe_block_type",
                  "value": {
                    "query": null,
                    "category": "inputs",
                    "type": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Detail level of the entries. A search or browse returns `summary`, `description` or `catalogue` (catalogue = connectors, presets and a worked example). Only a lookup by `type` returns `full`, which adds `defaultOptions` and the type's option guidance - so a `catalogue` result is not a substitute for it."
                    },
                    "note": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Optional guidance - how to narrow a broad result or get more detail."
                    },
                    "categories": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "The categories to browse (only on a no-argument call).",
                      "items": {
                        "type": "object",
                        "properties": {
                          "category": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The value to pass as `describe_block_type.category` to browse this section."
                          },
                          "title": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Human title of the category."
                          },
                          "count": {
                            "type": [
                              "integer",
                              "null"
                            ],
                            "description": "How many AI-addable block types are in this category."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "category",
                          "title",
                          "count"
                        ]
                      }
                    },
                    "blockTypes": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "The matching block types.",
                      "items": {
                        "type": "object",
                        "properties": {
                          "type": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The block-type id - the exact string to pass back as `type` (no `omni:` prefix). The tool that configures it is `configureTool`, not this string with a prefix on it."
                          },
                          "configureTool": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The tool that creates and reconfigures blocks of this type - call it by this exact name. It is not a transformation of `type` for you to perform: the type id is camelCase and the tool name is snake_case (`fileSource` gives `configure_file_source`)."
                          },
                          "title": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Human title (the block-picker label)."
                          },
                          "category": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The block-picker category this type belongs to."
                          },
                          "summary": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "One-sentence summary of what the block does."
                          },
                          "description": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Fuller description - the block-picker hover text. Present at DESCRIPTION/FULL detail."
                          },
                          "legacy": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "True if this is a legacy block (prefer a modern equivalent unless asked for it)."
                          },
                          "experimental": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "True if this block is experimental."
                          },
                          "inputs": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Input connectors (FULL detail). Use a connector's `name` verbatim as `connect.targetInput`.",
                            "items": {
                              "$ref": "#/components/schemas/ConnectorInfo"
                            }
                          },
                          "outputs": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Output connectors (FULL detail; an empty list `[]` means the block has no outputs, e.g. a Report). Use a connector's `name` verbatim as `connect.sourceOutput`.",
                            "items": {
                              "$ref": "#/components/schemas/ConnectorInfo"
                            }
                          },
                          "exampleOptions": {
                            "type": [
                              "object",
                              "null"
                            ]
                          },
                          "exampleOptionsNote": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "How to read `exampleOptions` (present whenever it is): it is illustrative and PARTIAL - it shows the key options for this block's purpose, with other options omitted. The options schema is the full, fully-required contract: when you submit, include EVERY property, using null for any you are not setting (null = use the default). Set the options your task needs."
                          },
                          "examples": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Curated worked examples for this block (FULL detail), for blocks whose whole-bean semantics need contrasting examples to teach (e.g. Field Organiser). Each has a `label` naming the lesson and an illustrative, PARTIAL `options` object - same contract as `exampleOptions` (include EVERY property when you submit; null = use the default). Present instead of `exampleOptions` for such blocks.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "label": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Short label naming what this example demonstrates."
                                },
                                "options": {
                                  "type": [
                                    "object",
                                    "null"
                                  ]
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "label",
                                "options"
                              ]
                            }
                          },
                          "defaultOptions": {
                            "type": [
                              "object",
                              "null"
                            ]
                          },
                          "presets": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "The named starting points this type offers (FULL detail), in catalogue order - each `preset` is a value for the `preset` argument of `configureTool`. Absent when the type has none, in which case passing a `preset` is an error.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "preset": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Pass this exact string as the `preset` argument of this type's `configureTool`."
                                },
                                "title": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Human title - the label the block picker shows for this preset."
                                },
                                "summary": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "What this preset starts you with. Absent when the preset carries no description."
                                },
                                "isDefault": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "True on the preset applied when you omit `preset`. Nothing in the catalogue declares a default - this surface takes the first preset in catalogue order as one, so treat it as a sensible starting point rather than a product-level meaning."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "preset",
                                "title",
                                "summary",
                                "isDefault"
                              ]
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "configureTool",
                          "title",
                          "category",
                          "summary",
                          "description",
                          "legacy",
                          "experimental",
                          "inputs",
                          "outputs",
                          "exampleOptions",
                          "exampleOptionsNote",
                          "examples",
                          "defaultOptions",
                          "presets"
                        ]
                      }
                    },
                    "notes": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "Advisories about THIS call: things the server did not do, did differently from what you asked, or wants you to know before your next call. Read them - a note is the only place a deliberately ignored part of your payload is reported, and the call otherwise succeeded.",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "detail",
                    "note",
                    "categories",
                    "blockTypes",
                    "notes"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/disconnect": {
      "post": {
        "tags": [
          "Connect blocks"
        ],
        "summary": "disconnect",
        "operationId": "disconnect",
        "description": "Remove a connection.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Remove an existing connection. Identify the slot by the connector name in `targetInput` (from `describe_block.inputs[].connectorName`), or - for variadic connectors, or to address by position - the 0-based slot index in `targetSlot`. If both are given, `targetSlot` wins.",
                "properties": {
                  "targetBlock": {
                    "type": "string",
                    "description": "Target block name."
                  },
                  "targetInput": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Target connector name, taken verbatim from `describe_block.inputs[].connectorName`. For variadic slots this is the realized name (`input`, `input2`, `input3`...). Ignored when `targetSlot` is also supplied."
                  },
                  "targetSlot": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "0-based slot index for direct addressing - takes precedence over `targetInput` when both are given. Use when addressing a variadic slot by position, or when the slot is easier to address by index."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "targetBlock",
                  "targetInput",
                  "targetSlot"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call disconnect",
                  "value": {
                    "targetBlock": "MyBlock",
                    "targetInput": null,
                    "targetSlot": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/duplicate_block": {
      "post": {
        "tags": [
          "Build & edit blocks"
        ],
        "summary": "duplicate_block",
        "operationId": "duplicate_block",
        "description": "Copy an existing block, with its options, its content and its input connections.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Copy one existing block, with its configuration, its upstream connections and its content (a report block duplicates together with its report). The copy lands in the same group, beside the original, and has never executed. Use this when a block is already configured the way you need and you want another like it - especially when some of its configuration is not expressible through the options schema, which copying preserves and re-specifying cannot. Nothing downstream is rewired: the copy takes the same inputs as the original but feeds nothing until you connect it.",
                "properties": {
                  "block": {
                    "type": "string",
                    "description": "Name of the block to copy."
                  },
                  "newName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Optional name for the copy. Omit to continue the source's numbering the way the desktop UI does (\"Sales\" -> \"Sales 2\", \"Sales 2\" -> \"Sales 3\"). If the name you give collides with an existing block - case-insensitively, as block names always are - the server appends a numeric suffix and reports the resulting name."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "newName"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call duplicate_block",
                  "value": {
                    "block": "MyBlock",
                    "newName": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/execute_blocks": {
      "post": {
        "tags": [
          "Run the workflow"
        ],
        "summary": "execute_blocks",
        "operationId": "execute_blocks",
        "description": "Execute one or more blocks (running any missing upstream) and return their output - fields, row count and a small sample, or less if you set `detail`. Does NOT run outputs unless named, so it's the safe way to validate. To check a whole pipeline, execute its terminal Report. Can run long: a client timeout does not mean it failed, so re-read state before retrying rather than assuming.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Execute one or more blocks (the UI 'Execute' button) and get back each block's output - fields, row count and a small sample - so you can see the result without a separate get_block_output call. The named blocks always run; upstream dependencies run automatically only where their execution data is missing. This does NOT run downstream or output blocks unless you name them, so it's the safe way to validate work (no files written or published). To check a whole pipeline, execute its terminal Report block: that pulls the entire flow feeding the report through, with no output side effects. Set `refresh` to re-read sources from scratch (the UI 'Refresh' button).",
                "properties": {
                  "blocks": {
                    "type": "array",
                    "description": "Block name(s) to execute. A single name is fine; pass several to run them together in dependency order.",
                    "items": {
                      "type": "string"
                    }
                  },
                  "refresh": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Optional, default false. When true, re-execute from source, ignoring cached upstream data (the UI 'Refresh' button). When false, reuse cached upstream results where available and only run what is stale or missing. DESTRUCTIVE to Data Table blocks: a refresh refills every Data Table at or upstream of the named blocks from its input, and on the default refillBehaviour that REPLACES the stored table - losing manual edits and any rows the input no longer produces. There is no undo. The UI confirms this with the user first; this tool cannot, so check for Data Tables before setting it."
                  },
                  "detail": {
                    "description": "Optional, default `full`. How much of each block's output to return. Lower levels cost far fewer tokens, and an execute result is re-sent on every later request in this turn, so the saving repeats: prefer `none` or `summary` when you only need to know the run worked, and `schema` when you are checking the shape rather than the values.",
                    "anyOf": [
                      {
                        "type": "string",
                        "description": "Enum values:\n - \"none\": No per-block output at all - just errors, warnings, problems and outstanding. Use when you only need to know the run succeeded.\n - \"summary\": One line per block: row count, field count, error/field counts. The cheapest level that still tells you each block produced data.\n - \"schema\": Each block's fields, row counts and input row counts - no sample rows and no options. Use when you are checking the SHAPE of the result.\n - \"sample\": As `schema`, plus up to `maxRows` sample rows per output. Use when you need to see values.\n - \"full\": Everything: schema, sample rows AND each block's stored options. The default, and the most expensive - prefer a narrower level when you do not need the options echoed back.\n",
                        "enum": [
                          "none",
                          "summary",
                          "schema",
                          "sample",
                          "full"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "maxRows": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Optional, default 5. Sample rows per output, at detail `sample` or `full`. Cap is 100; larger requests are silently capped. Same meaning as get_block_output's `maxRows`."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "blocks",
                  "refresh",
                  "detail",
                  "maxRows"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call execute_blocks",
                  "value": {
                    "blocks": [
                      "text"
                    ],
                    "refresh": null,
                    "detail": "none",
                    "maxRows": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_Execution"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/execute_workflow": {
      "post": {
        "tags": [
          "Run the workflow"
        ],
        "summary": "execute_workflow",
        "operationId": "execute_workflow",
        "description": "Execute the whole workflow INCLUDING all outputs (writes files / updates databases / publishes). Use only to produce outputs; to validate, use execute_blocks on the terminal Report instead. Can run long: a client timeout does not mean it failed, so re-read state before retrying rather than assuming.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Execute EVERY block in the workflow, including all output blocks. WARNING: this has side effects - output blocks write files, update databases, and publish data. Use it only when you intend to PRODUCE the outputs. To merely validate the pipeline, do NOT use this - run execute_blocks on the terminal Report instead (it runs the whole flow into the report with no output side effects). Set `refresh` to re-read sources from scratch (the UI 'Refresh' button).",
                "properties": {
                  "refresh": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Optional, default false. When true, re-execute from source, ignoring cached upstream data (the UI 'Refresh' button). When false, reuse cached results where available. DESTRUCTIVE to Data Table blocks: a refresh refills every Data Table in the workflow from its input, and on the default refillBehaviour that REPLACES the stored table - losing manual edits and any rows the input no longer produces. There is no undo. The UI confirms this with the user first; this tool cannot, so check for Data Tables before setting it."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "refresh"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call execute_workflow",
                  "value": {
                    "refresh": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_Execution"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/export_workflow": {
      "post": {
        "tags": [
          "Inspect the workflow"
        ],
        "summary": "export_workflow",
        "operationId": "export_workflow",
        "description": "Export the WHOLE workflow as a portable workflow-document JSON - blocks (name/type/position/options), connections keyed by source block, shapes and groups. Read-only. For copy/paste, sharing, or re-import via set_workflow. Positions are included; omit them on re-import to let the canvas auto-arrange.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Export the WHOLE workflow as a portable workflow-document JSON - blocks (name/type/position/options), connections (keyed by source block), shapes and groups. Read-only. Suitable for copy/paste, sharing, or re-import via set_workflow. Positions are included; omit them on re-import to let the canvas auto-arrange.",
                "properties": {},
                "additionalProperties": false,
                "required": []
              },
              "examples": {
                "example": {
                  "summary": "Call export_workflow",
                  "value": {}
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowDocument"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/get_block_output": {
      "post": {
        "tags": [
          "Inspect the workflow"
        ],
        "summary": "get_block_output",
        "operationId": "get_block_output",
        "description": "Sample up to 10 rows of a block's output table.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Read a small sample of a block's output table — up to 10 rows by default. Returns field names, field types, and the sampled rows. Use this to verify type coercion, sanity-check derived columns, and decide what to do next. The rows are a truncation, not a random sample: read them for the shape of the data, never for what the data as a whole contains. The block must have been run; if it hasn't, you get a 'not executed' error — run it first.",
                "properties": {
                  "block": {
                    "type": "string",
                    "description": "Block name."
                  },
                  "output": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Output connector name. Omit for single-output blocks. Otherwise use the exact name from `describe_block.outputs[].name` (or `describe_block_type(type).outputs[].name`) - do not invent names."
                  },
                  "maxRows": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Maximum number of rows to return. Defaults to 10. Cap is 100; larger requests are silently capped."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "output",
                  "maxRows"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call get_block_output",
                  "value": {
                    "block": "MyBlock",
                    "output": null,
                    "maxRows": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "note": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Read this FIRST when present. It is present only when this output is NOT full execution data, and it says what you may not conclude from what follows. Absent means `execute`."
                    },
                    "outputName": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "fields": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "type": {
                            "type": [
                              "string",
                              "null"
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "name",
                          "type"
                        ]
                      }
                    },
                    "totalRecords": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "rowsReturned": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "dataConfidence": {
                      "description": "How much of this output's data is on hand, which governs what you may conclude from it. `execute`: full execution data - schema and row count accurate. `sample`: the execution data has since been degraded to a retained sample - schema is correct and the row count is the true total captured at execution. `preview`: preview-quality - the schema may be partial and the row count is omitted because it cannot be trusted. `none`: no readable data on this output. Execute the block if you have not; if you just did, then the block produced none - the execute is not the missing step. Counts and CONTENTS are not equally trustworthy: whatever the level, any rows you can see here are a truncation (see `sample`), so never conclude anything about the data as a whole from them.",
                      "anyOf": [
                        {
                          "type": "string",
                          "description": "Enum values:\n - \"execute\"\n - \"sample\"\n - \"preview\"\n - \"none\"\n",
                          "enum": [
                            "execute",
                            "sample",
                            "preview",
                            "none"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "sample": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "A few rows, for seeing the SHAPE of the data - field names, value formats, obvious mis-parses. Always a truncation, at every `dataConfidence` level, and not a random one: do not generalise from it to the output as a whole. In particular, a column that is empty in these rows is not evidence that it is empty in the data - that inference has deleted a populated column from a 316,834-row table.",
                      "items": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "additionalProperties": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "number"
                            },
                            {
                              "type": "string",
                              "description": "A UTC date in one of these ISO 8601 formats: 1997-07-16, 1997-07-16T19:20:30Z, 1997-07-16T19:20:30.452Z"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "note",
                    "outputName",
                    "fields",
                    "totalRecords",
                    "rowsReturned",
                    "dataConfidence",
                    "sample"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/get_file_lines": {
      "post": {
        "tags": [
          "Files"
        ],
        "summary": "get_file_lines",
        "operationId": "get_file_lines",
        "description": "Read a range of raw lines from a fileSource file (before parsing) to locate the data-start boundary.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Read a range of raw lines from a file, before any parsing - the equivalent of scrolling the file in the dialog. Use it to see the actual bytes when deciding how a delimited file should be read: the field delimiter and quote character, the encoding, and where the header and data rows actually begin (past any banner, title, or comment block). Page or jump by line range as needed. Target the file EITHER by `path` (a path from `list_files` - inspect before adding any block) OR by `block` (an existing fileSource block, e.g. a remote/cloud source). Supply exactly one. This is for STRUCTURE, not schema: lines may be clipped, so do NOT use it to enumerate columns or read data values. Once the block is added/configured, the parsed `schemaPerOutput` returned by `configure_<type>`/`describe_block` is the authoritative, complete list of column names and types - build downstream blocks from that, never from these raw lines or prior knowledge of the dataset.",
                "properties": {
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Absolute local file path, taken verbatim from a `list_files` entry's `path`. Use this to inspect a file before creating its block. Mutually exclusive with `block`."
                  },
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Existing fileSource block name. Use for files already loaded as a block (and for non-local sources, where the block carries the connection config). Mutually exclusive with `path`."
                  },
                  "fromLine": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "1-indexed line number to start reading from (inclusive). Defaults to 1."
                  },
                  "lineCount": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "How many lines to return. Defaults to 40. Cap is 100; larger requests are silently capped. Each line is clipped to a maximum character length with a marker."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "path",
                  "block",
                  "fromLine",
                  "lineCount"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call get_file_lines",
                  "value": {
                    "path": null,
                    "block": null,
                    "fromLine": null,
                    "lineCount": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "fromLine": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "1-indexed line number of lines[0] (the actual start of this window)."
                    },
                    "lines": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "The requested lines, each prefixed with its 1-indexed file line number as `N: <text>` (so you can read off the row number directly - e.g. for firstHeaderRow/firstDataRow - without counting). Raw and unparsed; long lines are clipped with a marker.",
                      "items": {
                        "type": "string"
                      }
                    },
                    "reachedEof": {
                      "type": [
                        "boolean",
                        "null"
                      ],
                      "description": "True if this window reached the end of the file (no lines beyond the last one returned)."
                    },
                    "totalLines": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Total line count - present only when the read reached EOF (not computed eagerly for deep reads)."
                    },
                    "scanLimitHit": {
                      "type": [
                        "boolean",
                        "null"
                      ],
                      "description": "True if `fromLine` is past the byte-scan safety cap, so the window couldn't be reached. You asked too deep; the file is larger than the tool will scan to position."
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "fromLine",
                    "lines",
                    "reachedEof",
                    "totalLines",
                    "scanLimitHit"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/get_workflow": {
      "post": {
        "tags": [
          "Inspect the workflow"
        ],
        "summary": "get_workflow",
        "operationId": "get_workflow",
        "description": "Overview (canvas view) of the workflow: blocks with positions + wiring, connections and parameters. Per-block schema/options/preview are opt-in and capped on large workflows - use describe_block to drill into one block's options, schema or data.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Retrieve the workflow as an OVERVIEW (the canvas view): the blocks with their positions, the connections between them, and project parameters. This is for seeing the whole shape at a glance - to read a specific block's options, full schema or data, drill into it with `describe_block`, exactly as a person clicks a block on the canvas. Toggle sections to control payload size. Each flag is OPTIONAL (nullable): send null to take the default - the overview sections (blocks, connections, parameters) default ON; the heavy per-block sections (schema, options, preview) default OFF. On a large workflow the heavy sections may be omitted from this bulk view even if you set them true (see the `note` in the result); use `describe_block` for those blocks instead.",
                "properties": {
                  "includeBlocks": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include the list of blocks with name, type, position and wiring. Cheap. Default true; send null to keep on."
                  },
                  "includeConnections": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include the edge list of connections between blocks. Default true; send null to keep on."
                  },
                  "includeParameters": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include project-level parameters (as a key/value array). Default true; send null to keep on."
                  },
                  "includeSchema": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include each block's output schema (field name + data type) and a `dataConfidence` marker (`execute` | `preview` | `none`). Requires includeBlocks. Default false (heavy, scales with field count); set true to opt in. Dropped from this bulk view on a large workflow even if true - use `describe_block` for those blocks."
                  },
                  "includeOptions": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include each block's current (reverse-mapped) options. Requires includeBlocks. Default false (heavy - this is usually the largest per-block section); set true to opt in. Dropped from this bulk view on a large workflow even if true - use `describe_block` for those blocks."
                  },
                  "includePreview": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include a small sample of preview data per block (up to 3 rows per output). Requires includeBlocks + includeSchema. Default false (heaviest); set true to opt in. Dropped from this bulk view on a large workflow even if true - use `describe_block` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "includeBlocks",
                  "includeConnections",
                  "includeParameters",
                  "includeSchema",
                  "includeOptions",
                  "includePreview"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call get_workflow",
                  "value": {
                    "includeBlocks": null,
                    "includeConnections": null,
                    "includeParameters": null,
                    "includeSchema": null,
                    "includeOptions": null,
                    "includePreview": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "blocks": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "type": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "This block's type, always the bare base type - the id `describe_block_type` takes. Never preset-qualified: what it was created from is `createdFromPreset`, which never names a tool. The tool that configures it is given in full as `configureTool` by `describe_block` and `describe_block_type` - do not build a tool name out of this id."
                          },
                          "configureTool": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The tool that creates and reconfigures blocks of this type - call it by this exact name. It is not a transformation of `type` for you to perform: the type id is camelCase and the tool name is snake_case (`fileSource` gives `configure_file_source`)."
                          },
                          "createdFromPreset": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The preset this block was created from, as the `preset` argument that would recreate it (e.g. `customPythonScript`). Provenance - it answers why the block has the options it has, and it is NOT part of the tool name. Absent when the block came from no preset, and also when it no longer matches that preset: a report reshaped out of Insight Explorer shape is a plain report, and its Insight Explorer options are no longer live."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ]
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ]
                          },
                          "errors": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Errors on this block - configuration (block setup invalid) or execution (running the block failed). Empty/absent when there are no errors.",
                            "items": {
                              "$ref": "#/components/schemas/ErrorEntry"
                            }
                          },
                          "warnings": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Warnings on this block - configuration concerns or non-fatal execution issues. Empty/absent when there are no warnings.",
                            "items": {
                              "$ref": "#/components/schemas/ErrorEntry"
                            }
                          },
                          "rawPreview": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "fileSource blocks only: the first lines of the raw file before parsing. Compare against `schemaPerOutput` to spot misaligned headers - if the parsed sample's first row looks like column names, or columns are auto-named, the raw lines show where the real header is so you can fix `firstHeaderRow`/`firstDataRow`.",
                            "properties": {
                              "lines": {
                                "type": [
                                  "array",
                                  "null"
                                ],
                                "description": "First lines of the source file as raw text, before any delimiter parsing. lines[0] is file line 1, lines[1] is line 2, etc.",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "truncated": {
                                "type": [
                                  "boolean",
                                  "null"
                                ],
                                "description": "True if the file continues beyond this sample (line- or byte-capped)."
                              }
                            },
                            "additionalProperties": false,
                            "required": [
                              "lines",
                              "truncated"
                            ]
                          },
                          "outputMeta": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "properties": {
                              "outputs": {
                                "type": [
                                  "array",
                                  "null"
                                ],
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "recordCount": {
                                      "type": [
                                        "integer",
                                        "null"
                                      ]
                                    },
                                    "fieldCount": {
                                      "type": [
                                        "integer",
                                        "null"
                                      ]
                                    }
                                  },
                                  "additionalProperties": false,
                                  "required": [
                                    "recordCount",
                                    "fieldCount"
                                  ]
                                }
                              }
                            },
                            "additionalProperties": false,
                            "required": [
                              "outputs"
                            ]
                          },
                          "inputs": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "items": {
                              "type": "object",
                              "properties": {
                                "connectorName": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Connector name addressing this slot. Pass this exact string as `targetInput` on connect/disconnect."
                                },
                                "slot": {
                                  "type": [
                                    "integer",
                                    "null"
                                  ],
                                  "description": "0-based slot index, or null when this entry is the trailing variadic placeholder."
                                },
                                "isVarArg": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "True if this slot belongs to a variadic connector (more slots can be appended)."
                                },
                                "optional": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "True if the block can run without this slot wired."
                                },
                                "description": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Human description of what this input accepts."
                                },
                                "sourceBlock": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Block whose output is wired into this slot, or null if unwired."
                                },
                                "sourceOutput": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Output connector name on the source block. Null implies the source's default output."
                                },
                                "recordCount": {
                                  "type": [
                                    "integer",
                                    "null"
                                  ],
                                  "description": "Rows arriving on this slot, on execute_blocks results. Compare against the block's own output `recordCount`: an unexplained change is a defect to fix or report, not a detail - an inner join silently dropping every unmatched row looks exactly like a clean run. Absent when the source has not been executed, so absence is not zero."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "connectorName",
                                "slot",
                                "isVarArg",
                                "optional",
                                "description",
                                "sourceBlock",
                                "sourceOutput",
                                "recordCount"
                              ]
                            }
                          },
                          "nextVarArgInput": {
                            "description": "Present only on variadic-input blocks. Describes the next variadic slot that will be allocated on `connect` (e.g. `input3` when slots 0/1 are already wired as `input`/`input2`). Pass this name as `targetInput` on connect to append a new slot, or omit `targetInput` entirely - both append. To overwrite an existing variadic slot, pass its realized name from `inputs[].connectorName`.",
                            "anyOf": [
                              {
                                "$ref": "#/components/schemas/ConnectorInfo"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "outputs": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "items": {
                              "$ref": "#/components/schemas/ConnectorInfo"
                            }
                          },
                          "schemaPerOutput": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "items": {
                              "type": "object",
                              "properties": {
                                "outputName": {
                                  "type": [
                                    "string",
                                    "null"
                                  ]
                                },
                                "dataConfidence": {
                                  "description": "How much of this output's data is on hand, which governs what you may conclude from it. `execute`: full execution data - schema and row count accurate. `sample`: the execution data has since been degraded to a retained sample - schema is correct and the row count is the true total captured at execution. `preview`: preview-quality - the schema may be partial and the row count is omitted because it cannot be trusted. `none`: no readable data on this output. Execute the block if you have not; if you just did, then the block produced none - the execute is not the missing step. Counts and CONTENTS are not equally trustworthy: whatever the level, any rows you can see here are a truncation (see `sample`), so never conclude anything about the data as a whole from them.",
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "description": "Enum values:\n - \"execute\"\n - \"sample\"\n - \"preview\"\n - \"none\"\n",
                                      "enum": [
                                        "execute",
                                        "sample",
                                        "preview",
                                        "none"
                                      ]
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "recordCount": {
                                  "type": [
                                    "integer",
                                    "null"
                                  ]
                                },
                                "fields": {
                                  "type": [
                                    "array",
                                    "null"
                                  ],
                                  "items": {
                                    "type": "object",
                                    "properties": {
                                      "name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ]
                                      },
                                      "type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ]
                                      }
                                    },
                                    "additionalProperties": false,
                                    "required": [
                                      "name",
                                      "type"
                                    ]
                                  }
                                },
                                "sample": {
                                  "type": [
                                    "array",
                                    "null"
                                  ],
                                  "description": "A few rows, for seeing the SHAPE of the data - field names, value formats, obvious mis-parses. Always a truncation, at every `dataConfidence` level, and not a random one: do not generalise from it to the output as a whole. In particular, a column that is empty in these rows is not evidence that it is empty in the data - that inference has deleted a populated column from a 316,834-row table.",
                                  "items": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "additionalProperties": {
                                      "anyOf": [
                                        {
                                          "type": "string"
                                        },
                                        {
                                          "type": "number"
                                        },
                                        {
                                          "type": "string",
                                          "description": "A UTC date in one of these ISO 8601 formats: 1997-07-16, 1997-07-16T19:20:30Z, 1997-07-16T19:20:30.452Z"
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    }
                                  }
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "outputName",
                                "dataConfidence",
                                "recordCount",
                                "fields",
                                "sample"
                              ]
                            }
                          },
                          "options": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Reverse-mapped current options object for this block (the block-type-specific options shape, same as this type's `configure_<type>` tool takes). May be null if the block type isn't yet covered by the AI surface (see `optionsPartial` for hints)."
                          },
                          "optionsPartial": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Field names where the live Omniscope option doesn't fully round-trip into the AI surface. The block has these settings but they're not visible/editable here. Use `configure_<type>` carefully on blocks with partial fields - your replacement will drop them.",
                            "items": {
                              "type": "string"
                            }
                          },
                          "optionNotes": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "On `describe_block` only: option guidance for this block's TYPE - what its `options` fields mean, which the `configure_<type>` schema does not carry. Sent at most once per type per conversation, so absent means either that you already have it earlier in this conversation or that the type has no authored guidance - never that you are missing something. Read it before composing `options`, which is a full replace."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "name",
                          "type",
                          "configureTool",
                          "createdFromPreset",
                          "x",
                          "y",
                          "errors",
                          "warnings",
                          "rawPreview",
                          "outputMeta",
                          "inputs",
                          "nextVarArgInput",
                          "outputs",
                          "schemaPerOutput",
                          "options",
                          "optionsPartial",
                          "optionNotes"
                        ]
                      }
                    },
                    "connections": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "object",
                        "properties": {
                          "sourceBlock": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "sourceOutput": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "targetBlock": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "targetInput": {
                            "type": [
                              "string",
                              "null"
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "sourceBlock",
                          "sourceOutput",
                          "targetBlock",
                          "targetInput"
                        ]
                      }
                    },
                    "parameters": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "value": {
                            "type": [
                              "string",
                              "null"
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "name",
                          "value"
                        ]
                      }
                    },
                    "shapes": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "object",
                        "properties": {
                          "index": {
                            "type": [
                              "integer",
                              "null"
                            ],
                            "description": "Index of this shape - pass it to set_shape / remove_shape."
                          },
                          "shape": {
                            "description": "The shape.\nA decorative canvas annotation (note, section rectangle, label, arrow, line or speech bubble). Does not affect execution - it documents/organises the workflow.",
                            "anyOf": [
                              {
                                "type": "object",
                                "description": "A rectangle, e.g. to frame a section of the workflow.",
                                "properties": {
                                  "type": {
                                    "type": "string",
                                    "const": "rectangle"
                                  },
                                  "text": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                                  },
                                  "colour": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                                  },
                                  "group": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                                  },
                                  "x": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                                  },
                                  "y": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                                  },
                                  "width": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional width in canvas units. Null for a default size."
                                  },
                                  "height": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional height in canvas units. Null for a default size."
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "type",
                                  "text",
                                  "colour",
                                  "group",
                                  "x",
                                  "y",
                                  "width",
                                  "height"
                                ]
                              },
                              {
                                "type": "object",
                                "description": "A sticky note (rectangle with a folded corner), for a comment.",
                                "properties": {
                                  "type": {
                                    "type": "string",
                                    "const": "note"
                                  },
                                  "text": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                                  },
                                  "colour": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                                  },
                                  "group": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                                  },
                                  "x": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                                  },
                                  "y": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                                  },
                                  "width": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional width in canvas units. Null for a default size."
                                  },
                                  "height": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional height in canvas units. Null for a default size."
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "type",
                                  "text",
                                  "colour",
                                  "group",
                                  "x",
                                  "y",
                                  "width",
                                  "height"
                                ]
                              },
                              {
                                "type": "object",
                                "description": "An ellipse.",
                                "properties": {
                                  "type": {
                                    "type": "string",
                                    "const": "ellipse"
                                  },
                                  "text": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                                  },
                                  "colour": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                                  },
                                  "group": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                                  },
                                  "x": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                                  },
                                  "y": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                                  },
                                  "width": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional width in canvas units. Null for a default size."
                                  },
                                  "height": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional height in canvas units. Null for a default size."
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "type",
                                  "text",
                                  "colour",
                                  "group",
                                  "x",
                                  "y",
                                  "width",
                                  "height"
                                ]
                              },
                              {
                                "type": "object",
                                "description": "A free-standing text label (no fill or border).",
                                "properties": {
                                  "type": {
                                    "type": "string",
                                    "const": "text"
                                  },
                                  "text": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                                  },
                                  "colour": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                                  },
                                  "group": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                                  },
                                  "x": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                                  },
                                  "y": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                                  },
                                  "width": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional width in canvas units. Null for a default size."
                                  },
                                  "height": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional height in canvas units. Null for a default size."
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "type",
                                  "text",
                                  "colour",
                                  "group",
                                  "x",
                                  "y",
                                  "width",
                                  "height"
                                ]
                              },
                              {
                                "type": "object",
                                "description": "An arrow pointing from its start (x,y) to its tip (endX,endY).",
                                "properties": {
                                  "type": {
                                    "type": "string",
                                    "const": "arrow"
                                  },
                                  "text": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                                  },
                                  "colour": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                                  },
                                  "group": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                                  },
                                  "x": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                                  },
                                  "y": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                                  },
                                  "endX": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "x coordinate of the tip/end the arrow or line points to. Null for a default length."
                                  },
                                  "endY": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "y coordinate of the tip/end the arrow or line points to. Null for a default length."
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "type",
                                  "text",
                                  "colour",
                                  "group",
                                  "x",
                                  "y",
                                  "endX",
                                  "endY"
                                ]
                              },
                              {
                                "type": "object",
                                "description": "A line from its start (x,y) to its end (endX,endY).",
                                "properties": {
                                  "type": {
                                    "type": "string",
                                    "const": "line"
                                  },
                                  "text": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                                  },
                                  "colour": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                                  },
                                  "group": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                                  },
                                  "x": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                                  },
                                  "y": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                                  },
                                  "endX": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "x coordinate of the tip/end the arrow or line points to. Null for a default length."
                                  },
                                  "endY": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "y coordinate of the tip/end the arrow or line points to. Null for a default length."
                                  },
                                  "arrowhead": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "True to draw a small arrowhead on the line's end. Null/false for a plain line."
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "type",
                                  "text",
                                  "colour",
                                  "group",
                                  "x",
                                  "y",
                                  "endX",
                                  "endY",
                                  "arrowhead"
                                ]
                              },
                              {
                                "type": "object",
                                "description": "A speech bubble whose tail points at (pointsAtX,pointsAtY).",
                                "properties": {
                                  "type": {
                                    "type": "string",
                                    "const": "bubble"
                                  },
                                  "text": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                                  },
                                  "colour": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                                  },
                                  "group": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                                  },
                                  "x": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                                  },
                                  "y": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                                  },
                                  "width": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional width in canvas units. Null for a default size."
                                  },
                                  "height": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "Optional height in canvas units. Null for a default size."
                                  },
                                  "pointsAtX": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "x coordinate the speech-bubble tail points at. Null for a default tail."
                                  },
                                  "pointsAtY": {
                                    "type": [
                                      "number",
                                      "null"
                                    ],
                                    "description": "y coordinate the speech-bubble tail points at. Null for a default tail."
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "type",
                                  "text",
                                  "colour",
                                  "group",
                                  "x",
                                  "y",
                                  "width",
                                  "height",
                                  "pointsAtX",
                                  "pointsAtY"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "index",
                          "shape"
                        ]
                      }
                    },
                    "groups": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The group's unique name."
                          },
                          "notes": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional notes describing the group. Null if none."
                          },
                          "members": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Names of the blocks in this group.",
                            "items": {
                              "type": "string"
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "name",
                          "notes",
                          "members"
                        ]
                      }
                    },
                    "orphans": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "Blocks with no connection in either direction. These are dead or unfinished, and are worth mentioning when you describe the workflow - do not silently skip them. Absent when every block is connected.",
                      "items": {
                        "type": "string"
                      }
                    },
                    "note": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "blocks",
                    "connections",
                    "parameters",
                    "shapes",
                    "groups",
                    "orphans",
                    "note"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/group_blocks": {
      "post": {
        "tags": [
          "Shapes & groups"
        ],
        "summary": "group_blocks",
        "operationId": "group_blocks",
        "description": "Visually group the named blocks under a block group (organisational only; does not affect execution). Creates the group, or adds the blocks to it if the name already exists. Use this ONLY when the user explicitly asks to group blocks; do NOT group blocks on your own initiative. To organize a larger workflow, prefer visual PLACEMENT (position related blocks near each other in a tidy left-to-right flow) and, if it adds clarity, canvas shapes via add_shape - not block groups.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Visually group the named blocks under a block group on the canvas (purely organisational; does not affect execution). Creates the group if it does not exist, or adds the blocks to it if it does. The group name must be unique among block and group names.",
                "properties": {
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Optional group name. Null lets the server pick a unique name (e.g. `Group 1`)."
                  },
                  "blocks": {
                    "type": "array",
                    "description": "The names of the blocks to put in the group.",
                    "items": {
                      "type": "string"
                    }
                  },
                  "notes": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Optional notes describing the group. Null for none."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "name",
                  "blocks",
                  "notes"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call group_blocks",
                  "value": {
                    "name": null,
                    "blocks": [
                      "text"
                    ],
                    "notes": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string",
                  "description": "A human-readable confirmation or summary message (this tool returns prose, not a structured object)."
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/list_block_option_choices": {
      "post": {
        "tags": [
          "Discover types & options"
        ],
        "summary": "list_block_option_choices",
        "operationId": "list_block_option_choices",
        "description": "Look up valid values for a choice option (use this whenever a field's description says **Restricted choice** or **Choice** with a list_block_option_choices hint).\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Look up valid values for a choice option. Provide either `block` (name of an existing block - its current options give the resolution context) or `type` (look up against a default block of that type). Returns the current list of choices; for **Restricted choice** fields the value you subsequently set must come from this list.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Name of an existing block in the workflow. The block's current options provide the resolution context (use this when a dependent provider needs sibling fields, e.g. connection/schemaName for tableName). Provide either `block` or `type`, not both."
                  },
                  "type": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Block type id, e.g. `demoData`, `databaseSource`, `fileSource` (the same bare colon-id `describe_block_type` reports). Use this to look up choices for a not-yet-created block (a transient default block of this type is used as the resolution context). Provide either `block` or `type`, not both."
                  },
                  "option": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Dot-path of the option whose choices you want, in AI names. Examples: `dataset`, `connection`, `schemaName`, `tableName`."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "type",
                  "option"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call list_block_option_choices",
                  "value": {
                    "block": null,
                    "type": null,
                    "option": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "allowCustom": {
                      "type": [
                        "boolean",
                        "null"
                      ]
                    },
                    "totalCount": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "choices": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "title": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "special": {
                            "type": [
                              "boolean",
                              "null"
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "name",
                          "title",
                          "special"
                        ]
                      }
                    },
                    "note": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "allowCustom",
                    "totalCount",
                    "choices",
                    "note"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/list_blocks": {
      "post": {
        "tags": [
          "Inspect the workflow"
        ],
        "summary": "list_blocks",
        "operationId": "list_blocks",
        "description": "List all blocks in the workflow (name + type).\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "List blocks in the workflow, returning name and type per block. Cheap call — use before any mutation to confirm your mental model.",
                "properties": {
                  "nameFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Optional case-insensitive substring filter on block name. Pass null (the default) for every block; use a substring only when narrowing a large workflow."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "nameFilter"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call list_blocks",
                  "value": {
                    "nameFilter": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "blocks": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "type": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "This block's type, always the bare base type - the id `describe_block_type` takes. Never preset-qualified: what it was created from is `createdFromPreset`, which never names a tool. The tool that configures it is given in full as `configureTool` by `describe_block` and `describe_block_type` - do not build a tool name out of this id."
                          },
                          "createdFromPreset": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The preset this block was created from, as the `preset` argument that would recreate it (e.g. `customPythonScript`). Provenance - it answers why the block has the options it has, and it is NOT part of the tool name. Absent when the block came from no preset, and also when it no longer matches that preset: a report reshaped out of Insight Explorer shape is a plain report, and its Insight Explorer options are no longer live."
                          },
                          "hasError": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "True if this block has any error - configuration or execution. Call `describe_block` for details."
                          },
                          "hasWarning": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "True if this block has any warning. Call `describe_block` for details."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "name",
                          "type",
                          "createdFromPreset",
                          "hasError",
                          "hasWarning"
                        ]
                      }
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "blocks"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/list_files": {
      "post": {
        "tags": [
          "Files"
        ],
        "summary": "list_files",
        "operationId": "list_files",
        "description": "Browse the local file system the project can see (same listing + access limits as the file-source Browse dialog). To browse for a specific file option you are configuring, anchor with forBlock/forType + forOption and the listing is auto-restricted to that option's permitted file types (e.g. a database file) - no need to know the extensions. The applied filter is echoed in appliedFileTypes. When you anchor an option (forBlock+forOption) that ALREADY has a value, the listing opens at that file's enclosing folder and echoes the current value in configuredValuePathComponents/configuredValue - if that is the file you wanted, it is already set. Navigate ONLY by copying a folder entry's or shortcut's pathComponents verbatim (or an absolute path you already hold); never build pathComponents from folder names - an unresolvable path is rejected.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Browse the local file system the project can see - the same listing the file-source 'Browse' dialog shows, with the same access restrictions. Discovers what files exist and their exact paths for configuring a fileSource. Call with no path to get the default home folder plus shortcuts; navigate by passing the `pathComponents` of a folder from a previous response. To browse *for a specific file option you are configuring* (e.g. a Database block's database file), anchor the call with `forBlock`/`forType` + `forOption`: the listing is then restricted to that option's permitted file types automatically, just like clicking Browse next to the field in the UI - you do not need to know or pass the extensions yourself.",
                "properties": {
                  "forBlock": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Optional. Name of an existing block you are configuring a file option for. When given with `forOption`, the listing is restricted to that option's permitted file types (its `@Option` fileTypes / filesOnly), exactly like the UI Browse button beside the field. Provide either `forBlock` or `forType`, not both. Prefer `forBlock` - it resolves the block's live variant (e.g. the chosen database vendor)."
                  },
                  "forType": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Optional. A block-type id (the same bare colon-id `describe_block_type` reports, e.g. `database`) to anchor against before the block exists. Used with `forOption`. Provide either `forBlock` or `forType`, not both."
                  },
                  "forOption": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Optional. Dot-path (in AI names) of the file option being filled, e.g. `databaseConnection.locationOptions`. Required to activate anchoring; pair with `forBlock` or `forType`. The listing is then filtered to that option's permitted file types. The option's description tells you the exact path to pass."
                  },
                  "pathComponents": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Path of the folder to list, as the `pathComponents` array copied VERBATIM from a previous `list_files` response (a folder entry or a shortcut), or an absolute path you already hold (e.g. a configured option value). Do NOT construct it from folder display names - paths are absolute and a built/relative path that does not resolve is rejected with guidance. Omit (or pass empty) to list the default home folder; when anchored to an option that already has a value, omitting this opens at that value's enclosing folder.",
                    "items": {
                      "type": "string"
                    }
                  },
                  "foldersOnly": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "If true, list folders only (hide files). Defaults to false."
                  },
                  "fileTypes": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Restrict listed files to these extensions (without the dot, e.g. [\"csv\",\"tsv\"]). Omit to show all data files. Folders are always listed. Passing this also lifts the default hiding of non-data files, so to browse for e.g. Omniscope projects use fileTypes:[\"iox\"].",
                    "items": {
                      "type": "string"
                    }
                  },
                  "includeAllFileTypes": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "If true, also list non-data files that are hidden by default (Omniscope projects such as .iox, scripts, images, static resources and lock files). Defaults to false. Leave false for normal data-source browsing; set true only when you specifically need to see those files. Ignored when `fileTypes` is given."
                  },
                  "showHiddenFiles": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "If true, include hidden files/folders. Defaults to false."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "forBlock",
                  "forType",
                  "forOption",
                  "pathComponents",
                  "foldersOnly",
                  "fileTypes",
                  "includeAllFileTypes",
                  "showHiddenFiles"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call list_files",
                  "value": {
                    "forBlock": null,
                    "forType": null,
                    "forOption": null,
                    "pathComponents": null,
                    "foldersOnly": null,
                    "fileTypes": null,
                    "includeAllFileTypes": null,
                    "showHiddenFiles": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "rootDisplayName": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Human-readable name of the browse root."
                    },
                    "folderPathComponents": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "Path of the folder being listed (its own pathComponents).",
                      "items": {
                        "type": "string"
                      }
                    },
                    "entries": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "Files and folders directly within the listed folder.",
                      "items": {
                        "$ref": "#/components/schemas/FileEntry"
                      }
                    },
                    "shortcuts": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "Quick-access roots (home, project folder, configured mounts) - navigate via their pathComponents.",
                      "items": {
                        "$ref": "#/components/schemas/FileEntry"
                      }
                    },
                    "restrictedAccess": {
                      "type": [
                        "boolean",
                        "null"
                      ],
                      "description": "True if browsing is restricted to a sub-tree (you cannot navigate above the root)."
                    },
                    "appliedFileTypes": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "The file-type allow-list actually applied to this listing (e.g. when anchored to a file option via forBlock/forOption). Null means no inclusion filter was applied.",
                      "items": {
                        "type": "string"
                      }
                    },
                    "note": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "A note about how the listing was filtered (e.g. why an anchor did not resolve and the listing fell back to the default data-file view)."
                    },
                    "configuredValuePathComponents": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "When anchored (forBlock+forOption) to a file option that ALREADY has a value, the absolute pathComponents of the currently-configured file. The listing is seeded at this file's enclosing folder. If this is the file you want, the option is already set correctly - no change needed.",
                      "items": {
                        "type": "string"
                      }
                    },
                    "configuredValue": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Human-readable form of the currently-configured value (display only - navigate using configuredValuePathComponents or an entry's pathComponents, never this string)."
                    },
                    "folderReadme": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The listed folder's README, if it has one - its text, not a file entry (README files are hidden from browsing, so you cannot open one yourself and their absence from `entries` means nothing). Where a folder has one it usually describes what is in it and how it fits together, so read it before deciding what to load. Absent when the folder has none."
                    },
                    "error": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Error message if the listing failed (e.g. path not found or not permitted)."
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "rootDisplayName",
                    "folderPathComponents",
                    "entries",
                    "shortcuts",
                    "restrictedAccess",
                    "appliedFileTypes",
                    "note",
                    "configuredValuePathComponents",
                    "configuredValue",
                    "folderReadme",
                    "error"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/lookup_formula_functions": {
      "post": {
        "tags": [
          "Discover types & options"
        ],
        "summary": "lookup_formula_functions",
        "operationId": "lookup_formula_functions",
        "description": "Look up Omniscope formula functions for a Field Organiser `formula` (filter by `query` and/or `category`). Use it so you author formulas with real function names + signatures. A multi-word `query` is matched word by word, strongest match first - describe what you want (\"join text\", \"count spaces\") rather than guessing an exact phrase.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Look up Omniscope formula functions for use in a Field Organiser `formula` field. Optionally filter by `query` (keyword over name/description) and/or `category`. With no arguments, returns every (non-deprecated) function. Use this when authoring a formula so you use real function names and signatures; field references in formulas use the `[Field name]` syntax.",
                "properties": {
                  "query": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Optional keyword search over each function's name, description and category (case-insensitive substring), e.g. \"date\", \"round\", \"concat\", \"if\"."
                  },
                  "category": {
                    "description": "Optional category filter - pick one of the fixed categories below to return only that category's functions. Combine with `query` to search within a category.",
                    "anyOf": [
                      {
                        "type": "string",
                        "description": "Enum values:\n - \"mathsStats\": Maths and statistics functions (sum, mean, round, ...).\n - \"logical\": Logical functions (IF, AND, OR, NOT, ...).\n - \"data\": Data / field functions (lookups, record/field operations).\n - \"text\": Text / string functions (CONCATENATE, LEFT, TRIM, ...).\n - \"gis\": Geographic / GIS functions.\n - \"web\": Web / URL functions.\n - \"date\": Date and time functions (YEAR, DATE, TEXTTODATE, ...).\n - \"script\": Scripting functions.\n",
                        "enum": [
                          "mathsStats",
                          "logical",
                          "data",
                          "text",
                          "gis",
                          "web",
                          "date",
                          "script"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "query",
                  "category"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call lookup_formula_functions",
                  "value": {
                    "query": null,
                    "category": "mathsStats"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "totalCount": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Total number of functions matching the filter (before any cap)."
                    },
                    "note": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Optional guidance - e.g. how to narrow a broad result."
                    },
                    "functions": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "The matching formula functions, sorted by category then name.",
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Function name as used in a formula, e.g. `ROUND`, `CONCATENATE`, `IF`."
                          },
                          "category": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Category (e.g. Text, Date, Maths, Logical)."
                          },
                          "syntax": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Call syntax / signature, e.g. `ROUND(number, decimals)`."
                          },
                          "description": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "One-line description of what the function does."
                          },
                          "notScalable": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "True if the function does not scale to large data (use with care)."
                          },
                          "deprecated": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "True if the function is deprecated (avoid in new formulas)."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "name",
                          "category",
                          "syntax",
                          "description",
                          "notScalable",
                          "deprecated"
                        ]
                      }
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "totalCount",
                    "note",
                    "functions"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/move_block": {
      "post": {
        "tags": [
          "Build & edit blocks"
        ],
        "summary": "move_block",
        "operationId": "move_block",
        "description": "Reposition a block on the canvas.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Reposition a block on the canvas. Coordinates are virtual canvas coordinates; the canvas auto-scrolls. Use this for tidy-up only — placement does not affect execution.",
                "properties": {
                  "block": {
                    "type": "string",
                    "description": "Block name."
                  },
                  "x": {
                    "type": "number",
                    "description": "New x coordinate on the canvas. 20-pixel grid; adjacent-block horizontal spacing is 160 (block 40 + padding 120). Snapped to grid and shifted to nearest free position if the supplied coordinates would overlap another block; final position is reported back."
                  },
                  "y": {
                    "type": "number",
                    "description": "New y coordinate on the canvas. Adjacent-block vertical spacing is 120 (block 40 + padding 80). Auto-shifted on overlap same as x."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "x",
                  "y"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call move_block",
                  "value": {
                    "block": "MyBlock",
                    "x": 0,
                    "y": 0
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/remove_block": {
      "post": {
        "tags": [
          "Build & edit blocks"
        ],
        "summary": "remove_block",
        "operationId": "remove_block",
        "description": "Remove a block (and its connections).\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Remove a block from the workflow. Inbound and outbound connections are also removed.",
                "properties": {
                  "block": {
                    "type": "string",
                    "description": "Block name."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call remove_block",
                  "value": {
                    "block": "MyBlock"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string",
                  "description": "A human-readable confirmation or summary message (this tool returns prose, not a structured object)."
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/remove_shape": {
      "post": {
        "tags": [
          "Shapes & groups"
        ],
        "summary": "remove_shape",
        "operationId": "remove_shape",
        "description": "Remove the canvas shape at the given index (from get_workflow's shapes). Removing one shifts later indices - re-read get_workflow before removing another.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Remove the canvas shape at the given index (from get_workflow's shapes). Note: removing a shape shifts the indices of later shapes, so re-read get_workflow before removing another.",
                "properties": {
                  "index": {
                    "type": "integer",
                    "description": "Integer index of the shape to remove (from get_workflow's shapes[].index)."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "index"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call remove_shape",
                  "value": {
                    "index": 0
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string",
                  "description": "A human-readable confirmation or summary message (this tool returns prose, not a structured object)."
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/reset_layout": {
      "post": {
        "tags": [
          "Build & edit blocks"
        ],
        "summary": "reset_layout",
        "operationId": "reset_layout",
        "description": "Re-lay out the ENTIRE workflow into a clean left-to-right, data-flow layout (sources on the left, results on the right), recomputing every block position from the connection graph - current positions are discarded by default (pass `mode`:`minimiseChange` to instead keep blocks near where they are). ONLY call this when the user EXPLICITLY asks you to tidy, re-arrange or re-lay-out the workflow. Do NOT call it on your own initiative: blocks you add are already arranged automatically as you build (so there is nothing to tidy), and any layout you did not just build may have been arranged by the user - re-laying it out would discard their work. Best-effort; does not affect execution. Refuses if the workflow has shapes/annotations (they would be stranded) or fewer than two blocks.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Re-lay out the ENTIRE workflow left-to-right by data flow. ONLY call when the user explicitly asks to tidy/re-arrange - never on your own initiative (workflows you build are auto-arranged; an existing layout may be the user's). Optionally pick a `mode`.",
                "properties": {
                  "mode": {
                    "description": "How to re-lay out. `hardReset` (the default if omitted): discard current positions and recompute a clean left-to-right layout from the connection graph - use when the user wants it properly tidied. `minimiseChange`: recompute but seed from current positions so blocks stay near where they are - gentler, use when the user likes the rough arrangement but wants it neatened.",
                    "anyOf": [
                      {
                        "type": "string",
                        "description": "Enum values:\n - \"hardReset\": Discard current positions; recompute a clean left-to-right layout from scratch.\n - \"minimiseChange\": Recompute but seed from current positions, so blocks stay near where they are.\n",
                        "enum": [
                          "hardReset",
                          "minimiseChange"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "mode"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call reset_layout",
                  "value": {
                    "mode": "hardReset"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string",
                  "description": "A human-readable confirmation or summary message (this tool returns prose, not a structured object)."
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/set_block_name": {
      "post": {
        "tags": [
          "Build & edit blocks"
        ],
        "summary": "set_block_name",
        "operationId": "set_block_name",
        "description": "Rename a block.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Rename a block. The name you give is used exactly: if another block already has it, the call fails rather than renaming to a variant. Renaming a block to the name it already has is a no-op, not a collision.",
                "properties": {
                  "block": {
                    "type": "string",
                    "description": "Current block name."
                  },
                  "newName": {
                    "type": "string",
                    "description": "Desired new name, used exactly. A block name is both its display label and its id, and is case-insensitive (so it must be unique ignoring case - a case-only collision with ANOTHER block is a collision, and fails). Use a clear, human-readable name in Title Case with spaces allowed, e.g. \"Cleaned Sales\" or \"Orders By Region\"."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "newName"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call set_block_name",
                  "value": {
                    "block": "MyBlock",
                    "newName": "MyBlock"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/set_connector_inputs": {
      "post": {
        "tags": [
          "Connect blocks"
        ],
        "summary": "set_connector_inputs",
        "operationId": "set_connector_inputs",
        "description": "Set a connector's complete ordered source list in one call.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Set a connector's COMPLETE, ordered source list in one atomic call. This is the right tool to set the sources to exactly [A,B,C], reorder them, insert one mid-list, or remove one and close the gap - intents the positional `connect`/`disconnect` cannot express cleanly. For a variadic connector (e.g. a Report's `input`) the slots become a contiguous list matching `sources`; for a static connector pass at most one source. Connectors you do not name are left untouched. For appending a single source or overwriting one slot in place, prefer `connect`.",
                "properties": {
                  "block": {
                    "type": "string",
                    "description": "Block whose connector is being set."
                  },
                  "targetInput": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The connector's BASE name (e.g. `input` for a Report, `data` for a Q&A block), verbatim from `describe_block_type(type).inputs[].name` or `describe_block`. NOT a realized slot name like `input2` - this verb addresses the whole connector, not one slot. Omit only when the block has a single connector."
                  },
                  "sources": {
                    "type": "array",
                    "description": "The connector's complete new source list, in order. The first source becomes the connector's first slot, and so on. An empty array clears the connector. The source blocks must already exist.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "sourceBlock": {
                          "type": "string",
                          "description": "Name of an existing block whose output feeds this input."
                        },
                        "sourceOutput": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Source connector name, verbatim from `describe_block.outputs[].name`. Omit for single-output source blocks."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "sourceBlock",
                        "sourceOutput"
                      ]
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "targetInput",
                  "sources"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call set_connector_inputs",
                  "value": {
                    "block": "text",
                    "targetInput": null,
                    "sources": [
                      {
                        "sourceBlock": "MyBlock",
                        "sourceOutput": null
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/set_shape": {
      "post": {
        "tags": [
          "Shapes & groups"
        ],
        "summary": "set_shape",
        "operationId": "set_shape",
        "description": "Edit the canvas shape at the given index (from get_workflow's shapes). Supplied non-null fields overlay the current shape; a different `type` replaces it.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Edit the canvas shape at the given index (from get_workflow's shapes). The supplied non-null fields overlay the current shape (same `type`); a different `type` replaces it. Read the shape from get_workflow first so you keep its other values.",
                "properties": {
                  "index": {
                    "type": "integer",
                    "description": "Integer index of the shape to edit (from get_workflow's shapes[].index)."
                  },
                  "shape": {
                    "description": "The shape fields to apply.\nA decorative canvas annotation (note, section rectangle, label, arrow, line or speech bubble). Does not affect execution - it documents/organises the workflow.",
                    "anyOf": [
                      {
                        "type": "object",
                        "description": "A rectangle, e.g. to frame a section of the workflow.",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "rectangle"
                          },
                          "text": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                          },
                          "colour": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                          },
                          "group": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "width": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional width in canvas units. Null for a default size."
                          },
                          "height": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional height in canvas units. Null for a default size."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "text",
                          "colour",
                          "group",
                          "x",
                          "y",
                          "width",
                          "height"
                        ]
                      },
                      {
                        "type": "object",
                        "description": "A sticky note (rectangle with a folded corner), for a comment.",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "note"
                          },
                          "text": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                          },
                          "colour": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                          },
                          "group": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "width": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional width in canvas units. Null for a default size."
                          },
                          "height": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional height in canvas units. Null for a default size."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "text",
                          "colour",
                          "group",
                          "x",
                          "y",
                          "width",
                          "height"
                        ]
                      },
                      {
                        "type": "object",
                        "description": "An ellipse.",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "ellipse"
                          },
                          "text": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                          },
                          "colour": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                          },
                          "group": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "width": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional width in canvas units. Null for a default size."
                          },
                          "height": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional height in canvas units. Null for a default size."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "text",
                          "colour",
                          "group",
                          "x",
                          "y",
                          "width",
                          "height"
                        ]
                      },
                      {
                        "type": "object",
                        "description": "A free-standing text label (no fill or border).",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "text"
                          },
                          "text": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                          },
                          "colour": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                          },
                          "group": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "width": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional width in canvas units. Null for a default size."
                          },
                          "height": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional height in canvas units. Null for a default size."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "text",
                          "colour",
                          "group",
                          "x",
                          "y",
                          "width",
                          "height"
                        ]
                      },
                      {
                        "type": "object",
                        "description": "An arrow pointing from its start (x,y) to its tip (endX,endY).",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "arrow"
                          },
                          "text": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                          },
                          "colour": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                          },
                          "group": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "endX": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "x coordinate of the tip/end the arrow or line points to. Null for a default length."
                          },
                          "endY": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "y coordinate of the tip/end the arrow or line points to. Null for a default length."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "text",
                          "colour",
                          "group",
                          "x",
                          "y",
                          "endX",
                          "endY"
                        ]
                      },
                      {
                        "type": "object",
                        "description": "A line from its start (x,y) to its end (endX,endY).",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "line"
                          },
                          "text": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                          },
                          "colour": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                          },
                          "group": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "endX": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "x coordinate of the tip/end the arrow or line points to. Null for a default length."
                          },
                          "endY": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "y coordinate of the tip/end the arrow or line points to. Null for a default length."
                          },
                          "arrowhead": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "True to draw a small arrowhead on the line's end. Null/false for a plain line."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "text",
                          "colour",
                          "group",
                          "x",
                          "y",
                          "endX",
                          "endY",
                          "arrowhead"
                        ]
                      },
                      {
                        "type": "object",
                        "description": "A speech bubble whose tail points at (pointsAtX,pointsAtY).",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "bubble"
                          },
                          "text": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The text shown on/in the shape (the note text, section title, label, or arrow caption). Null for none."
                          },
                          "colour": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional CSS colour for the shape (e.g. `#fff8c4` or `rgba(255,248,196,1)`). Null for the default colour."
                          },
                          "group": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Optional name of a block group this shape belongs to (see group_blocks). Null if it is not part of a group."
                          },
                          "x": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional x (left) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "y": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional y (top) canvas coordinate of the shape's anchor point. Null lets the server place it."
                          },
                          "width": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional width in canvas units. Null for a default size."
                          },
                          "height": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Optional height in canvas units. Null for a default size."
                          },
                          "pointsAtX": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "x coordinate the speech-bubble tail points at. Null for a default tail."
                          },
                          "pointsAtY": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "y coordinate the speech-bubble tail points at. Null for a default tail."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "type",
                          "text",
                          "colour",
                          "group",
                          "x",
                          "y",
                          "width",
                          "height",
                          "pointsAtX",
                          "pointsAtY"
                        ]
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "index",
                  "shape"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call set_shape",
                  "value": {
                    "index": 0,
                    "shape": {
                      "type": "rectangle",
                      "text": null,
                      "colour": null,
                      "group": null,
                      "x": null,
                      "y": null,
                      "width": null,
                      "height": null
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string",
                  "description": "A human-readable confirmation or summary message (this tool returns prose, not a structured object)."
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/set_workflow": {
      "post": {
        "tags": [
          "Build & edit blocks"
        ],
        "summary": "set_workflow",
        "operationId": "set_workflow",
        "description": "REPLACE the whole workflow from a workflow-document JSON (as produced by export_workflow). Destructive - clears the current blocks and wiring first. Call once with confirm omitted/false to preview what will be replaced (nothing changes), then again with confirm=true to apply. Accepts the export_workflow envelope or the flat get_workflow shape.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "REPLACE the whole workflow from a workflow-document JSON (as produced by export_workflow). Destructive: the current blocks and wiring are cleared first. Call once with confirm omitted/false to preview what will be replaced (nothing changes), then again with confirm=true to apply. Accepts the export_workflow envelope or the flat get_workflow shape.",
                "properties": {
                  "workflow": {
                    "$ref": "#/components/schemas/WorkflowDocument",
                    "description": "The whole workflow to apply (see the WorkflowDocument schema / the overview)."
                  },
                  "confirm": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Must be true to actually replace the workflow. Omit (or false) first to get a preview of what would be replaced; nothing is changed until you resend with confirm=true."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "workflow",
                  "confirm"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call set_workflow",
                  "value": {
                    "workflow": {
                      "blocks": [
                        {
                          "name": "Sales",
                          "type": "fileSource",
                          "options": {
                            "path": "Sales.csv"
                          }
                        },
                        {
                          "name": "Report",
                          "type": "report:insightExplorer"
                        }
                      ],
                      "connections": {
                        "Sales": [
                          "Report"
                        ]
                      }
                    },
                    "confirm": false
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string",
                  "description": "A human-readable confirmation or summary message (this tool returns prose, not a structured object)."
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/ungroup": {
      "post": {
        "tags": [
          "Shapes & groups"
        ],
        "summary": "ungroup",
        "operationId": "ungroup",
        "description": "Remove a block group. The blocks (and any grouped shapes) remain - they are just no longer grouped. Does not affect execution.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Remove a block group. The member blocks (and any shapes in the group) remain; they are just no longer grouped. Does not affect execution.",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "The name of the group to remove."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "name"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call ungroup",
                  "value": {
                    "name": "MyBlock"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string",
                  "description": "A human-readable confirmation or summary message (this tool returns prose, not a structured object)."
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_demo_data": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_demo_data",
        "operationId": "configure_demo_data",
        "x-experimental": true,
        "x-block-type": "demoData",
        "description": "Add or configure a Demo data block. Loads one of the built-in demo datasets.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_demoData",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_demo_data",
                  "value": {
                    "name": "My demoData",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_file_source": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_file_source",
        "operationId": "configure_file_source",
        "x-experimental": true,
        "x-block-type": "fileSource",
        "description": "Add or configure a File block. Imports data from a file, archive, URL, cloud storage, or another supported file location.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "preset": {
                    "description": "Which preset to create the block from. Send null for 'file', this type's default. A preset is a set of starting options. Supplying `options` as well REPLACES them entirely, so the preset then has no effect - send one or the other. Send null when configuring an existing block: it already has options, and a preset only ever seeds a new block's.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "file",
                          "api",
                          "amazonS3",
                          "googleCloudStorage",
                          "remoteFileViaSsh",
                          "hadoopHdfs",
                          "googleDrive",
                          "azureGen2Storage",
                          "dropboxExperimental",
                          "embeddedDataFile"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_fileSource",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "preset",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_file_source",
                  "value": {
                    "name": "My fileSource",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_database": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_database",
        "operationId": "configure_database",
        "x-experimental": true,
        "x-block-type": "database",
        "description": "Add or configure a Database block. Connects to a database table or runs custom SQL.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_database",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_database",
                  "value": {
                    "name": "My database",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_text_input": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_text_input",
        "operationId": "configure_text_input",
        "x-experimental": true,
        "x-block-type": "textInput",
        "description": "Add or configure a Text input block. Creates a small dataset by manually entering rows and fields.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "preset": {
                    "description": "Which preset to create the block from. Send null for 'textInput', this type's default. A preset is a set of starting options. Supplying `options` as well REPLACES them entirely, so the preset then has no effect - send one or the other. Send null when configuring an existing block: it already has options, and a preset only ever seeds a new block's.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "textInput",
                          "multiTenantConfigExample",
                          "batchOutputConfigExample",
                          "reportGeneratorConfig"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_textInput",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "preset",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_text_input",
                  "value": {
                    "name": "My textInput",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_append_files": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_append_files",
        "operationId": "configure_append_files",
        "x-experimental": true,
        "x-block-type": "appendFiles",
        "description": "Add or configure a Append files block. Appends rows from one or more files into a single dataset.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_appendFiles",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_append_files",
                  "value": {
                    "name": "My appendFiles",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_file_meta": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_file_meta",
        "operationId": "configure_file_meta",
        "x-experimental": true,
        "x-block-type": "fileMeta",
        "description": "Add or configure a File attributes block. Lists files and their attributes from a folder or location.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_fileMeta",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_file_meta",
                  "value": {
                    "name": "My fileMeta",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_batch_append_folder": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_batch_append_folder",
        "operationId": "configure_batch_append_folder",
        "x-experimental": true,
        "x-block-type": "batchAppendFolder",
        "description": "Add or configure a Batch append folder block. Appends files from a folder or storage location, including subfolders if selected.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_batchAppendFolder",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_batch_append_folder",
                  "value": {
                    "name": "My batchAppendFolder",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_value_sequence": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_value_sequence",
        "operationId": "configure_value_sequence",
        "x-experimental": true,
        "x-block-type": "valueSequence",
        "description": "Add or configure a Value sequence block. Generates a sequence of numbers or dates.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_valueSequence",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_value_sequence",
                  "value": {
                    "name": "My valueSequence",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_distribution_input": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_distribution_input",
        "operationId": "configure_distribution_input",
        "x-experimental": true,
        "x-block-type": "distributionInput",
        "description": "Add or configure a Distribution Input block. Generates a chosen number of random values from a selected distribution.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_distributionInput",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_distribution_input",
                  "value": {
                    "name": "My distributionInput",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_email": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_email",
        "operationId": "configure_email",
        "x-experimental": true,
        "x-block-type": "email",
        "description": "Add or configure a Email block. Imports messages and selected details from an email server.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_email",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_email",
                  "value": {
                    "name": "My email",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_lookup_data": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_lookup_data",
        "operationId": "configure_lookup_data",
        "x-experimental": true,
        "x-block-type": "lookupData",
        "description": "Add or configure a Lookup data block. Loads data from a selected lookup dataset.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_lookupData",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_lookup_data",
                  "value": {
                    "name": "My lookupData",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_data_table": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_data_table",
        "operationId": "configure_data_table",
        "x-experimental": true,
        "x-block-type": "dataTable",
        "description": "Add or configure a Data table block. Stores upstream data in an editable table with refill and refresh controls.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_dataTable",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_data_table",
                  "value": {
                    "name": "My dataTable",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_project_meta": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_project_meta",
        "operationId": "configure_project_meta",
        "x-experimental": true,
        "x-block-type": "projectMeta",
        "description": "Add or configure a Project metadata block. Gets metadata for an IOX project from a file, URL, or HDFS location.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_projectMeta",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_project_meta",
                  "value": {
                    "name": "My projectMeta",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_elasticsearch": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_elasticsearch",
        "operationId": "configure_elasticsearch",
        "x-experimental": true,
        "x-block-type": "elasticsearch",
        "description": "Add or configure a Elasticsearch block. Connects to an Elasticsearch index and searches rows with optional filters and authentication.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_elasticsearch",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_elasticsearch",
                  "value": {
                    "name": "My elasticsearch",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_currency": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_currency",
        "operationId": "configure_currency",
        "x-experimental": true,
        "x-block-type": "currency",
        "description": "Add or configure a Currency block. Selects an Open Exchange Rates report to import currency data.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_currency",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_currency",
                  "value": {
                    "name": "My currency",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_g_analytics": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_g_analytics",
        "operationId": "configure_g_analytics",
        "x-experimental": true,
        "x-block-type": "gAnalytics",
        "description": "Add or configure a Google Analytics 4 block. Imports Google Analytics 4 report data.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_gAnalytics",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_g_analytics",
                  "value": {
                    "name": "My gAnalytics",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_google_analytics": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_google_analytics",
        "operationId": "configure_google_analytics",
        "x-experimental": true,
        "x-block-type": "googleAnalytics",
        "description": "Add or configure a Google Universal Analytics 360 block. Imports report data from Google Universal Analytics.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_googleAnalytics",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_google_analytics",
                  "value": {
                    "name": "My googleAnalytics",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_google_sheets": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_google_sheets",
        "operationId": "configure_google_sheets",
        "x-experimental": true,
        "x-block-type": "googleSheets",
        "description": "Add or configure a Google Sheets block. Imports rows from a Google Sheet.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_googleSheets",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_google_sheets",
                  "value": {
                    "name": "My googleSheets",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_double_click": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_double_click",
        "operationId": "configure_double_click",
        "x-experimental": true,
        "x-block-type": "doubleClick",
        "description": "Add or configure a Google Campaign Manager 360 block. Imports report data from Google Campaign Manager 360.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_doubleClick",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_double_click",
                  "value": {
                    "name": "My doubleClick",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_salesforce": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_salesforce",
        "operationId": "configure_salesforce",
        "x-experimental": true,
        "x-block-type": "salesforce",
        "description": "Add or configure a Salesforce block. Reads data from a Salesforce table or custom SOQL query.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_salesforce",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_salesforce",
                  "value": {
                    "name": "My salesforce",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_twitter": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_twitter",
        "operationId": "configure_twitter",
        "x-experimental": true,
        "x-block-type": "twitter",
        "description": "Add or configure a Twitter block. Imports Twitter report data using a chosen account connection and report type.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_twitter",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_twitter",
                  "value": {
                    "name": "My twitter",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_reddit": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_reddit",
        "operationId": "configure_reddit",
        "x-experimental": true,
        "x-block-type": "reddit",
        "description": "Add or configure a Reddit block. Imports Reddit articles or comments from a connected account.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_reddit",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_reddit",
                  "value": {
                    "name": "My reddit",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_token_analyst": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_token_analyst",
        "operationId": "configure_token_analyst",
        "x-experimental": true,
        "x-block-type": "tokenAnalyst",
        "description": "Add or configure a Token Analyst block. Connects to TokenAnalyst Bitcoin streams and captures transaction events for a set time.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_tokenAnalyst",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_token_analyst",
                  "value": {
                    "name": "My tokenAnalyst",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_microsoft365": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_microsoft365",
        "operationId": "configure_microsoft365",
        "x-experimental": true,
        "x-block-type": "microsoft365",
        "description": "Add or configure a Microsoft 365 block. Imports Microsoft 365 mail data from Microsoft Graph.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_microsoft365",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_microsoft365",
                  "value": {
                    "name": "My microsoft365",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_ifthensplit": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_ifthensplit",
        "operationId": "configure_ifthensplit",
        "x-experimental": true,
        "x-block-type": "ifthensplit",
        "description": "Add or configure a If-Then-Split block. Routes rows to True or the other output based on a boolean formula.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_ifthensplit",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_ifthensplit",
                  "value": {
                    "name": "My ifthensplit",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_outputrouter": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_outputrouter",
        "operationId": "configure_outputrouter",
        "x-experimental": true,
        "x-block-type": "outputrouter",
        "description": "Add or configure a Output Router block. Routes each row to one output based on a formula result.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_outputrouter",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_outputrouter",
                  "value": {
                    "name": "My outputrouter",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_inputrouter": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_inputrouter",
        "operationId": "configure_inputrouter",
        "x-experimental": true,
        "x-block-type": "inputrouter",
        "description": "Add or configure a Input Router block. Routes data from one of the inputs based on a formula.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_inputrouter",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_inputrouter",
                  "value": {
                    "name": "My inputrouter",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_append": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_append",
        "operationId": "configure_append",
        "x-experimental": true,
        "x-block-type": "append",
        "description": "Add or configure a Append block. Combines rows from two or more inputs into one dataset.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_append",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_append",
                  "value": {
                    "name": "My append",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_join": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_join",
        "operationId": "configure_join",
        "x-experimental": true,
        "x-block-type": "join",
        "description": "Add or configure a Join block. Joins two inputs by matching fields and choosing which rows and columns to keep.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_join",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_join",
                  "value": {
                    "name": "My join",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_field_organiser": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_field_organiser",
        "operationId": "configure_field_organiser",
        "x-experimental": true,
        "x-block-type": "fieldOrganiser",
        "description": "Add or configure a Field organiser block. Change selected fields — rename, retype, reformat, delete, duplicate, or add computed or constant fields — while every field you don't mention passes straight through.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_fieldOrganiser",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_field_organiser",
                  "value": {
                    "name": "My fieldOrganiser",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_record_filter": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_record_filter",
        "operationId": "configure_record_filter",
        "x-experimental": true,
        "x-block-type": "recordFilter",
        "description": "Add or configure a Record filter block. Keeps or removes rows when selected rules match.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_recordFilter",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_record_filter",
                  "value": {
                    "name": "My recordFilter",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_field_filter": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_field_filter",
        "operationId": "configure_field_filter",
        "x-experimental": true,
        "x-block-type": "fieldFilter",
        "description": "Add or configure a Field filter block. Keeps only fields that match the chosen rules, or removes them instead.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_fieldFilter",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_field_filter",
                  "value": {
                    "name": "My fieldFilter",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_validate_data": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_validate_data",
        "operationId": "configure_validate_data",
        "x-experimental": true,
        "x-block-type": "validateData",
        "description": "Add or configure a Validate data block. Checks incoming data against schema, value, and size expectations without changing it.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_validateData",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_validate_data",
                  "value": {
                    "name": "My validateData",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_define_schema": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_define_schema",
        "operationId": "configure_define_schema",
        "x-experimental": true,
        "x-block-type": "defineSchema",
        "description": "Add or configure a Define schema block. Defines a schema by mapping input fields and aliases to stable output fields and types.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_defineSchema",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_define_schema",
                  "value": {
                    "name": "My defineSchema",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_format_field_names": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_format_field_names",
        "operationId": "configure_format_field_names",
        "x-experimental": true,
        "x-block-type": "formatFieldNames",
        "description": "Add or configure a Format field names block. Renames selected fields into a chosen naming style.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_formatFieldNames",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_format_field_names",
                  "value": {
                    "name": "My formatFieldNames",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_search_replace": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_search_replace",
        "operationId": "configure_search_replace",
        "x-experimental": true,
        "x-block-type": "searchReplace",
        "description": "Add or configure a Search / replace block. Replaces matching text in one or more fields, in sequence.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_searchReplace",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_search_replace",
                  "value": {
                    "name": "My searchReplace",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_aggregate": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_aggregate",
        "operationId": "configure_aggregate",
        "x-experimental": true,
        "x-block-type": "aggregate",
        "description": "Add or configure a Aggregate block. Groups records and calculates aggregate measures for each group.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_aggregate",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_aggregate",
                  "value": {
                    "name": "My aggregate",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_de_duplicate": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_de_duplicate",
        "operationId": "configure_de_duplicate",
        "x-experimental": true,
        "x-block-type": "deDuplicate",
        "description": "Add or configure a De-duplicate block. Removes duplicate records by matching the chosen fields.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_deDuplicate",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_de_duplicate",
                  "value": {
                    "name": "My deDuplicate",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_sort": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_sort",
        "operationId": "configure_sort",
        "x-experimental": true,
        "x-block-type": "sort",
        "description": "Add or configure a Sort block. Sorts rows by one or more fields.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_sort",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_sort",
                  "value": {
                    "name": "My sort",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_custom_order": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_custom_order",
        "operationId": "configure_custom_order",
        "x-experimental": true,
        "x-block-type": "customOrder",
        "description": "Add or configure a Custom order block. Applies a custom sort order from a reference field.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_customOrder",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_custom_order",
                  "value": {
                    "name": "My customOrder",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_pivot": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_pivot",
        "operationId": "configure_pivot",
        "x-experimental": true,
        "x-block-type": "pivot",
        "description": "Add or configure a Pivot block. Turns header values into output columns and spreads one or more value fields across them.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_pivot",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_pivot",
                  "value": {
                    "name": "My pivot",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_depivot": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_depivot",
        "operationId": "configure_depivot",
        "x-experimental": true,
        "x-block-type": "depivot",
        "description": "Add or configure a De-pivot block. Turns selected columns into rows with one field for the source name and one for the values.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_depivot",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_depivot",
                  "value": {
                    "name": "My depivot",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_transpose": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_transpose",
        "operationId": "configure_transpose",
        "x-experimental": true,
        "x-block-type": "transpose",
        "description": "Add or configure a Transpose block. Swaps rows and columns in the table.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_transpose",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_transpose",
                  "value": {
                    "name": "My transpose",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_split_values": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_split_values",
        "operationId": "configure_split_values",
        "x-experimental": true,
        "x-block-type": "splitValues",
        "description": "Add or configure a Split values block. Splits a field into separate fields using a separator or fixed widths.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_splitValues",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_split_values",
                  "value": {
                    "name": "My splitValues",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_collapse_values": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_collapse_values",
        "operationId": "configure_collapse_values",
        "x-experimental": true,
        "x-block-type": "collapseValues",
        "description": "Add or configure a Collapse values block. Combines values from selected fields into one field.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_collapseValues",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_collapse_values",
                  "value": {
                    "name": "My collapseValues",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_tokenise": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_tokenise",
        "operationId": "configure_tokenise",
        "x-experimental": true,
        "x-block-type": "tokenise",
        "description": "Add or configure a Tokenise block. Combines matching records by joining values from one field with a separator.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_tokenise",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_tokenise",
                  "value": {
                    "name": "My tokenise",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_detokenise": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_detokenise",
        "operationId": "configure_detokenise",
        "x-experimental": true,
        "x-block-type": "detokenise",
        "description": "Add or configure a De-tokenise block. Splits tokenised text in a field into separate records.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_detokenise",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_detokenise",
                  "value": {
                    "name": "My detokenise",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_delete_empty_data": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_delete_empty_data",
        "operationId": "configure_delete_empty_data",
        "x-experimental": true,
        "x-block-type": "deleteEmptyData",
        "description": "Add or configure a Delete empty data block. Deletes empty fields or empty records from the data.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_deleteEmptyData",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_delete_empty_data",
                  "value": {
                    "name": "My deleteEmptyData",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_normalisecase": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_normalisecase",
        "operationId": "configure_normalisecase",
        "x-experimental": true,
        "x-block-type": "normalisecase",
        "description": "Add or configure a Normalise case block. Normalises selected text fields to a consistent case.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_normalisecase",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_normalisecase",
                  "value": {
                    "name": "My normalisecase",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_field_metadata": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_field_metadata",
        "operationId": "configure_field_metadata",
        "x-experimental": true,
        "x-block-type": "fieldMetadata",
        "description": "Add or configure a Field metadata block. Lists selected metadata for each input field.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_fieldMetadata",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_field_metadata",
                  "value": {
                    "name": "My fieldMetadata",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_foreach": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_foreach",
        "operationId": "configure_foreach",
        "x-experimental": true,
        "x-block-type": "foreach",
        "description": "Add or configure a For each block. Repeats a workflow once for each iteration parameter set.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_foreach",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_foreach",
                  "value": {
                    "name": "My foreach",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_savepoint": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_savepoint",
        "operationId": "configure_savepoint",
        "x-experimental": true,
        "x-block-type": "savepoint",
        "description": "Add or configure a Savepoint block. Controls whether passing data is kept after the workflow finishes.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_savepoint",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_savepoint",
                  "value": {
                    "name": "My savepoint",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_input_switch": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_input_switch",
        "operationId": "configure_input_switch",
        "x-experimental": true,
        "x-block-type": "inputSwitch",
        "description": "Add or configure a Input switch block. Chooses which upstream input dataset to use.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_inputSwitch",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_input_switch",
                  "value": {
                    "name": "My inputSwitch",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_bulk_field_organiser": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_bulk_field_organiser",
        "operationId": "configure_bulk_field_organiser",
        "x-experimental": true,
        "x-block-type": "bulkFieldOrganiser",
        "description": "Add or configure a Bulk field organiser block. Applies the same rename and field setting changes to multiple selected fields.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_bulkFieldOrganiser",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_bulk_field_organiser",
                  "value": {
                    "name": "My bulkFieldOrganiser",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_normalise": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_normalise",
        "operationId": "configure_normalise",
        "x-experimental": true,
        "x-block-type": "normalise",
        "description": "Add or configure a Normalise block. Scales selected numeric fields to zero mean and unit standard deviation.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_normalise",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_normalise",
                  "value": {
                    "name": "My normalise",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_random_sample": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_random_sample",
        "operationId": "configure_random_sample",
        "x-experimental": true,
        "x-block-type": "randomSample",
        "description": "Add or configure a Random Sample block. Samples the input rows by a fixed count or a percentage.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_randomSample",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_random_sample",
                  "value": {
                    "name": "My randomSample",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_parsetext": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_parsetext",
        "operationId": "configure_parsetext",
        "x-experimental": true,
        "x-block-type": "parsetext",
        "description": "Add or configure a Parse text block. Parses JSON or XML text from a field into output columns.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_parsetext",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_parsetext",
                  "value": {
                    "name": "My parsetext",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_scramble": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_scramble",
        "operationId": "configure_scramble",
        "x-experimental": true,
        "x-block-type": "scramble",
        "description": "Add or configure a Scramble data block. Scrambles text in selected fields to remove sensitive information before sharing.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_scramble",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_scramble",
                  "value": {
                    "name": "My scramble",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_split_data": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_split_data",
        "operationId": "configure_split_data",
        "x-experimental": true,
        "x-block-type": "splitData",
        "description": "Add or configure a Split Data block. Splits the input into two outputs using either a fixed proportion or an intelligent cut-off.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_splitData",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_split_data",
                  "value": {
                    "name": "My splitData",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_geocode": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_geocode",
        "operationId": "configure_geocode",
        "x-experimental": true,
        "x-block-type": "geocode",
        "description": "Add or configure a Geocode block. Adds geocoding results for each address using a chosen provider.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_geocode",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_geocode",
                  "value": {
                    "name": "My geocode",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_reversegeocode": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_reversegeocode",
        "operationId": "configure_reversegeocode",
        "x-experimental": true,
        "x-block-type": "reversegeocode",
        "description": "Add or configure a Reverse Geocode block. Appends address details by reverse geocoding latitude and longitude fields.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_reversegeocode",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_reversegeocode",
                  "value": {
                    "name": "My reversegeocode",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_fill_down": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_fill_down",
        "operationId": "configure_fill_down",
        "x-experimental": true,
        "x-block-type": "fillDown",
        "description": "Add or configure a Fill down block. Fills blanks in selected fields with the last non-null value above them.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_fillDown",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_fill_down",
                  "value": {
                    "name": "My fillDown",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_compare": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_compare",
        "operationId": "configure_compare",
        "x-experimental": true,
        "x-block-type": "compare",
        "description": "Add or configure a Compare block. Compares two inputs and reports differences in fields, rows, and values.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_compare",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_compare",
                  "value": {
                    "name": "My compare",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_row_id": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_row_id",
        "operationId": "configure_row_id",
        "x-experimental": true,
        "x-block-type": "rowId",
        "description": "Add or configure a Add row ID block. Adds a sequential ID field to each row, optionally restarting within partitions.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_rowId",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_row_id",
                  "value": {
                    "name": "My rowId",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_regression_analysis": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_regression_analysis",
        "operationId": "configure_regression_analysis",
        "x-experimental": true,
        "x-block-type": "regressionAnalysis",
        "description": "Add or configure a Regression block. Fits a regression model to predict one field from one or more predictors.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_regressionAnalysis",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_regression_analysis",
                  "value": {
                    "name": "My regressionAnalysis",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_prediction": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_prediction",
        "operationId": "configure_prediction",
        "x-experimental": true,
        "x-block-type": "prediction",
        "description": "Add or configure a Prediction block. Predicts a target field from selected input fields.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_prediction",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_prediction",
                  "value": {
                    "name": "My prediction",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_clustering": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_clustering",
        "operationId": "configure_clustering",
        "x-experimental": true,
        "x-block-type": "clustering",
        "description": "Add or configure a Clustering block. Finds clusters in numeric data, using all numeric fields or selected fields.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_clustering",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_clustering",
                  "value": {
                    "name": "My clustering",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_sentiment_analysis": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_sentiment_analysis",
        "operationId": "configure_sentiment_analysis",
        "x-experimental": true,
        "x-block-type": "sentimentAnalysis",
        "description": "Add or configure a Sentiment Analysis block. Scores text for sentiment and outputs positive, negative, or neutral polarity.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_sentimentAnalysis",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_sentiment_analysis",
                  "value": {
                    "name": "My sentimentAnalysis",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_time_series_forecast": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_time_series_forecast",
        "operationId": "configure_time_series_forecast",
        "x-experimental": true,
        "x-block-type": "timeSeriesForecast",
        "description": "Add or configure a Time Series Forecast block. Forecasts future values from a time series.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_timeSeriesForecast",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_time_series_forecast",
                  "value": {
                    "name": "My timeSeriesForecast",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_anomaly_detection": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_anomaly_detection",
        "operationId": "configure_anomaly_detection",
        "x-experimental": true,
        "x-block-type": "anomalyDetection",
        "description": "Add or configure a Anomaly Detection block. Scores records by how likely they are to be outliers in the dataset.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_anomalyDetection",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_anomaly_detection",
                  "value": {
                    "name": "My anomalyDetection",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_dimensionality_reduction": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_dimensionality_reduction",
        "operationId": "configure_dimensionality_reduction",
        "x-experimental": true,
        "x-block-type": "dimensionalityReduction",
        "description": "Add or configure a Reduce Dimensions block. Reduces numeric fields to a smaller set of dimensions.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_dimensionalityReduction",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_dimensionality_reduction",
                  "value": {
                    "name": "My dimensionalityReduction",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_basket_analysis": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_basket_analysis",
        "operationId": "configure_basket_analysis",
        "x-experimental": true,
        "x-block-type": "basketAnalysis",
        "description": "Add or configure a Basket Analysis block. Finds association rules between items in transactions, optionally at both item and group level.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_basketAnalysis",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_basket_analysis",
                  "value": {
                    "name": "My basketAnalysis",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_oversample": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_oversample",
        "operationId": "configure_oversample",
        "x-experimental": true,
        "x-block-type": "oversample",
        "description": "Add or configure a Oversample block. Oversamples rows to reach a target share for one selected value.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_oversample",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_oversample",
                  "value": {
                    "name": "My oversample",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_hierarchical_topic_modelling": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_hierarchical_topic_modelling",
        "operationId": "configure_hierarchical_topic_modelling",
        "x-experimental": true,
        "x-block-type": "hierarchicalTopicModelling",
        "description": "Add or configure a Topic Modelling block. Discovers topics and assigns documents to them from text fields.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_hierarchicalTopicModelling",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_hierarchical_topic_modelling",
                  "value": {
                    "name": "My hierarchicalTopicModelling",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_networkanalysis": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_networkanalysis",
        "operationId": "configure_networkanalysis",
        "x-experimental": true,
        "x-block-type": "networkanalysis",
        "description": "Add or configure a Network Analysis block. Finds important nodes and clusters in a network.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_networkanalysis",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_networkanalysis",
                  "value": {
                    "name": "My networkanalysis",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_text_analysis": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_text_analysis",
        "operationId": "configure_text_analysis",
        "x-experimental": true,
        "x-block-type": "textAnalysis",
        "description": "Add or configure a Text analysis block. Analyzes text fields for counts, top words, language, and readability.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_textAnalysis",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_text_analysis",
                  "value": {
                    "name": "My textAnalysis",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_entity_recognition": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_entity_recognition",
        "operationId": "configure_entity_recognition",
        "x-experimental": true,
        "x-block-type": "entityRecognition",
        "description": "Add or configure a Entity recognition block. Extracts people, organisations, and places from selected text fields.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_entityRecognition",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_entity_recognition",
                  "value": {
                    "name": "My entityRecognition",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_covariance_matrix": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_covariance_matrix",
        "operationId": "configure_covariance_matrix",
        "x-experimental": true,
        "x-block-type": "covarianceMatrix",
        "description": "Add or configure a Covariance Correlation block. Calculates covariance or correlation matrices from selected numeric fields.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_covarianceMatrix",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_covariance_matrix",
                  "value": {
                    "name": "My covarianceMatrix",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_frequency_table": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_frequency_table",
        "operationId": "configure_frequency_table",
        "x-experimental": true,
        "x-block-type": "frequencyTable",
        "description": "Add or configure a Frequency Table block. Counts how often each combination of selected field values occurs.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_frequencyTable",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_frequency_table",
                  "value": {
                    "name": "My frequencyTable",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_one_way_a_n_o_v_a": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_one_way_a_n_o_v_a",
        "operationId": "configure_one_way_a_n_o_v_a",
        "x-experimental": true,
        "x-block-type": "oneWayANOVA",
        "description": "Add or configure a One Way ANOVA block. Tests whether group means differ significantly for a numeric target field.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_oneWayANOVA",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_one_way_a_n_o_v_a",
                  "value": {
                    "name": "My oneWayANOVA",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_aicompletionblock": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_aicompletionblock",
        "operationId": "configure_aicompletionblock",
        "x-experimental": true,
        "x-block-type": "aicompletionblock",
        "description": "Add or configure a AI Request block. Sends each record to an AI model and stores the response.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_aicompletionblock",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_aicompletionblock",
                  "value": {
                    "name": "My aicompletionblock",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_aidecision": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_aidecision",
        "operationId": "configure_aidecision",
        "x-experimental": true,
        "x-block-type": "aidecision",
        "description": "Add or configure a AI Decision block. Evaluates selected fields with AI and adds a decision label, score, or yes/no result.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_aidecision",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_aidecision",
                  "value": {
                    "name": "My aidecision",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_ai_insights": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_ai_insights",
        "operationId": "configure_ai_insights",
        "x-experimental": true,
        "x-block-type": "aiInsights",
        "description": "Add or configure a AI Insights block. Generates AI answers from a prompt and connected data, with optional prompt, reasoning, and metadata outputs.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_aiInsights",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_ai_insights",
                  "value": {
                    "name": "My aiInsights",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_ai_block": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_ai_block",
        "operationId": "configure_ai_block",
        "x-experimental": true,
        "x-block-type": "aiBlock",
        "description": "Add or configure a AI Python script block. Human-facing variant of the Custom Python script block, with an in-app chat panel for drafting the script.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_aiBlock",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_ai_block",
                  "value": {
                    "name": "My aiBlock",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_custom": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_custom",
        "operationId": "configure_custom",
        "x-experimental": true,
        "x-block-type": "custom",
        "description": "Add or configure a Custom block. Runs your own Python or R script on the data - the route for logic no native block can express.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "preset": {
                    "description": "Which preset to create the block from. Send null for 'customPythonScript', this type's default. A preset is a set of starting options. Supplying `options` as well REPLACES them entirely, so the preset then has no effect - send one or the other. Send null when configuring an existing block: it already has options, and a preset only ever seeds a new block's.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "customPythonScript",
                          "customRScript"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_custom",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "preset",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_custom",
                  "value": {
                    "name": "My custom",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_file_publisher": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_file_publisher",
        "operationId": "configure_file_publisher",
        "x-experimental": true,
        "x-block-type": "filePublisher",
        "description": "Add or configure a File output block. Writes the data to a file in a chosen location and format.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "preset": {
                    "description": "Which preset to create the block from. Send null for 'fileOutput', this type's default. A preset is a set of starting options. Supplying `options` as well REPLACES them entirely, so the preset then has no effect - send one or the other. Send null when configuring an existing block: it already has options, and a preset only ever seeds a new block's.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "fileOutput",
                          "urlOutput"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_filePublisher",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "preset",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_file_publisher",
                  "value": {
                    "name": "My filePublisher",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_database_publisher": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_database_publisher",
        "operationId": "configure_database_publisher",
        "x-experimental": true,
        "x-block-type": "databasePublisher",
        "description": "Add or configure a Database output block. Publishes data to a database table, creating or replacing it as needed.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_databasePublisher",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_database_publisher",
                  "value": {
                    "name": "My databasePublisher",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_email_publisher": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_email_publisher",
        "operationId": "configure_email_publisher",
        "x-experimental": true,
        "x-block-type": "emailPublisher",
        "description": "Add or configure a Email output block. Sends the current data as an email with optional inline table and attachments.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_emailPublisher",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_email_publisher",
                  "value": {
                    "name": "My emailPublisher",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_salesforce_output": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_salesforce_output",
        "operationId": "configure_salesforce_output",
        "x-experimental": true,
        "x-block-type": "salesforceOutput",
        "description": "Add or configure a Salesforce output block. Publishes the current data to a Salesforce table.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_salesforceOutput",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_salesforce_output",
                  "value": {
                    "name": "My salesforceOutput",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_report_generator": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_report_generator",
        "operationId": "configure_report_generator",
        "x-experimental": true,
        "x-block-type": "reportGenerator",
        "description": "Add or configure a Report generator block. Creates a new report from a template report and input rows.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_reportGenerator",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_report_generator",
                  "value": {
                    "name": "My reportGenerator",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_batch_publisher": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_batch_publisher",
        "operationId": "configure_batch_publisher",
        "x-experimental": true,
        "x-block-type": "batchPublisher",
        "description": "Add or configure a Batch output block. Publishes the input data using batch output settings from a manual list or an upstream block.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_batchPublisher",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_batch_publisher",
                  "value": {
                    "name": "My batchPublisher",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_batch_http": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_batch_http",
        "operationId": "configure_batch_http",
        "x-experimental": true,
        "x-block-type": "batchHttp",
        "description": "Add or configure a Batch API block. Sends a request for each row and adds the HTTP response to the output.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_batchHttp",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_batch_http",
                  "value": {
                    "name": "My batchHttp",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_viewable_storage": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_viewable_storage",
        "operationId": "configure_viewable_storage",
        "x-experimental": true,
        "x-block-type": "viewableStorage",
        "description": "Add or configure a Storage block. Stores rows in a shared global table and lets workflows read them back.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_viewableStorage",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_viewable_storage",
                  "value": {
                    "name": "My viewableStorage",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_report": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_report",
        "operationId": "configure_report",
        "x-experimental": true,
        "x-block-type": "report",
        "description": "Add or configure a Report block. Opens an interactive report for exploring and visualising incoming data.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "preset": {
                    "description": "Which preset to create the block from. Send null for 'report', this type's default. A preset is a set of starting options. Supplying `options` as well REPLACES them entirely, so the preset then has no effect - send one or the other. Send null when configuring an existing block: it already has options, and a preset only ever seeds a new block's.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "report",
                          "instantDashboard",
                          "insightExplorer",
                          "dataDiscoveryTemplate",
                          "freeFormDashboardTemplate",
                          "multiPageDocumentTemplate",
                          "blankReport",
                          "topicModellingReport"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "options": {
                    "description": "Options for this block. The shape depends on which preset it was created from - name it in `@type`. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "description": "Which kind of report these options are for.",
                            "const": "report"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "description": "Which kind of report these options are for.",
                            "const": "instantDashboard"
                          },
                          "initialMessage": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The instruction the AI acts on when this Instant Dashboard first opens, e.g. \"Build a sales overview grouped by region with a trend chart\". Set this to make the preset build a SPECIFIC report rather than the automatic default one. Omit to leave the default.\n\nRequired."
                          },
                          "customPrompt": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Extra text appended to the assistant's system prompt for this report - tone, domain context, answer-format conventions. Applies to every exchange, not just the first message.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "description": "Which kind of report these options are for.",
                            "const": "insightExplorer"
                          },
                          "layoutMode": {
                            "description": "Choose the report layout. CHAT_AND_ANSWER shows the chat panel beside the result - prefer this so the user can follow up and keep exploring (the usual case). ANSWER_ONLY hides the chat panel - use only when a fixed, single-answer tile is wanted.\n\nRequired.\n\nValid values: `CHAT_AND_ANSWER`, `ANSWER_ONLY`.",
                            "anyOf": [
                              {
                                "type": "string",
                                "enum": [
                                  "CHAT_AND_ANSWER",
                                  "ANSWER_ONLY"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "customPrompt": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Append extra instructions to the assistant system prompt for this report, such as tone, domain context, answer format, or suggested questions.\n\nRequired."
                          },
                          "initialMessageBehaviour": {
                            "description": "Choose what happens when a new chat opens: show a hidden system prompt, show an assistant greeting, or auto-ask a user question.\n\nRequired.\n\nValid values: `systemMessage`, `assistantMessage`, `userMessage`.",
                            "anyOf": [
                              {
                                "type": "string",
                                "enum": [
                                  "systemMessage",
                                  "assistantMessage",
                                  "userMessage"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "initialSystemMessage": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the hidden system message used when the initial message behaviour is `systemMessage`.\n\nRequired."
                          },
                          "initialAssistantMessage": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the assistant greeting used when the initial message behaviour is `assistantMessage`.\n\nRequired."
                          },
                          "initialUserMessage": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the user question that is automatically sent when the initial message behaviour is `userMessage`.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "description": "Which kind of report these options are for.",
                            "const": "dataDiscoveryTemplate"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "description": "Which kind of report these options are for.",
                            "const": "freeFormDashboardTemplate"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "description": "Which kind of report these options are for.",
                            "const": "multiPageDocumentTemplate"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "description": "Which kind of report these options are for.",
                            "const": "blankReport"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "description": "Which kind of report these options are for.",
                            "const": "topicModellingReport"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "preset",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_report",
                  "value": {
                    "name": "My report",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_macro": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_macro",
        "operationId": "configure_macro",
        "x-experimental": true,
        "x-block-type": "macro",
        "description": "Add or configure a Macro block. References another workflow as a reusable macro.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_macro",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_macro",
                  "value": {
                    "name": "My macro",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_macro_input": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_macro_input",
        "operationId": "configure_macro_input",
        "x-experimental": true,
        "x-block-type": "macroInput",
        "description": "Add or configure a Macro input block. Defines an input that appears when this workflow is used as a macro.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_macroInput",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_macro_input",
                  "value": {
                    "name": "My macroInput",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_macro_output": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_macro_output",
        "operationId": "configure_macro_output",
        "x-experimental": true,
        "x-block-type": "macroOutput",
        "description": "Add or configure a Macro output block. Defines a named output exposed when this workflow is used as a macro.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_macroOutput",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_macro_output",
                  "value": {
                    "name": "My macroOutput",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    },
    "/tools/configure_project_paths": {
      "post": {
        "tags": [
          "Add & configure blocks, by type"
        ],
        "summary": "configure_project_paths",
        "operationId": "configure_project_paths",
        "x-experimental": true,
        "x-block-type": "projectPaths",
        "description": "Add or configure a Project paths scanner block. Scans selected projects for file-consuming or file-producing blocks, and can remap matching paths.\n\n> **Experimental.** The per-block-type routes are newer than the rest of this API and may change before general release - a type id, an option name, or this route's shape. The generic tools (`connect`, `execute_blocks`, `export_workflow`, ...) are settled.\n\n**Body:** the arguments below, as JSON.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Create or update one block of this tool's block type. Leave `block` unset to create a new block; set it to configure an existing one.",
                "properties": {
                  "block": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The existing block to configure, by name. LEAVE UNSET TO CREATE A NEW BLOCK - that is the only difference between creating and updating. Naming a block that does not exist is an error, not a create: a typo must not silently produce a second block you then work against."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "What the block should be called. When creating, omit to auto-name it. When updating, omit to LEAVE THE EXISTING NAME ALONE - setting it renames the block. Note this differs from the usual meaning of omitting a value: here it means unchanged, not reset to default. Name blocks for what they mean, in Title Case, and keep them short - the name becomes the source name in the report's data model. A name you supply is used EXACTLY: if another block already has it the call FAILS and changes nothing, rather than creating or renaming to a variant - so re-sending a create that may already have run is safe, and is an error rather than a duplicate block. Omit `name` and the block is auto-named from its type or preset, which MAY be numbered to make it unique - read that one back off the result. A rename is applied BEFORE this call's `options`."
                  },
                  "x": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. Supply BOTH `x` and `y`, or neither. When creating, omit to have the block placed automatically. When updating, omit to LEAVE IT WHERE IT IS - setting both moves it, exactly as `move_block` would. Either way the position is snapped to the grid and shifted to the nearest free spot if it would overlap, and the position it actually landed on comes back in the result."
                  },
                  "y": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Canvas position. See `x`."
                  },
                  "options": {
                    "$ref": "#/components/schemas/BlockOptions_projectPaths",
                    "description": "This block type's options. Omit to accept the defaults (or, when updating, to leave them unchanged); only the options you supply are changed."
                  },
                  "inputs": {
                    "$ref": "#/components/schemas/BlockInputs",
                    "description": "CREATE ONLY: wire the NEW block's inputs in the same call - ONE ENTRY PER TARGET CONNECTOR, each carrying its `sources`. The source blocks must already exist. Equivalent to a `connect` per input, in one round-trip. For a single-input target, one entry with one source; for a variadic target, one entry naming the variadic connector with an array of sources, appended in order. Sending this while UPDATING an existing block (i.e. with `block` set) is an error and changes nothing - rewire an existing block with `connect` or `set_connector_inputs` instead."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "block",
                  "name",
                  "x",
                  "y",
                  "options",
                  "inputs"
                ]
              },
              "examples": {
                "example": {
                  "summary": "Call configure_project_paths",
                  "value": {
                    "name": "My projectPaths",
                    "options": {}
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - the tool's result, as the response body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result_BlockMutation"
                }
              }
            }
          },
          "400": {
            "description": "The call failed - a tool-logic error (e.g. no such block), or a malformed request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid bearer token."
          },
          "403": {
            "description": "Authenticated, but not permitted: the folder permission denies this key, the licence does not carry the Workflow Ninja automation add-on, or the server has no usable AI integration configured. The body says which."
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "omniscopeApiKey": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "omsk_<43 url-safe base64 characters>",
        "description": "An Omniscope API key, issued by an administrator against a permission group on the project folder and shown once at generation. The key authenticates the caller into that group; the group's folder permissions then decide what the call may do."
      }
    },
    "schemas": {
      "BlockInputs": {
        "title": "BlockInputs",
        "type": [
          "array",
          "null"
        ],
        "items": {
          "type": "object",
          "properties": {
            "targetInput": {
              "type": [
                "string",
                "null"
              ],
              "description": "Target connector on the new block, verbatim from `describe_block_type(type).inputs[].name`. Omit for a single-input block; for a variadic target, pass the connector's base name (e.g. `input`) once and list every source in `sources` - do NOT use realized slot names like `input2`."
            },
            "sources": {
              "type": "array",
              "description": "The source(s) feeding this connector. One source for a single-input connector; several (appended in order) for a variadic connector.",
              "items": {
                "type": "object",
                "properties": {
                  "sourceBlock": {
                    "type": "string",
                    "description": "Name of an existing block whose output feeds this input."
                  },
                  "sourceOutput": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Source connector name, verbatim from `describe_block.outputs[].name`. Omit for single-output source blocks."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "sourceBlock",
                  "sourceOutput"
                ]
              }
            }
          },
          "additionalProperties": false,
          "required": [
            "targetInput",
            "sources"
          ]
        }
      },
      "BlockOptions": {
        "title": "BlockOptions",
        "description": "Per-block-type options. The applicable schema is determined by the block `type` - one `BlockOptions_*` schema per block type (discover a specific one live via describe_block / list_block_option_choices). Options are optional; omit for defaults.",
        "oneOf": [
          {
            "$ref": "#/components/schemas/BlockOptions_aggregate"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_aiBlock"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_aiInsights"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_aicompletionblock"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_aidecision"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_anomalyDetection"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_append"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_appendFiles"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_basketAnalysis"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_batchAppendFolder"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_batchHttp"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_batchPublisher"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_bulkFieldOrganiser"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_clustering"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_collapseValues"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_compare"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_covarianceMatrix"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_currency"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_custom"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_custom_customPythonScript"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_custom_customRScript"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_customOrder"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_dataTable"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_database"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_databasePublisher"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_deDuplicate"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_defineSchema"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_deleteEmptyData"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_demoData"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_depivot"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_detokenise"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_dimensionalityReduction"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_distributionInput"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_doubleClick"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_elasticsearch"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_email"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_emailPublisher"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_entityRecognition"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fieldFilter"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fieldMetadata"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fieldOrganiser"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fileMeta"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_filePublisher"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_filePublisher_fileOutput"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_filePublisher_urlOutput"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fileSource"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fileSource_amazonS3"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fileSource_api"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fileSource_azureGen2Storage"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fileSource_dropboxExperimental"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fileSource_embeddedDataFile"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fileSource_file"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fileSource_googleCloudStorage"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fileSource_googleDrive"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fileSource_hadoopHdfs"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fileSource_remoteFileViaSsh"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_fillDown"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_foreach"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_formatFieldNames"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_frequencyTable"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_gAnalytics"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_geocode"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_googleAnalytics"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_googleSheets"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_hierarchicalTopicModelling"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_ifthensplit"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_inputSwitch"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_inputrouter"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_join"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_lookupData"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_macro"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_macroInput"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_macroOutput"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_microsoft365"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_networkanalysis"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_normalise"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_normalisecase"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_oneWayANOVA"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_outputrouter"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_oversample"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_parsetext"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_pivot"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_prediction"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_projectMeta"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_projectPaths"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_randomSample"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_recordFilter"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_reddit"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_regressionAnalysis"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_report"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_report_blankReport"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_report_dataDiscoveryTemplate"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_report_freeFormDashboardTemplate"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_report_insightExplorer"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_report_instantDashboard"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_report_multiPageDocumentTemplate"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_report_report"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_report_topicModellingReport"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_reportGenerator"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_reversegeocode"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_rowId"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_salesforce"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_salesforceOutput"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_savepoint"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_scramble"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_searchReplace"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_sentimentAnalysis"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_sort"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_splitData"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_splitValues"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_textAnalysis"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_textInput"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_textInput_batchOutputConfigExample"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_textInput_multiTenantConfigExample"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_textInput_reportGeneratorConfig"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_textInput_textInput"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_timeSeriesForecast"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_tokenAnalyst"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_tokenise"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_transpose"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_twitter"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_validateData"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_valueSequence"
          },
          {
            "$ref": "#/components/schemas/BlockOptions_viewableStorage"
          }
        ]
      },
      "BlockOptions_aggregate": {
        "type": "object",
        "properties": {
          "groupingFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the fields you want to group by, the dimensions, or leave empty to aggregate on every record.\n\nDefine the fields to group by before calculating the aggregation.",
            "items": {
              "type": "object",
              "properties": {
                "fields": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "description": "Select the field or fields to split. The chosen values determine which column or values are used as the split source.\n\nRequired.",
                  "items": {
                    "type": "string",
                    "description": "Field name from upstream input. Provide one or more field names."
                  }
                },
                "caseSensitive": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Split using case-sensitive matching. Leave unset to use the default, which is case-insensitive splitting.\n\nRequired."
                }
              },
              "additionalProperties": false
            }
          },
          "measures": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the functions to calculate on fields, also known as measures.\n\nDefine the measures to calculate for each group.",
            "items": {
              "type": "object",
              "properties": {
                "fields": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "description": "Select the field or fields to evaluate. Choose the columns or values that this option should inspect.\n\nRequired.",
                  "items": {
                    "type": "string",
                    "description": "Field name from upstream input. Provide one or more field names."
                  }
                },
                "function": {
                  "description": "Choose how to reduce the selected values to a single result, such as the minimum, maximum, first, last, or singleton value.\n\nRequired.\n\nValid values: `minimum`, `maximum`, `singletonValue`, `singletonValueCaseSensitive`, `firstValue`, `lastValue`, `firstNonEmptyValue`, `lastNonEmptyValue`, `sum`, `mean`, `median`, `mode`, `standardDeviation`, `emptyCount`, `nonEmptyCount`, `recordCount`, `uniqueValueCount`, `uniqueValues`.",
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "minimum",
                        "maximum",
                        "singletonValue",
                        "singletonValueCaseSensitive",
                        "firstValue",
                        "lastValue",
                        "firstNonEmptyValue",
                        "lastNonEmptyValue",
                        "sum",
                        "mean",
                        "median",
                        "mode",
                        "standardDeviation",
                        "emptyCount",
                        "nonEmptyCount",
                        "recordCount",
                        "uniqueValueCount",
                        "uniqueValues"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "additionalProperties": false
            }
          },
          "maintainInputFieldOrder": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Keep the input field order in the output instead of ordering fields by grouping and measure definitions.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_aggregate",
        "description": "Options for a `aggregate` block."
      },
      "BlockOptions_aiBlock": {
        "type": "object",
        "properties": {
          "resourceIntensiveScript": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Run this block exclusively while the script is executing. Use this for scripts that may block other operations.\n\nRequired."
          },
          "type": {
            "description": "Select the scripting language for this block. Choose the Python or R options to configure the corresponding script settings.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "python"
                  },
                  "pythonVersion": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Python interpreter version used to run the script.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `HOST_UNRESTRICTED`."
                  },
                  "dockerOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure container settings for running the Python block in Docker. Leave unset to use the default execution environment.",
                    "properties": {
                      "customSystemPackages": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "List Debian or Ubuntu package names to install in the Docker container with apt. Set this only when the custom execution image is based on Debian or Ubuntu and needs extra system packages.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "useCustomBaseImage": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Enable this to run the block in your own Docker image instead of a bundled Visokio image.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      },
                      "baseImage": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the Docker image name to use as the custom base image, from a local registry or a private or public registry.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "installOmniscopeApiLibraries": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Install the Omniscope API libraries into the custom image before running the block. Enable this when your custom image does not already include them.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "pythonScript": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Provide the Python code to execute for this block.\n\nRequired."
                  },
                  "dependencies": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "List the Python packages this script needs, separated by spaces or new lines. Use standard version specifiers such as pandas>=0.25.1 or pandas==0.24.2."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "r"
                  },
                  "rVersion": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the R version or executable to run this script with. Use the default environment when this is left unset.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `HOST_UNRESTRICTED`."
                  },
                  "dockerOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure Docker-based execution settings for this R block. Leave unset to use the default execution environment.",
                    "properties": {
                      "customSystemPackages": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "List Debian or Ubuntu package names to install in the Docker container with apt. Set this only when the custom execution image is based on Debian or Ubuntu and needs extra system packages.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "useCustomBaseImage": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Enable this to run the block in your own Docker image instead of a bundled Visokio image.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      },
                      "baseImage": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the Docker image name to use as the custom base image, from a local registry or a private or public registry.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "installOmniscopeApiLibraries": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Install the Omniscope API libraries into the custom image before running the block. Enable this when your custom image does not already include them.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "scriptBody": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the R script to run.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "showPartitioning": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable partitioning settings so users can split execution across partitions. Use this only when the outputs do not depend on the input data.\n\nRequired."
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the block is partitioned when partitioning is enabled.\n\nRelevant when `showPartitioning` equals `true`.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          },
          "customOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "The block's own options: `customOptions` declares them (name, type, title), `values` sets them - an object keyed by option name. A name in `values` must match one declared in `customOptions`.\n\nSet additional custom block options not covered by the main fields.\n\nRequired.",
            "properties": {
              "customOptions": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Define the list of custom option items to include in this block.",
                "items": {
                  "type": "object",
                  "properties": {
                    "optionType": {
                      "description": "Select the kind of custom option to configure. Choose the variant that matches the input the block should accept.\n\nRequired.",
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "text"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required so users must provide a value.\n\nRequired."
                            },
                            "multiline": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Allow the text value to span multiple lines instead of a single line.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title in the Options tab."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the options UI."
                            },
                            "optionWidth": {
                              "description": "Choose the rendered width of the option field in the UI.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "password"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required in the Options tab.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the display width of the option in the form.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "choice"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required before the user can continue.\n\nRequired."
                            },
                            "dropdown": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Enable a dropdown-style choice control for this option.\n\nRequired."
                            },
                            "layout": {
                              "description": "Choose how the available choices are laid out in the UI.\n\nRequired.\n\nValid values: `auto`, `list`, `compact`, `multiColumn`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "auto",
                                    "list",
                                    "compact",
                                    "multiColumn"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Show this text as a tooltip next to the option title."
                            },
                            "choices": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Define the list of selectable choices for this option.\n\nRequired.",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "value": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the option value shown to users and used internally for this choice.\n\nRequired."
                                  },
                                  "title": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the display title for this choice.\n\nRequired."
                                  },
                                  "description": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the descriptive text for this choice."
                                  },
                                  "tooltip": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the tooltip text shown for this choice."
                                  },
                                  "special": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Mark this choice as special so it can be treated differently by the picker or UI.\n\nRequired."
                                  },
                                  "groupTitle": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the group heading used to cluster this choice with related options."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the UI."
                            },
                            "optionWidth": {
                              "description": "Choose how wide the option should appear in the form.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "integer"
                            },
                            "minimumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the minimum allowed value for this integer option."
                            },
                            "maximumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the maximum allowed value for this integer option."
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Require the option to be filled in.\n\nRequired."
                            },
                            "showAsSlider": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Show this integer option as a slider in the UI. Set it when you want users to pick a value by dragging within the configured range.\n\nRelevant when `minimumValue` is non-empty; when `maximumValue` is non-empty.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group heading used to organize related options."
                            },
                            "optionWidth": {
                              "description": "Choose the option width used when rendering this field. Select one of Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "decimal"
                            },
                            "minimumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the minimum allowed decimal value for this option. Leave unset to allow any lower bound."
                            },
                            "maximumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the maximum allowed decimal value for this option. Leave unset to allow any upper bound."
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Require a value for this option. Turn it on when the option must always be filled in.\n\nRequired."
                            },
                            "showAsSlider": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Display the option as a slider instead of a plain numeric input. Set this only when both minimum and maximum values are defined.\n\nRelevant when `minimumValue` is non-empty; when `maximumValue` is non-empty.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Show this text as the option tooltip next to the title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group."
                            },
                            "optionWidth": {
                              "description": "Choose how wide the option appears in the UI.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "boolean"
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the displayed width for the option. Select from Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "field"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required.\n\nRequired."
                            },
                            "inputIndex": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Select which connected input block this option reads fields from, starting at 1 for the first input.\n\nRequired.",
                              "maximum": 2147483647,
                              "minimum": 0
                            },
                            "fieldTypes": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Choose which field types this option accepts: Integer, Decimal, Text, or Date.\n\nValid values: `integer`, `decimal`, `text`, `date`.",
                              "items": {
                                "type": "string",
                                "enum": [
                                  "integer",
                                  "decimal",
                                  "text",
                                  "date"
                                ]
                              }
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the width used to display the option in the editor.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "fields"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required in the block's options panel.\n\nRequired."
                            },
                            "inputIndex": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Choose which connected input block supplies the selectable fields. Use 1 for the first input, 2 for the second, and so on.\n\nRequired.",
                              "maximum": 2147483647,
                              "minimum": 0
                            },
                            "fieldTypes": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Select which field types are allowed to be chosen for this option: Integer, Decimal, Text, or Date.\n\nValid values: `integer`, `decimal`, `text`, `date`.",
                              "items": {
                                "type": "string",
                                "enum": [
                                  "integer",
                                  "decimal",
                                  "text",
                                  "date"
                                ]
                              }
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the UI."
                            },
                            "width": {
                              "description": "Set the display width for this option: Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "file"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required so users must provide a value.\n\nRequired."
                            },
                            "readOnly": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Make this option read only in the Docker execution environment so users cannot edit it.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title of the group this option appears under."
                            },
                            "optionWidth": {
                              "description": "Choose the display width of the option in the editor: Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "additionalProperties": false
                }
              },
              "values": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Values by option name, e.g. {\"threshold\": 0.5, \"label\": \"hello\"}. Each name must be declared in `customOptions`.",
                "additionalProperties": true
              }
            },
            "additionalProperties": false
          },
          "blockOutputs": {
            "type": [
              "array",
              "null"
            ],
            "description": "Define the block outputs exposed by this script.",
            "items": {
              "type": "object",
              "properties": {
                "outputId": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the unique connector id for this output; it must be unique within the block. A script writes to this output by id with omniscope_api.write_output(output_data, \"my_output\") in Python or write.output(omni.api, output.data, \"my_output\") in R.\n\nRequired."
                },
                "displayName": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the full output name shown in the data tab."
                },
                "label": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the label shown on the block connector.\n\nRequired."
                },
                "description": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the connector description shown in the tooltip and preview table. Leave unset if no explanation is needed."
                }
              },
              "additionalProperties": false
            }
          },
          "iconUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the block icon URL, preferably as Base64 data."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set a short description of the block's functionality."
          },
          "category": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the main category used to group the block in the palette."
          },
          "subCategory": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set a secondary category to narrow how the block is grouped in the palette."
          },
          "tags": {
            "type": [
              "array",
              "null"
            ],
            "description": "Set search tags that help users find the block in the palette.",
            "items": {
              "type": "string"
            }
          },
          "introductoryText": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the introductory text shown for this block."
          },
          "apiMode": {
            "description": "Choose whether the block runs in Batch or Streaming mode.\n\nRequired.\n\nValid values: `batch`, `streamTransform`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "batch",
                  "streamTransform"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "preserveFieldSettingsByName": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Propagate field settings from the first connected input to all outputs for fields with the same name.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_aiBlock",
        "description": "Options for a `aiBlock` block."
      },
      "BlockOptions_aiInsights": {
        "type": "object",
        "properties": {
          "promptText": {
            "type": [
              "string",
              "null"
            ],
            "description": "The AI Insights block uses the text you enter and any selected fields, together with the connected data inputs, to generate insights and answers.\n\nProvide static prompt text to send to the AI. If you also set a prompt field, its value is appended after blank lines."
          },
          "promptField": {
            "type": [
              "string",
              "null"
            ],
            "description": "The AI Insights block uses the text you enter and any selected fields, together with the connected data inputs, to generate insights and answers.\n\nSelect the Requests input field that supplies a data-driven prompt. Set this when prompt text should come from each request row.\n\nField name from input 0."
          },
          "requireQuerying": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "The AI Insights block uses the text you enter and any selected fields, together with the connected data inputs, to generate insights and answers.\n\nRequire the AI to run at least one query for every prompt.\n\nRequired."
          },
          "completionResultOutputFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name the output field that will store the completion result.\n\nRequired."
          },
          "includePrompt": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include the exact prompt used in the output.\n\nRequired."
          },
          "promptOutputFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name the output field that will store the actual prompt used.\n\nRelevant when `includePrompt` equals `true`."
          },
          "includeReasoning": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include reasoning or reasoning summaries in a separate output field when extended reasoning is performed.\n\nRequired."
          },
          "reasoningFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name the output field that will store the reasoning.\n\nRelevant when `includeReasoning` equals `true`."
          },
          "includeMetadata": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include a JSON metadata object for the AI call when metadata is available.\n\nRequired."
          },
          "metadataFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name the output field that will store the metadata object.\n\nRelevant when `includeMetadata` equals `true`."
          },
          "modelOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure advanced model options for this AI call.\n\nRequired.",
            "properties": {
              "serviceTier": {
                "description": "Choose the priority tier for the model request. Use a higher tier for better performance or SLA when the provider supports it, and leave it unset or use a lower tier to reduce cost.\n\nValid values: `low`, `normal`, `priority`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "low",
                      "normal",
                      "priority"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "temperature": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the sampling temperature between 0.0 and 2.0. Higher values make outputs more random and creative; lower values make them more focused and deterministic.",
                "maximum": 2,
                "minimum": 0
              },
              "store": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Choose whether to store the generated response in the provider account for later analysis. Use this only in Workflow Executions integrations when you want provider-side retention."
              },
              "thinking": {
                "description": "Control whether reasoning/thinking is enabled and how much budget it gets, when the provider supports it. Leave unset if the model does not support configurable thinking.\n\nValid values: `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "none",
                      "minimal",
                      "low",
                      "medium",
                      "high",
                      "xhigh",
                      "max"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "verbosity": {
                "description": "Set how expansive the model's replies should be when the provider and model support verbosity controls. Use lower values for shorter answers and higher values for more detailed answers.\n\nValid values: `low`, `medium`, `high`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "low",
                      "medium",
                      "high"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "seed": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set a seed to make responses more repeatable for the same prompt and settings. Leave unset to allow more varied results across runs.",
                "maximum": 2147483647,
                "minimum": -2147483648
              },
              "maxOutputTokens": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of tokens the model may generate, including visible output and internal reasoning tokens.",
                "maximum": 2147483647,
                "minimum": 1
              }
            },
            "additionalProperties": false
          },
          "aiModel": {
            "type": [
              "string",
              "null"
            ],
            "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AI model to use, or leave unset to use the default model from AI settings."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_aiInsights",
        "description": "Options for a `aiInsights` block."
      },
      "BlockOptions_aicompletionblock": {
        "type": "object",
        "properties": {
          "userPrompt": {
            "type": [
              "string",
              "null"
            ],
            "description": "The AI Request block uses the text you enter and any selected fields to generate a response.\n\nProvide the main instruction sent to the AI. Leave unset to build the user prompt only from selected fields."
          },
          "userPromptFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "The AI Request block uses the text you enter and any selected fields to generate a response.\n\nSelect fields whose values form the user prompt. If you select one field, its value is used directly; if you select multiple fields, their values are joined with blank lines and prefixed by field name.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "systemPrompt": {
            "type": [
              "string",
              "null"
            ],
            "description": "Provide the system prompt applied to each record. Leave unset to use only the selected system prompt field."
          },
          "contextFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select context fields to include in the system prompt. Configure this when context data is supplied.\n\nField name from input 1.",
            "items": {
              "type": "string"
            }
          },
          "contextCellLimit": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the maximum number of context cell values to include before the request is rejected for size.\n\nRelevant when `contextFields` is non-empty.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "additionalSystemPrompt": {
            "type": [
              "string",
              "null"
            ],
            "description": "Append additional system prompt text after the context data.\n\nRelevant when `contextFields` is non-empty."
          },
          "systemPromptField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select a field whose value is included in the system prompt. If you also provide system prompt text, the values are joined with blank lines.\n\nField name from input 0."
          },
          "systemPromptOutputFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name the output field that will contain the system prompt when prompts are included in the output.\n\nRelevant when `includePromptsInOutput` equals `true`."
          },
          "userPromptOutputFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name the output field that will contain the user prompt when prompts are included in the output.\n\nRelevant when `includePromptsInOutput` equals `true`."
          },
          "completionResultFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name the output field that will contain the completion result.\n\nRequired."
          },
          "includePromptsInOutput": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include the exact user and system prompts in the output for testing and inspection.\n\nRequired."
          },
          "includeReasoningInOutput": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include reasoning or reasoning summaries in the output when extended reasoning is used.\n\nRequired."
          },
          "reasoningOutputFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name the output field that will contain reasoning when it is included in the output.\n\nRelevant when `includeReasoningInOutput` equals `true`."
          },
          "includeMetadataInOutput": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include available AI call metadata in the output as JSON.\n\nRequired."
          },
          "metadataOutputFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name the output field that will contain AI call metadata when metadata is included in the output.\n\nRelevant when `includeMetadataInOutput` equals `true`."
          },
          "modelOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set advanced model options for the AI request.\n\nRequired.",
            "properties": {
              "serviceTier": {
                "description": "Choose the priority tier for the model request. Use a higher tier for better performance or SLA when the provider supports it, and leave it unset or use a lower tier to reduce cost.\n\nValid values: `low`, `normal`, `priority`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "low",
                      "normal",
                      "priority"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "temperature": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the sampling temperature between 0.0 and 2.0. Higher values make outputs more random and creative; lower values make them more focused and deterministic.",
                "maximum": 2,
                "minimum": 0
              },
              "store": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Choose whether to store the generated response in the provider account for later analysis. Use this only in Workflow Executions integrations when you want provider-side retention."
              },
              "thinking": {
                "description": "Control whether reasoning/thinking is enabled and how much budget it gets, when the provider supports it. Leave unset if the model does not support configurable thinking.\n\nValid values: `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "none",
                      "minimal",
                      "low",
                      "medium",
                      "high",
                      "xhigh",
                      "max"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "verbosity": {
                "description": "Set how expansive the model's replies should be when the provider and model support verbosity controls. Use lower values for shorter answers and higher values for more detailed answers.\n\nValid values: `low`, `medium`, `high`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "low",
                      "medium",
                      "high"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "seed": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set a seed to make responses more repeatable for the same prompt and settings. Leave unset to allow more varied results across runs.",
                "maximum": 2147483647,
                "minimum": -2147483648
              },
              "maxOutputTokens": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of tokens the model may generate, including visible output and internal reasoning tokens.",
                "maximum": 2147483647,
                "minimum": 1
              }
            },
            "additionalProperties": false
          },
          "aiModel": {
            "type": [
              "string",
              "null"
            ],
            "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AI model to use. Leave unset to use the default model from AI settings."
          },
          "outputConstraints": {
            "description": "Restrict the model output format. Use this when downstream steps need structured output that can be extracted reliably.\n\nRequired.\n\nValid values: `none`, `jsonMode`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "none",
                  "jsonMode"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_aicompletionblock",
        "description": "Options for a `aicompletionblock` block."
      },
      "BlockOptions_aidecision": {
        "type": "object",
        "properties": {
          "provider": {
            "description": "Choose the service that evaluates the selected data. Defaults to Jev.\n\nRequired.\n\nValid values: `jev`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "jev"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "inputFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select one or more input fields to evaluate together for each row. Their names and values are considered jointly, and text, numbers, and other field types can provide evidence for the answer.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "sharedContext": {
            "type": [
              "string",
              "null"
            ],
            "description": "Provide optional background, terminology, or rules that should apply to every row. Defaults to an empty string and is sent with every API request."
          },
          "includeMetadata": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Append JSON metadata to the output with request IDs, token usage, estimated USD cost, and duration. Defaults to false.\n\nRequired."
          },
          "metadataFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the name of the JSON field that will hold the metadata. Defaults to Metadata.\n\nRelevant when `includeMetadata` equals `true`.\n\nRequired."
          },
          "jevSettings": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure Jev-specific settings used when the provider is Jev.\n\nRelevant when `provider` equals `jev`.\n\nRequired.",
            "properties": {
              "apiKey": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the API key used to authenticate requests from this block.\n\nRequired.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              },
              "maxInputRecords": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of input records allowed. Defaults to 1000; stop with an error if the input exceeds this count, including duplicates and blank records.\n\nRequired.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "advancedOptions": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Configure advanced decision settings for this block.\n\nRequired.",
                "properties": {
                  "batchRecords": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Send several records in each request instead of one record per request. Defaults to false.\n\nRequired."
                  },
                  "includeConfidence": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Append Jev's confidence statistic as an output column for Choice and Score results. Defaults to false.\n\nRequired."
                  },
                  "inputTokenPricePerMillion": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the input token price in USD per million for cost estimation only. Defaults to 0.042.\n\nRequired.",
                    "minimum": 0
                  },
                  "enableApiPreview": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Allow preview runs to send sample requests to the provider. Defaults to false.\n\nRequired."
                  },
                  "maxPreviewRecords": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the maximum number of input records included in each preview request. Defaults to 10.\n\nRelevant when `enableApiPreview` equals `true`.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 1
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "questions": {
            "type": [
              "array",
              "null"
            ],
            "description": "Add one or more questions to ask for each row.\n\nRequired.",
            "items": {
              "type": "object",
              "properties": {
                "question": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the question to answer for each row, using the selected fields. Defaults to an empty string.\n\nRequired."
                },
                "answerType": {
                  "description": "Choose the answer format: choice, score, or yes/no. Defaults to choice.\n\nRequired.\n\nValid values: `choice`, `score`, `yesNo`.",
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "choice",
                        "score",
                        "yesNo"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "choices": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "description": "Define the allowed answer labels for a choice question. Enter at least two distinct labels; Jev supports up to 255 choices.\n\nRelevant when `answerType` equals `choice`.\n\nRequired.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "label": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the option label shown to users. Defaults to an empty string.\n\nRequired."
                      },
                      "description": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the option description shown to users. Defaults to an empty string."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "scoreLevels": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "description": "Define the ordered score levels from lowest to highest for a score question. Enter at least two distinct levels; Jev supports up to 10 levels.\n\nRelevant when `answerType` equals `score`.\n\nRequired.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "label": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the label text shown for this decision score level. Defaults to an empty string.\n\nRequired."
                      },
                      "description": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the description text shown for this decision score level. Defaults to an empty string."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "yesDescription": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Describe when the answer should be yes. Defaults to an empty string.\n\nRelevant when `answerType` equals `yesNo`."
                },
                "noDescription": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Describe when the answer should be no. Defaults to an empty string.\n\nRelevant when `answerType` equals `yesNo`."
                },
                "outputOptions": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "description": "Configure the output settings for this decision question.\n\nRequired.",
                  "properties": {
                    "decisionFieldName": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Name the result field to add. Choice results produce a label, score results produce a numeric level, and Yes/No results produce a probability from 0 to 1. Original fields are retained, and any extra result fields are derived from this name.\n\nRequired."
                    },
                    "includeAllProbabilities": {
                      "type": [
                        "boolean",
                        "null"
                      ],
                      "description": "Add a probability field for each choice or score level. Defaults to true. Choice results always include the winning probability; this does not apply to Yes/No results.\n\nRequired."
                    }
                  },
                  "additionalProperties": false
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_aidecision",
        "description": "Options for a `aidecision` block."
      },
      "BlockOptions_anomalyDetection": {
        "type": "object",
        "properties": {
          "fieldsToUse": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the fields that anomaly detection should use. Choose the input columns to include in the detection analysis.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set how the data is partitioned before anomaly detection. Use this to run detection separately within each partition.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_anomalyDetection",
        "description": "Options for a `anomalyDetection` block."
      },
      "BlockOptions_append": {
        "type": "object",
        "properties": {
          "createSourceField": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Add an extra field that records the input source for each row.\n\nRequired."
          },
          "sourceFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the name of the field that will store each row's input source. Leave unset to use the default field name.\n\nRelevant when `createSourceField` equals `true`.\n\nRequired."
          },
          "includeOutputNameInSource": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include the output name in the source value recorded for each row.\n\nRelevant when `createSourceField` equals `true`.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_append",
        "description": "Options for a `append` block."
      },
      "BlockOptions_appendFiles": {
        "type": "object",
        "properties": {
          "files": {
            "type": [
              "array",
              "null"
            ],
            "description": "List the files to append. Provide one file location per item in the list.",
            "items": {
              "type": "object",
              "properties": {
                "location": {
                  "description": "Choose the file location source to append from. Select the variant that matches where the file is stored or how it is accessed.\n\nRequired.",
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "fileInOmniscope"
                        },
                        "path": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "urlHttpFtp"
                        },
                        "url": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                        },
                        "authentication": {
                          "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "none"
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "basic"
                                },
                                "passwordConnectionOptions": {
                                  "type": [
                                    "object",
                                    "null"
                                  ],
                                  "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                                  "properties": {
                                    "username": {
                                      "type": [
                                        "string",
                                        "null"
                                      ],
                                      "description": "Enter the username to use for this connection."
                                    },
                                    "password": {
                                      "type": [
                                        "object",
                                        "null"
                                      ],
                                      "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                      "properties": {
                                        "secretUpdate": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "The new secret. null leaves the stored one alone."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  },
                                  "additionalProperties": false
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "bearerToken"
                                },
                                "bearerToken": {
                                  "type": [
                                    "object",
                                    "null"
                                  ],
                                  "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                                  "properties": {
                                    "secretUpdate": {
                                      "type": [
                                        "string",
                                        "null"
                                      ],
                                      "description": "The new secret. null leaves the stored one alone."
                                    }
                                  },
                                  "additionalProperties": false
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "oauth2ClientFlow"
                                },
                                "tokenEndpointUrl": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                                },
                                "clientId": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                                },
                                "clientSecret": {
                                  "type": [
                                    "object",
                                    "null"
                                  ],
                                  "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                                  "properties": {
                                    "secretUpdate": {
                                      "type": [
                                        "string",
                                        "null"
                                      ],
                                      "description": "The new secret. null leaves the stored one alone."
                                    }
                                  },
                                  "additionalProperties": false
                                },
                                "useStandardFlow": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                                },
                                "addBasicAuthHeader": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                                },
                                "addClientCredentialParams": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                                },
                                "requestHeaders": {
                                  "type": [
                                    "array",
                                    "null"
                                  ],
                                  "description": "Add custom headers to the token request.",
                                  "items": {
                                    "type": "object",
                                    "properties": {
                                      "name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                      },
                                      "value": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "requestParams": {
                                  "type": [
                                    "array",
                                    "null"
                                  ],
                                  "description": "Add custom parameters to the token request.",
                                  "items": {
                                    "type": "object",
                                    "properties": {
                                      "name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                      },
                                      "value": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "httpApiGetPost"
                        },
                        "requestMethod": {
                          "description": "Select the HTTP method used for this request, either GET or POST.\n\nRequired.\n\nValid values: `get`, `post`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "get",
                                "post"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "address": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the request URL to send the HTTP call to.\n\nRequired."
                        },
                        "authentication": {
                          "description": "Choose the authentication method to use for the request, or leave unset to send no authentication.\n\nRequired.",
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "none"
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "basic"
                                },
                                "passwordConnectionOptions": {
                                  "type": [
                                    "object",
                                    "null"
                                  ],
                                  "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                                  "properties": {
                                    "username": {
                                      "type": [
                                        "string",
                                        "null"
                                      ],
                                      "description": "Enter the username to use for this connection."
                                    },
                                    "password": {
                                      "type": [
                                        "object",
                                        "null"
                                      ],
                                      "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                      "properties": {
                                        "secretUpdate": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "The new secret. null leaves the stored one alone."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  },
                                  "additionalProperties": false
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "bearerToken"
                                },
                                "bearerToken": {
                                  "type": [
                                    "object",
                                    "null"
                                  ],
                                  "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                                  "properties": {
                                    "secretUpdate": {
                                      "type": [
                                        "string",
                                        "null"
                                      ],
                                      "description": "The new secret. null leaves the stored one alone."
                                    }
                                  },
                                  "additionalProperties": false
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "oauth2ClientFlow"
                                },
                                "tokenEndpointUrl": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                                },
                                "clientId": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                                },
                                "clientSecret": {
                                  "type": [
                                    "object",
                                    "null"
                                  ],
                                  "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                                  "properties": {
                                    "secretUpdate": {
                                      "type": [
                                        "string",
                                        "null"
                                      ],
                                      "description": "The new secret. null leaves the stored one alone."
                                    }
                                  },
                                  "additionalProperties": false
                                },
                                "useStandardFlow": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                                },
                                "addBasicAuthHeader": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                                },
                                "addClientCredentialParams": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                                },
                                "requestHeaders": {
                                  "type": [
                                    "array",
                                    "null"
                                  ],
                                  "description": "Add custom headers to the token request.",
                                  "items": {
                                    "type": "object",
                                    "properties": {
                                      "name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                      },
                                      "value": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "requestParams": {
                                  "type": [
                                    "array",
                                    "null"
                                  ],
                                  "description": "Add custom parameters to the token request.",
                                  "items": {
                                    "type": "object",
                                    "properties": {
                                      "name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                      },
                                      "value": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "httpHeaders": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "description": "Add one or more HTTP headers to include with the request.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "headerName": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "**Choice**, suggested values: A-IM, Accept, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Language, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-Control, Connection, Content-Encoding, .... Custom values are also accepted.\n\nSelect the HTTP header name to configure.\n\nRequired."
                              },
                              "headerValue": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the value to send for the selected HTTP header.\n\nRequired."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "timeoutSeconds": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Set the request timeout in seconds.",
                          "maximum": 2147483647,
                          "minimum": -2147483648
                        },
                        "postDataType": {
                          "description": "Choose the body format to use when the request method is POST.\n\nRelevant when `requestMethod` equals `post`.\n\nRequired.",
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "json"
                                },
                                "postData": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the JSON payload to post. Provide the request body content for this block.\n\nRequired."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "plainText"
                                },
                                "postData": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the plain text content to send in the POST body.\n\nRequired."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "xml"
                                },
                                "postData": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the XML post body to send as the request content.\n\nRequired."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "remoteFileViaSshSftpScp"
                        },
                        "protocol": {
                          "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "sftp",
                                "scp"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "host": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the remote server host name.\n\nRequired."
                        },
                        "port": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Set the SSH port number to connect to.\n\nRequired.",
                          "maximum": 65536,
                          "minimum": 0
                        },
                        "usePrivateKey": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                        },
                        "path": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                        },
                        "passwordConnectionOptions": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Configure password-based connection options for this SSH location.",
                          "properties": {
                            "username": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Enter the username to use for this connection."
                            },
                            "password": {
                              "type": [
                                "object",
                                "null"
                              ],
                              "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                              "properties": {
                                "secretUpdate": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "The new secret. null leaves the stored one alone."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "additionalProperties": false
                        },
                        "privateKeyFileLocationOptions": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                          "properties": {
                            "path": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "hadoopHdfsFile"
                        },
                        "host": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the HDFS name node host.\n\nRequired."
                        },
                        "port": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Set the WebHDFS service port number.\n\nRequired.",
                          "maximum": 2147483647,
                          "minimum": 0
                        },
                        "user": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the user name used to access files and directories.\n\nRequired."
                        },
                        "path": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                        },
                        "readBufferMb": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                          "maximum": 2147483647,
                          "minimum": -2147483648
                        },
                        "writeBufferMb": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                          "maximum": 2147483647,
                          "minimum": -2147483648
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "googleDriveFile"
                        },
                        "connection": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                        },
                        "drive": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                        },
                        "filePath": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                          "items": {
                            "type": "string"
                          }
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "amazonS3File"
                        },
                        "confirmConnection": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                        },
                        "bucket": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                        },
                        "path": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the S3 object path to read from or write to.\n\nRequired."
                        },
                        "connectionOptions": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Configure additional S3 connection settings.",
                          "properties": {
                            "identifyCredentialsAutomatically": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                            },
                            "accessKeyId": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                            },
                            "secretAccessKey": {
                              "type": [
                                "object",
                                "null"
                              ],
                              "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                              "properties": {
                                "secretUpdate": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "The new secret. null leaves the stored one alone."
                                }
                              },
                              "additionalProperties": false
                            },
                            "identifyRegionAutomatically": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                            },
                            "region": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "googleCloudStorageFile"
                        },
                        "confirmConnection": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                        },
                        "bucket": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                        },
                        "file": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                        },
                        "connectionOptions": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Set the storage connection options for this Google Cloud Storage location.",
                          "properties": {
                            "credentialsType": {
                              "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "automatic",
                                    "credentialsFile",
                                    "unauthenticated"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "credentialsFileLocation": {
                              "type": [
                                "object",
                                "null"
                              ],
                              "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                              "properties": {
                                "path": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "azureGen2StorageFile"
                        },
                        "confirmConnection": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                        },
                        "fileSystem": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                        },
                        "file": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                        },
                        "connectionOptions": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Configure the storage connection details used to access the file system.",
                          "properties": {
                            "accountName": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                            },
                            "accountKey": {
                              "type": [
                                "object",
                                "null"
                              ],
                              "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                              "properties": {
                                "secretUpdate": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "The new secret. null leaves the stored one alone."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "dropboxFileExperimental"
                        },
                        "confirmConnection": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                        },
                        "path": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                        },
                        "connectionOptions": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Set the Dropbox connection settings used to access the file.",
                          "properties": {
                            "accessToken": {
                              "type": [
                                "object",
                                "null"
                              ],
                              "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                              "properties": {
                                "secretUpdate": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "The new secret. null leaves the stored one alone."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "embeddedDataFile"
                        },
                        "embeddedFile": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Select the embedded file to use as the data source for this block.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "additionalProperties": false
            }
          },
          "useFileNamesFromUpstreamBlock": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable this to read the file name, path, or URL from a field in the incoming data instead of listing files manually.\n\nRequired."
          },
          "fileField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Choose the input field that contains the file path or URL to append.\n\nRelevant when `useFileNamesFromUpstreamBlock` equals `true`.\n\nField name from input 0."
          },
          "autoDetectFileType": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Set this to detect the file type and reader settings from the file extension. For Excel files, the first worksheet is read.\n\nRequired."
          },
          "fileType": {
            "description": "Choose the file format and reader settings to use when auto-detect is disabled.\n\nRelevant when `autoDetectFileType` equals `false`.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password required to open the Omniscope Classic report and data file. Leave unset if the file is not password protected.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "formulaRecalculation": {
                    "description": "Choose how formulas are recalculated when reading the file: none, only formulas that change over time, or all formulas.\n\nRequired.\n\nValid values: `none`, `changeOverTime`, `all`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "changeOverTime",
                          "all"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "Control how date and time values are handled when the IOD file was created in a different timezone. Use this to preserve logical local dates/times or to keep the same absolute point in time.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeLegacyDataTableIsdFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the file text encoding, which defaults to UTF-8.\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character that separates cells in each row; defaults to a comma. To read each line as a single cell, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuote": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the quote character used around cells; defaults to a double quote. For no quote character at all, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "fieldTypeDetection": {
                    "description": "Choose how field data types are detected. Defaults to sampling the first 10,000 records; you can also scan all records or treat all fields as text for faster import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data options in the nested table settings.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "textAsSingleCellTxtFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the character encoding used to decode the text file.\n\nRequired."
                  },
                  "removeHTMLTags": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Remove HTML tags from the file and keep only the text content.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nPassword for the workbook if it is protected.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "reader": {
                    "description": "Choose the Excel reading engine to use. Select the streaming reader for large files, the Microsoft reader for full formula support on Windows, or the legacy Microsoft reader for compatibility with older workflows.\n\nRequired.\n\nValid values: `omniscope`, `microsoft`, `microsoftLegacy`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "microsoft",
                          "microsoftLegacy"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetSelection": {
                    "description": "Choose which worksheets to read from the workbook. Use the custom option to specify worksheet names explicitly.\n\nRequired.\n\nValid values: `first`, `all`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "first",
                          "all",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetNames": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the worksheet names to read when using custom worksheet selection.\n\nRelevant when `worksheetSelection` equals `custom`.",
                    "items": {
                      "type": "string"
                    }
                  },
                  "showWorksheetSourceField": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Add a source field that stores the worksheet name for each imported row. This is only useful when reading more than one worksheet.\n\nRequired."
                  },
                  "worksheetSourceFieldName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name of the output field that will contain the worksheet name.\n\nRelevant when `showWorksheetSourceField` equals `true`.\n\nRequired."
                  },
                  "importOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional import options for the Excel reader.\n\nRequired.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  },
                  "autoDetectDataTypes": {
                    "description": "Choose how to infer field types during import. Use a faster option for large files when you plan to set types manually later.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "jsonDataJsonFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be treated as records in the output. Paths are slash-delimited key names and `*` matches any single node at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be extracted as fields in the output, one path per field, relative to the whole document in the same slash-and-wildcard form as recordPath - e.g. `person/*/name`, `person/*/address/*/city`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the field name to use for this JSON path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the JSON path for the field value to read or write.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set preset JSON reader options when you want to use a predefined configuration.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "xmlDataXmlFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify the XML nodes that make up each output record. Paths are slash-delimited element names and `*` matches any single element at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the XML nodes to extract as fields within each record, one path per field, in the same slash-and-wildcard form as recordPath - and prefix an ATTRIBUTE with `@`: `root/a@id` is the `id` attribute of each `a`, `person/info@name` the `name` attribute of `info`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the name of the field to read or write in the XML path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the XML path used to locate the field value in the record.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set optional preset parsing options for XML input.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "logFileLogFileExperimental"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding used to read the log file. Defaults to windows-1252.\n\nRequired."
                  },
                  "locale": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used when interpreting the log file's text and formatted values. Defaults to en_US."
                  },
                  "autoDetectFieldTypes": {
                    "description": "Choose how field data types are detected during import. Select a faster, shallower detection mode for large datasets, or keep all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "personalStorageTablePstFile"
                  },
                  "messageFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which message fields to retrieve from the PST file. Include Body only when you need message content, as it can slow the import.\n\nRequired.\n\nValid values: `folderName`, `senderName`, `senderEmail`, `displayTo`, `displayCc`, `displayBcc`, `messageDeliveryTime`, `subject`, `body`.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "folderName",
                        "senderName",
                        "senderEmail",
                        "displayTo",
                        "displayCc",
                        "displayBcc",
                        "messageDeliveryTime",
                        "subject",
                        "body"
                      ]
                    }
                  },
                  "maxMessages": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Limit how many messages are loaded from the PST file. Leave unset to load all messages.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "folderNameFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Load messages only from folders whose names contain this text. Leave unset to load messages from all folders."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "createSourceField": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Add a new field that stores the source file for each output row.\n\nRequired."
          },
          "sourceFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name the field that will contain the source file for each row.\n\nRelevant when `createSourceField` equals `true`.\n\nRequired."
          },
          "httpOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure HTTP settings used when files are provided from the upstream block.\n\nRelevant when `useFileNamesFromUpstreamBlock` equals `true`.\n\nRequired.",
            "properties": {
              "httpHeaders": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Add the HTTP headers to send with the request. Use this to pass custom header name-value pairs.",
                "items": {
                  "type": "object",
                  "properties": {
                    "headerName": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "**Choice**, suggested values: A-IM, Accept, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Language, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-Control, Connection, Content-Encoding, .... Custom values are also accepted.\n\nSelect the HTTP header name to configure.\n\nRequired."
                    },
                    "headerValue": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Enter the value to send for the selected HTTP header.\n\nRequired."
                    }
                  },
                  "additionalProperties": false
                }
              },
              "requestTimeoutSeconds": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the request timeout in seconds. Leave unset to use the default timeout.",
                "maximum": 2147483647,
                "minimum": -2147483648
              },
              "passwordConnectionOptions": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Configure password-based connection settings for the request. Leave unset to use the default connection handling.\n\nRequired.",
                "properties": {
                  "username": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the username to use for this connection."
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "sshOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure SSH settings used when files are provided from the upstream block.\n\nRelevant when `useFileNamesFromUpstreamBlock` equals `true`.\n\nRequired.",
            "properties": {
              "useOpenSshPrivateKey": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable authentication with an OpenSSH private key. Use the Password field as the key passphrase.\n\nRequired."
              },
              "passwordConnectionOptions": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Configure the password-based connection settings for this SSH file append request.\n\nRequired.",
                "properties": {
                  "username": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the username to use for this connection."
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false
              },
              "openSshPrivateKeyFile": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Choose the location of the OpenSSH private key file to use when private key authentication is enabled.\n\nRelevant when `useOpenSshPrivateKey` equals `true`.\n\nRequired.",
                "properties": {
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "retryOnIOExceptionOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Enable and configure retries for input I/O errors.\n\nRequired.",
            "properties": {
              "retryOnIoError": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable retries when an operation fails with an I/O error. Leave unset to disable I/O retrying."
              },
              "retryIntervalSeconds": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set how long to wait before each retry, in seconds. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "maxRetryAttempts": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of retry attempts after an I/O error. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "allowChangeDuringExecution": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Allow the source file to change while a single execution is running. Use this for files that are expected to be updated continuously, such as append-only logs."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_appendFiles",
        "description": "Options for a `appendFiles` block."
      },
      "BlockOptions_basketAnalysis": {
        "type": "object",
        "properties": {
          "itemField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the field whose values label individual items in each transaction.\n\nRequired.\n\nField name from input 0."
          },
          "itemGroupField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select an optional broader grouping field for items. When set, the analysis can produce rules for both the granular item labels and the broader group labels.\n\nField name from input 0."
          },
          "provideBothRules": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable this to return rules for both items and groups, regardless of which set is stronger.\n\nRelevant when `itemGroupField` is non-empty.\n\nRequired."
          },
          "transactionIdField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the field that contains the unique transaction identifier used to group items purchased together.\n\nRequired.\n\nField name from input 0."
          },
          "useUniqueTransactionsOnly": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Limit the analysis to unique transactions only to reduce memory and time use.\n\nRequired."
          },
          "minimumLength": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the minimum number of items allowed in each item combination rule.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": 2
          },
          "maximumLength": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the maximum number of items allowed in each item combination rule.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": 1
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the analysis is partitioned.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_basketAnalysis",
        "description": "Options for a `basketAnalysis` block."
      },
      "BlockOptions_batchAppendFolder": {
        "type": "object",
        "properties": {
          "searches": {
            "type": [
              "array",
              "null"
            ],
            "description": "To customise file import behaviour, you must untick \"Auto-configure\"\n\nSelect the files or folders to append from the configured searches. Item details are configured separately.",
            "items": {
              "type": "object",
              "properties": {
                "files": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Match files by all or part of their filename.\n\nRequired."
                },
                "caseSensitive": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Treat filename matching as case sensitive.\n\nRequired."
                },
                "autoConfigure": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Use the default file type and configuration based on the file extension. For Excel files, read the first worksheet.\n\nRequired."
                },
                "template": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Use another File block in this workflow as the template for file format options. Set this for complex formats like CSV, JSON, and XML when you want to configure and preview the result from a sample file.\n\nRelevant when `autoConfigure` equals `false`.\n\nRequired."
                },
                "templateBlock": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the File block to use as the template when template-based configuration is enabled.\n\nRelevant when `autoConfigure` equals `false`; when `template` equals `true`.\n\nRequired."
                },
                "fileType": {
                  "description": "Choose the file type and configure its reader options when auto-configuration is disabled and no template block is used.\n\nRelevant when `autoConfigure` equals `false`; when `template` equals `false`.\n\nRequired.",
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "omniscopeClassicReportDataIokFile"
                        },
                        "password": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password required to open the Omniscope Classic report and data file. Leave unset if the file is not password protected.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        },
                        "formulaRecalculation": {
                          "description": "Choose how formulas are recalculated when reading the file: none, only formulas that change over time, or all formulas.\n\nRequired.\n\nValid values: `none`, `changeOverTime`, `all`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "none",
                                "changeOverTime",
                                "all"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "omniscopeDataTableIodFile"
                        },
                        "convertDatesAcrossTimezones": {
                          "description": "Control how date and time values are handled when the IOD file was created in a different timezone. Use this to preserve logical local dates/times or to keep the same absolute point in time.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "never",
                                "auto",
                                "always"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "omniscopeLegacyDataTableIsdFile"
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "delimitedTextCsvTsvFile"
                        },
                        "encoding": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the file text encoding, which defaults to UTF-8.\n\nRequired."
                        },
                        "cellSeparator": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the character that separates cells in each row; defaults to a comma. To read each line as a single cell, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                        },
                        "cellQuote": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the quote character used around cells; defaults to a double quote. For no quote character at all, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                        },
                        "fieldTypeDetection": {
                          "description": "Choose how field data types are detected. Defaults to sampling the first 10,000 records; you can also scan all records or treat all fields as text for faster import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "sample",
                                "fullData",
                                "none"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "tableDataOptions": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Configure additional table data options in the nested table settings.",
                          "properties": {
                            "hasHeader": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                            },
                            "firstHeaderRow": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                              "maximum": 2147483647,
                              "minimum": 1
                            },
                            "lastHeaderRow": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                              "maximum": 2147483647,
                              "minimum": 1
                            },
                            "headerSeparator": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                            },
                            "missingFieldPrefix": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                            },
                            "autoCorrectFieldNameCase": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                            },
                            "firstDataRow": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                              "maximum": 2147483647,
                              "minimum": 1
                            },
                            "lastDataRow": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                              "maximum": 2147483647,
                              "minimum": 1
                            },
                            "skipEmptyDataRows": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                            },
                            "convertPlaceholdersToNulls": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                            },
                            "locale": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "textAsSingleCellTxtFile"
                        },
                        "encoding": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the character encoding used to decode the text file.\n\nRequired."
                        },
                        "removeHTMLTags": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Remove HTML tags from the file and keep only the text content.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "jsonDataJsonFile"
                        },
                        "recordPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Identify which JSON nodes should be treated as records in the output. Paths are slash-delimited key names and `*` matches any single node at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                        },
                        "fields": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "description": "Identify which JSON nodes should be extracted as fields in the output, one path per field, relative to the whole document in the same slash-and-wildcard form as recordPath - e.g. `person/*/name`, `person/*/address/*/city`.\n\nRequired.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "fieldName": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Set the field name to use for this JSON path mapping.\n\nRequired."
                              },
                              "fieldPath": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Set the JSON path for the field value to read or write.\n\nRequired."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "presetOptions": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Set preset JSON reader options when you want to use a predefined configuration.",
                          "properties": {
                            "autoConfigure": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "xmlDataXmlFile"
                        },
                        "recordPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Identify the XML nodes that make up each output record. Paths are slash-delimited element names and `*` matches any single element at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                        },
                        "fields": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "description": "List the XML nodes to extract as fields within each record, one path per field, in the same slash-and-wildcard form as recordPath - and prefix an ATTRIBUTE with `@`: `root/a@id` is the `id` attribute of each `a`, `person/info@name` the `name` attribute of `info`.\n\nRequired.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "fieldName": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the name of the field to read or write in the XML path mapping.\n\nRequired."
                              },
                              "fieldPath": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the XML path used to locate the field value in the record.\n\nRequired."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "presetOptions": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Set optional preset parsing options for XML input.",
                          "properties": {
                            "autoConfigure": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "excelSpreadsheetXlsxXlsFile"
                        },
                        "password": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nPassword for the workbook if it is protected.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        },
                        "reader": {
                          "description": "Choose the Excel reading engine to use. Select the streaming reader for large files, the Microsoft reader for full formula support on Windows, or the legacy Microsoft reader for compatibility with older workflows.\n\nRequired.\n\nValid values: `omniscope`, `microsoft`, `microsoftLegacy`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "omniscope",
                                "microsoft",
                                "microsoftLegacy"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "worksheetSelection": {
                          "description": "Choose which worksheets to read from the workbook. Use the custom option to specify worksheet names explicitly.\n\nRequired.\n\nValid values: `first`, `all`, `custom`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "first",
                                "all",
                                "custom"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "worksheetNames": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "description": "List the worksheet names to read when using custom worksheet selection.\n\nRelevant when `worksheetSelection` equals `custom`.",
                          "items": {
                            "type": "string"
                          }
                        },
                        "showWorksheetSourceField": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Add a source field that stores the worksheet name for each imported row. This is only useful when reading more than one worksheet.\n\nRequired."
                        },
                        "worksheetSourceFieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the name of the output field that will contain the worksheet name.\n\nRelevant when `showWorksheetSourceField` equals `true`.\n\nRequired."
                        },
                        "importOptions": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Configure additional import options for the Excel reader.\n\nRequired.",
                          "properties": {
                            "hasHeader": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                            },
                            "firstHeaderRow": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                              "maximum": 2147483647,
                              "minimum": 1
                            },
                            "lastHeaderRow": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                              "maximum": 2147483647,
                              "minimum": 1
                            },
                            "headerSeparator": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                            },
                            "missingFieldPrefix": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                            },
                            "autoCorrectFieldNameCase": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                            },
                            "firstDataRow": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                              "maximum": 2147483647,
                              "minimum": 1
                            },
                            "lastDataRow": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                              "maximum": 2147483647,
                              "minimum": 1
                            },
                            "skipEmptyDataRows": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                            },
                            "convertPlaceholdersToNulls": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                            },
                            "locale": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                            }
                          },
                          "additionalProperties": false
                        },
                        "autoDetectDataTypes": {
                          "description": "Choose how to infer field types during import. Use a faster option for large files when you plan to set types manually later.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "sample",
                                "fullData",
                                "none"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "logFileLogFileExperimental"
                        },
                        "encoding": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding used to read the log file. Defaults to windows-1252.\n\nRequired."
                        },
                        "locale": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used when interpreting the log file's text and formatted values. Defaults to en_US."
                        },
                        "autoDetectFieldTypes": {
                          "description": "Choose how field data types are detected during import. Select a faster, shallower detection mode for large datasets, or keep all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "sample",
                                "fullData",
                                "none"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "personalStorageTablePstFile"
                        },
                        "messageFields": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "description": "Select which message fields to retrieve from the PST file. Include Body only when you need message content, as it can slow the import.\n\nRequired.\n\nValid values: `folderName`, `senderName`, `senderEmail`, `displayTo`, `displayCc`, `displayBcc`, `messageDeliveryTime`, `subject`, `body`.",
                          "items": {
                            "type": "string",
                            "enum": [
                              "folderName",
                              "senderName",
                              "senderEmail",
                              "displayTo",
                              "displayCc",
                              "displayBcc",
                              "messageDeliveryTime",
                              "subject",
                              "body"
                            ]
                          }
                        },
                        "maxMessages": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Limit how many messages are loaded from the PST file. Leave unset to load all messages.",
                          "maximum": 2147483647,
                          "minimum": 1
                        },
                        "folderNameFilter": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Load messages only from folders whose names contain this text. Leave unset to load messages from all folders."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "additionalProperties": false
            }
          },
          "includeSubFolders": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "To customise file import behaviour, you must untick \"Auto-configure\"\n\nSearch sub-folders as well as the selected folder. Defaults to true.\n\nRequired."
          },
          "createFilenameField": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Create a source field containing each file name. Defaults to true.\n\nRequired."
          },
          "filenameFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the source field name for the file name field. Defaults to \"Filename\".\n\nRelevant when `createFilenameField` equals `true`.\n\nRequired."
          },
          "includePath": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include the relative path from the base folder in the file name field. Defaults to false.\n\nRelevant when `createFilenameField` equals `true`.\n\nRequired."
          },
          "createFilenameWithoutExtensionField": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Create a source field containing each file name without its extension. Defaults to false.\n\nRequired."
          },
          "filenameWithoutExtensionFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the source field name for the file name without extension field. Defaults to \"Filename without extension\".\n\nRelevant when `createFilenameWithoutExtensionField` equals `true`.\n\nRequired."
          },
          "createLastModifiedField": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Create a source field containing each file's last modified date. Defaults to false.\n\nRequired."
          },
          "lastModifiedFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the source field name for the last modified date field. Defaults to \"Date modified\".\n\nRelevant when `createLastModifiedField` equals `true`.\n\nRequired."
          },
          "useDiskCache": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Write all data to a temporary disk cache. Defaults to false. This can improve performance in some cases and enables per-file read error handling.\n\nRequired."
          },
          "fileReadErrorHandling": {
            "description": "Control what happens when a matching file cannot be read. Applies only when disk cache is enabled and defaults to Error.\n\nRelevant when `useDiskCache` equals `true`.\n\nRequired.\n\nValid values: `error`, `warning`, `ignore`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "error",
                  "warning",
                  "ignore"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "folderLocation": {
            "description": "Choose the folder location type and configure the matching location details.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "embeddedDataFile"
                  },
                  "embeddedFile": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the embedded file to use as the data source for this block.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_batchAppendFolder",
        "description": "Options for a `batchAppendFolder` block."
      },
      "BlockOptions_batchHttp": {
        "type": "object",
        "properties": {
          "requestUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the field whose values provide the request URL for each item.\n\nField name from input 0."
          },
          "defaultUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Use this URL when no request URL field is set."
          },
          "requestMethod": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the field whose values provide the HTTP method for each item. Supported values are GET, POST, PUT, and DELETE.\n\nField name from input 0."
          },
          "defaultMethod": {
            "description": "Use this HTTP method when no method field is set.\n\nRequired.\n\nValid values: `get`, `post`, `put`, `delete`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "get",
                  "post",
                  "put",
                  "delete"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "requestBody": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the field whose values provide the request body for each item.\n\nField name from input 0."
          },
          "defaultBody": {
            "type": [
              "string",
              "null"
            ],
            "description": "Use this body when no request body field is set."
          },
          "requestHeaders": {
            "type": [
              "array",
              "null"
            ],
            "description": "Add headers to send with each request.",
            "items": {
              "type": "object",
              "properties": {
                "headerName": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the name of the request header to write.\n\nRequired."
                },
                "headerValueField": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Select the field whose value will be written into the header.\n\nField name from input 0."
                },
                "defaultValue": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the fallback header value to use when the selected field has no value."
                }
              },
              "additionalProperties": false
            }
          },
          "authentication": {
            "description": "Choose the authentication method to apply to the requests.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "none"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "basic"
                  },
                  "usernameField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the field that provides username values for basic authentication.\n\nField name from input 0."
                  },
                  "defaultUsername": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the default username to use for basic authentication."
                  },
                  "passwordField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the field that provides password values for basic authentication.\n\nField name from input 0."
                  },
                  "defaultPassword": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the default password to use for basic authentication.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "bearerToken"
                  },
                  "tokenField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the field that contains the bearer token value to use for authentication.\n\nField name from input 0."
                  },
                  "defaultToken": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide a default bearer token to use when the selected token field does not supply one.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "oauth2ClientFlow"
                  },
                  "tokenEndpointUrl": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the field that supplies the token endpoint URL used to request an access token.\n\nField name from input 0."
                  },
                  "defaultTokenEndpointUrl": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the token endpoint URL to use when no field value is provided."
                  },
                  "clientId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the field that supplies the OAuth client ID.\n\nField name from input 0."
                  },
                  "defaultClientId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the client ID to use when no field value is provided."
                  },
                  "clientSecret": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the field that supplies the OAuth client secret.\n\nField name from input 0."
                  },
                  "defaultClientSecret": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret to use when no field value is provided.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "useClientCredentialsFlow": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use the standard client credentials grant type for the token request. Leave unset for providers that require a different grant type.\n\nRequired."
                  },
                  "addBasicAuthHeader": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include an HTTP Basic Authorization header on OAuth token requests using the client ID and client secret.\n\nRequired."
                  },
                  "addClientCredentialsParams": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include client ID and client secret parameters in the token request body when the provider requires them.\n\nRequired."
                  },
                  "requestHeaders": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add custom headers to send with the OAuth token request.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the header name to add to the OAuth 2 request. Use the exact name expected by the target API.\n\nRequired."
                        },
                        "valueField": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Choose where the header value comes from. Select a field to copy its value at runtime, or leave unset to use the default value below.\n\nField name from input 0."
                        },
                        "defaultValue": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the default header value to send when no value field is selected."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "requestParams": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add custom parameters to send with the OAuth token request.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the parameter name to send in the OAuth 2 request.\n\nRequired."
                        },
                        "valueField": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Select the dataset field whose value should be used for this OAuth 2 request parameter.\n\nField name from input 0."
                        },
                        "defaultValue": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the default value to use for this OAuth 2 request parameter when no field value is provided."
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "responseBody": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include the response body in the output.\n\nRequired."
          },
          "allResponseHeaders": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include all response headers together as a single summary field in the output.\n\nRequired."
          },
          "inputFields": {
            "description": "Choose which input fields to carry through to the output: all input fields, only input fields not used for the request, or none.\n\nRequired.\n\nValid values: `allFields`, `nonRequestFields`, `none`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "allFields",
                  "nonRequestFields",
                  "none"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "responseHeaders": {
            "type": [
              "array",
              "null"
            ],
            "description": "Add response headers to extract into output fields.",
            "items": {
              "type": "object",
              "properties": {
                "headerName": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the response header name to use for this option.\n\nRequired."
                }
              },
              "additionalProperties": false
            }
          },
          "onNon2xxStatusCode": {
            "description": "Choose how to handle non-2xx HTTP status codes: abort, warn, or ignore.\n\nRequired.\n\nValid values: `abort`, `warning`, `ignore`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "abort",
                  "warning",
                  "ignore"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "timeoutSeconds": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set a timeout in seconds for each request."
          },
          "onTimeoutOrNetworkError": {
            "description": "Choose how to handle timeouts and network or protocol errors: abort, warn, or send the error to a field.\n\nRequired.\n\nValid values: `abort`, `warning`, `errorMessageField`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "abort",
                  "warning",
                  "errorMessageField"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_batchHttp",
        "description": "Options for a `batchHttp` block."
      },
      "BlockOptions_batchPublisher": {
        "type": "object",
        "properties": {
          "batchOutputConfiguration": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Choose where this batch output's settings come from. Set false to use the manual list configured on this block; set true to inherit them from an upstream block. Defaults to false.\n\nRequired.\n\n`true` = Use an input feed of data to provide the batch configuration. This can be generated using an upstream workflow, for example to auto-generate an action for every user in a database. To get started, use 'Batch Output config example' in the Add Block menu.; `false` = Use a table below to enter the batch configuration. See the instructions tab for help with the necessary fields and values.."
          },
          "datatableOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "The table's content, as a header plus rows: {\"fields\":[\"Code\",\"Label\"],\"rows\":[[\"A\",\"Alpha\"],[\"B\",null]]}. Every row must have exactly as many cells as `fields`. Sending this REPLACES the whole table - to change one cell, read the current table with describe_block and send it back with that cell changed. Limits for one write through this API: 1000 rows and 50000 cells. Types are detected when the table runs unless autoDetectDataTypes is off, in which case every column stays text.\n\nConfigure the datatable output settings for the batch output when you are not using upstream configuration.\n\nRelevant when `batchOutputConfiguration` equals `false`.\n\nRequired.",
            "properties": {
              "fields": {
                "type": "array",
                "description": "Column names, in order. Must be unique.",
                "items": {
                  "type": "string"
                }
              },
              "rows": {
                "type": "array",
                "description": "One array per row, each holding exactly as many cells as `fields`, in the same order. null means an empty cell.",
                "items": {
                  "type": "array",
                  "items": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_batchPublisher",
        "description": "Options for a `batchPublisher` block."
      },
      "BlockOptions_bulkFieldOrganiser": {
        "type": "object",
        "properties": {
          "selectedFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the individual fields to configure in bulk.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "fieldRules": {
            "type": [
              "array",
              "null"
            ],
            "description": "Add one or more field-matching rules to select fields in bulk.",
            "items": {
              "type": "object",
              "properties": {
                "filterType": {
                  "description": "Choose which field attribute to filter by: name, number, type, description, source, or group.\n\nRequired.\n\nValid values: `fieldName`, `fieldNumber`, `fieldType`, `fieldDescription`, `fieldSource`, `fieldGroup`.",
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "fieldName",
                        "fieldNumber",
                        "fieldType",
                        "fieldDescription",
                        "fieldSource",
                        "fieldGroup"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "filter": {
                  "description": "Set the matching rule for the selected field attribute. Pick the comparison or text-matching option that should be applied.\n\nRelevant when `filterType` does not equal `fieldType`.\n\nRequired.",
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "equals"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to compare against. Use this as the match text for the equals filter."
                        },
                        "accentSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable accent-sensitive matching so accented and unaccented characters are treated as different.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching so uppercase and lowercase letters are treated as different.\n\nRelevant when `accentSensitive` equals `true`.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the value: exact text, wildcard patterns, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "notEqual"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to compare against. The filter matches items that are not equal to this text."
                        },
                        "accentSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable accent-sensitive comparison so accented and unaccented characters are treated as different.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive comparison so uppercase and lowercase characters are treated as different.\n\nRelevant when `accentSensitive` equals `true`.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the value: as plain text, wildcard text using * and ?, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "greaterThan"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the comparison value to test against. Use the text you want this filter to match as greater than.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching when comparing the value. Leave unset to use the default case-insensitive behavior.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "greaterThanOrEqual"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the comparison value to test against. Provide the threshold or exact text to match, depending on the data type.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching when comparing text values.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "lessThan"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the value to compare against with the less-than filter.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching when the value is text; leave unset to use the default comparison behavior.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "lessThanOrEqual"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the comparison value to test against with the less-than-or-equal condition.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Set whether text comparisons should treat uppercase and lowercase letters as different.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "contains"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text or pattern to search for with the contains filter.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Set whether the contains match should respect letter case.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the value: as plain text, wildcards, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "doesNotContain"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to test against. The filter keeps items that do not contain this text.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Match uppercase and lowercase characters exactly when checking whether the value contains the text.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the search text: plain text, wildcards, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "startsWith"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the text to match at the start of each input value.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching when checking whether values start with the given text.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the match text: normal, wildcard patterns, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "endsWith"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text to match at the end of the field value.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Match text using exact letter case when enabled.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the match text: normal text, wildcards using * and ?, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "fuzzyMatchSoundex"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text to fuzzy-match using Soundex."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "fuzzyMatchLevenshtein"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text to match against. The filter keeps items whose text matches this value with Levenshtein fuzzy matching."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching for the fuzzy comparison.\n\nRequired."
                        },
                        "closeness": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Set how many edits are allowed between the input text and a match. Higher values make the fuzzy match broader.\n\nRequired.",
                          "maximum": 2147483647,
                          "minimum": -2147483648
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "fieldTypeFilter": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "description": "Set the type-specific filter settings used when filtering by field type.\n\nRelevant when `filterType` equals `fieldType`.\n\nRequired.",
                  "properties": {
                    "filterType": {
                      "description": "Choose which comparison to apply to the value: equals or does not equal.\n\nRequired.\n\nValid values: `equals`, `notEquals`.",
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "equals",
                            "notEquals"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "valueType": {
                      "description": "Choose the type of value to match against: integer, decimal, text, or date.\n\nRequired.\n\nValid values: `integer`, `decimal`, `text`, `date`.",
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "integer",
                            "decimal",
                            "text",
                            "date"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "additionalProperties": false
                }
              },
              "additionalProperties": false
            }
          },
          "ruleCondition": {
            "description": "Choose whether matching rules are accepted or rejected when the rule list is used.\n\nRelevant when `fieldRules` is non-empty.\n\nRequired.\n\nValid values: `accept`, `reject`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "accept",
                  "reject"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "ruleMatch": {
            "description": "Choose whether all rules or any rule must match to apply the rule list.\n\nRelevant when `fieldRules` has multiple entries.\n\nRequired.\n\nValid values: `all`, `any`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "all",
                  "any"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "fieldNameOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how field names are modified during the bulk operation.",
            "properties": {
              "searchText": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Enter text to find within field names so it can be replaced or removed. Leave unset to skip text replacement."
              },
              "replaceText": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Enter the text to substitute for each search match. Leave unset to remove the matched text.\n\nRelevant when `searchText` is non-empty."
              },
              "caseSensitive": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Set whether the search text must match letter case exactly when replacing text in field names.\n\nRelevant when `searchText` is non-empty."
              },
              "prefix": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Enter text to prepend to each field name. Leave unset to avoid adding a prefix."
              },
              "suffix": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Enter text to append to each field name. Leave unset to avoid adding a suffix."
              }
            },
            "additionalProperties": false
          },
          "fieldOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure additional field options applied during the bulk operation.",
            "properties": {
              "outputDataType": {
                "description": "Choose the output data type for the field. Use Inherit to keep the existing type, or pick Integer, Decimal, Text, or Date to convert it.\n\nValid values: `inherit`, `integer`, `decimal`, `text`, `date`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "inherit",
                      "integer",
                      "decimal",
                      "text",
                      "date"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "delete": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Delete the field instead of transforming it.\n\nRequired."
              },
              "showThousandSeparator": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Show or hide thousand separators when formatting a numeric field. Use Inherit to keep the existing setting.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [integer, decimal, ].\n\nomit/null = Use the setting as passed through."
              },
              "showAsPercent": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Format the numeric value as a percentage. Use Inherit to keep the existing setting.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [integer, decimal, ].\n\nomit/null = Use the setting as passed through."
              },
              "decimalPlaces": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set how many decimal places to show for numeric values.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [integer, decimal, ].",
                "maximum": 2147483647,
                "minimum": -2147483648
              },
              "prefix": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Add a short prefix before numeric values, such as a currency symbol.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [integer, decimal, ]."
              },
              "suffix": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Add a short suffix after numeric values, such as a unit or currency symbol.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [integer, decimal, ]."
              },
              "negativeNumberFormat": {
                "description": "Choose how negative numbers are displayed. Leave unset to use the default minus-sign format.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [integer, decimal, ].\n\nValid values: `minusSign`, `accounting`, `ledger`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "minusSign",
                      "accounting",
                      "ledger"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "inputPattern": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSet the date pattern used to parse input values.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [date, ]."
              },
              "outputPattern": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSet the date pattern used when formatting output values.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [date, ]."
              },
              "inputLocale": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used to convert text to numbers or dates from another locale.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [date, decimal, integer, ]."
              },
              "tokenised": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable tokenised text values for the Classic data engine. Use this when you want multiple values in one field to be treated and filtered separately.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [text, ].\n\nomit/null = Use the setting as passed through."
              },
              "tokenSeparator": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Set the separator used to split tokenised text values. Leave unset to keep the existing separator.\n\nRelevant when `tokenised` equals `true`; when `delete` equals `false`; when `outputDataType` is in [text, ]."
              },
              "source": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Set a free-text source label for tracking where the field and its data came from.\n\nRequired.",
                "properties": {
                  "set": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Whether to write this metadata field at all. true = write `value` (a null value therefore CLEARS it); false = leave whatever is already there untouched, which is the default. On a NEW field (no inputFieldName) this flag is ignored and `value` is always applied, so an untouched object writes an empty value rather than inheriting one.\n\nRequired."
                  },
                  "value": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The metadata text to write. Applied when set is true, and on a new field always; null with set true is how you clear an existing value.\n\nRelevant when `set` equals `true`."
                  }
                },
                "additionalProperties": false
              },
              "group": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Set a free-text group label to classify related fields together in pickers, filters, and tables.\n\nRequired.",
                "properties": {
                  "set": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Whether to write this metadata field at all. true = write `value` (a null value therefore CLEARS it); false = leave whatever is already there untouched, which is the default. On a NEW field (no inputFieldName) this flag is ignored and `value` is always applied, so an untouched object writes an empty value rather than inheriting one.\n\nRequired."
                  },
                  "value": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The metadata text to write. Applied when set is true, and on a new field always; null with set true is how you clear an existing value.\n\nRelevant when `set` equals `true`."
                  }
                },
                "additionalProperties": false
              },
              "description": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Add a free-text description or notes for the field, including markdown if needed.\n\nRequired.",
                "properties": {
                  "set": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Whether to write this metadata field at all. true = write `value` (a null value therefore CLEARS it); false = leave whatever is already there untouched, which is the default. On a NEW field (no inputFieldName) this flag is ignored and `value` is always applied, so an untouched object writes an empty value rather than inheriting one.\n\nRequired."
                  },
                  "value": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The metadata text to write. Applied when set is true, and on a new field always; null with set true is how you clear an existing value.\n\nRelevant when `set` equals `true`."
                  }
                },
                "additionalProperties": false
              },
              "customSortOrder": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Enter each value in the desired sort order, one per line. Values not listed appear after all ordered values in natural sort order.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [text, ].",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_bulkFieldOrganiser",
        "description": "Options for a `bulkFieldOrganiser` block."
      },
      "BlockOptions_clustering": {
        "type": "object",
        "properties": {
          "allNumericFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Select all numeric fields to use for clustering. Leave unset or false to choose specific fields instead.\n\nRequired."
          },
          "fieldsToUse": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose the fields used to identify clusters.\n\nRelevant when `allNumericFields` equals `false`.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "clusteringMethod": {
            "description": "Choose how the number of clusters is determined. Set Manual to specify the cluster count yourself, or Automatic to let the system choose it.\n\nRequired.\n\nValid values: `automatic`, `manual`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "automatic",
                  "manual"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "numberOfClusters": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the number of clusters to use when the clustering method is Manual. Use a value from 1 to 10.\n\nRelevant when `clusteringMethod` equals `manual`.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "missingValueBehaviour": {
            "description": "Choose how to handle missing values during clustering.\n\nRequired.\n\nValid values: `ignore`, `remove`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "ignore",
                  "remove"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the data is partitioned before clustering.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_clustering",
        "description": "Options for a `clustering` block."
      },
      "BlockOptions_collapseValues": {
        "type": "object",
        "properties": {
          "collapseAllFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Collapse every field into a single combined field. Set this to true to process all fields instead of choosing a subset.\n\nRequired."
          },
          "fields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the fields to collapse when you are not collapsing all fields.\n\nRelevant when `collapseAllFields` equals `false`.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "separator": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the text inserted between collapsed values. Use \\n for a newline."
          },
          "collapsedFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the name of the output field that will contain the collapsed values."
          },
          "skipEmptyValues": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Skip fields with empty values when building the collapsed output.\n\nRequired."
          },
          "deleteCollapsedFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Remove the original fields from the output after collapsing them.\n\nRequired."
          },
          "showFieldNames": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include each field name alongside its value in the collapsed output.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_collapseValues",
        "description": "Options for a `collapseValues` block."
      },
      "BlockOptions_compare": {
        "type": "object",
        "properties": {
          "onMissingField": {
            "description": "Choose how to handle a field that exists in Expected but is not present in Actual. If you tolerate it, any cell checks for that field are skipped.\n\nRequired.\n\nValid values: `error`, `warning`, `none`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "error",
                  "warning",
                  "none"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "onSurplusField": {
            "description": "Choose how to handle a field that appears in Actual but does not exist in Expected. If you tolerate it, cells in that field are not checked.\n\nRequired.\n\nValid values: `error`, `warning`, `none`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "error",
                  "warning",
                  "none"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "onMismatchingFieldDataType": {
            "description": "Choose how to handle a field whose data type differs between Actual and Expected. This applies only to fields present in both sides.\n\nRequired.\n\nValid values: `error`, `warning`, `none`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "error",
                  "warning",
                  "none"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "onMismatchingFieldSettings": {
            "description": "Choose how to handle a field whose settings differ between Actual and Expected, such as decimal places. This applies only to fields present in both sides.\n\nRequired.\n\nValid values: `error`, `warning`, `none`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "error",
                  "warning",
                  "none"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "onMismatchingFieldNameCase": {
            "description": "Choose how to handle fields whose names differ only by upper- or lower-case between Actual and Expected.\n\nRequired.\n\nValid values: `error`, `warning`, `none`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "error",
                  "warning",
                  "none"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "onMismatchingFieldOrder": {
            "description": "Choose how to handle fields whose order differs between Actual and Expected. This applies only to fields present in both sides.\n\nRequired.\n\nValid values: `error`, `warning`, `none`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "error",
                  "warning",
                  "none"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "onMismatchingRecordCount": {
            "description": "Choose how to handle a record count difference between Actual and Expected. If you tolerate it, cells in surplus or missing records are not checked.\n\nRequired.\n\nValid values: `error`, `warning`, `none`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "error",
                  "warning",
                  "none"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "onMismatchingCellValues": {
            "description": "Choose how to handle cells whose values differ between Actual and Expected. This applies only to checked fields and to records present in both sides.\n\nRequired.\n\nValid values: `error`, `warning`, `none`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "error",
                  "warning",
                  "none"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "cellCheckFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select which fields to check cell values for. Leave unset to check the default field set; if missing or surplus fields are tolerated, only fields present in both sides are considered.\n\nRelevant when `onMismatchingCellValues` does not equal `none`.\n\nRequired.",
            "items": {
              "type": "string",
              "description": "Field name from upstream input. Provide one or more field names."
            }
          },
          "ignoreFpRoundingErrors": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Ignore tiny decimal differences caused by floating point rounding. Use this to treat differences below the 15th digit as equal.\n\nRelevant when `onMismatchingCellValues` does not equal `none`.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_compare",
        "description": "Options for a `compare` block."
      },
      "BlockOptions_covarianceMatrix": {
        "type": "object",
        "properties": {
          "allNumericFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Select all numeric fields for the covariance or correlation matrix. Leave unset to choose fields individually.\n\nRequired."
          },
          "fieldsToUse": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose the numeric fields to include in the covariance or correlation matrix. Use this when you do not want all numeric fields selected.\n\nRelevant when `allNumericFields` equals `false`.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "missingValues": {
            "description": "Choose how to handle missing values when building the matrix: use only complete records or calculate each pair from available records.\n\nRequired.\n\nValid values: `fullRecords`, `pairwise`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "fullRecords",
                  "pairwise"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set how to partition the data before calculating the matrix.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_covarianceMatrix",
        "description": "Options for a `covarianceMatrix` block."
      },
      "BlockOptions_currency": {
        "type": "object",
        "properties": {
          "reportType": {
            "description": "Select which Open Exchange Rates report to use. Choose the latest, historical, or currencies report variant that matches the data you want.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "latestExchangeRates"
                  },
                  "baseCurrency": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the base currency for the latest exchange-rate report.\n\nRequired."
                  },
                  "currencies": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Limit the report to specific currencies.\n\nRequired.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "historicalExchangeRates"
                  },
                  "baseCurrency": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the base currency used to calculate the historical exchange rates report.\n\nRequired."
                  },
                  "currencies": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Limit the report to these currencies.\n\nRequired.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "dateRangeOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the date range used for the historical exchange rates report.",
                    "properties": {
                      "rangeType": {
                        "description": "Choose how the date range is defined: a single day, a fixed start and end date, or a relative timeframe.\n\nRequired.\n\nValid values: `singleDay`, `fixedRange`, `timeframe`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "singleDay",
                              "fixedRange",
                              "timeframe"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "date": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the single day to include from the beginning through the end of that day.\n\nRelevant when `rangeType` equals `singleDay`.\n\nRequired.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "startDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive start date for a fixed date range. The range begins at the start of this day.\n\nRelevant when `rangeType` equals `fixedRange`.\n\nRequired.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "endDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive end date for a fixed date range. The range includes this day through the end of the day, and leaves the end open when unset to use today.\n\nRelevant when `rangeType` equals `fixedRange`.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "timeframeAmount": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the numeric size of the relative timeframe, such as 7 days or 3 months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": -2147483648
                      },
                      "timeframePeriod": {
                        "description": "Choose the unit for the relative timeframe, such as seconds, minutes, hours, days, weeks, or months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.\n\nValid values: `second`, `minute`, `hour`, `day`, `week`, `month`, `year`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "second",
                              "minute",
                              "hour",
                              "day",
                              "week",
                              "month",
                              "year"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "allCurrencySymbolsAvailable"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_currency",
        "description": "Options for a `currency` block."
      },
      "BlockOptions_custom": {
        "type": "object",
        "properties": {
          "resourceIntensiveScript": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Run this script exclusively so other operations do not run while it is executing.\n\nRequired."
          },
          "type": {
            "description": "Choose the script type for this block. Use the Python or R options that match the code you want to run.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "python"
                  },
                  "pythonVersion": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Python interpreter version used to run the script.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `HOST_UNRESTRICTED`."
                  },
                  "dockerOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure container settings for running the Python block in Docker. Leave unset to use the default execution environment.",
                    "properties": {
                      "customSystemPackages": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "List Debian or Ubuntu package names to install in the Docker container with apt. Set this only when the custom execution image is based on Debian or Ubuntu and needs extra system packages.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "useCustomBaseImage": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Enable this to run the block in your own Docker image instead of a bundled Visokio image.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      },
                      "baseImage": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the Docker image name to use as the custom base image, from a local registry or a private or public registry.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "installOmniscopeApiLibraries": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Install the Omniscope API libraries into the custom image before running the block. Enable this when your custom image does not already include them.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "pythonScript": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Provide the Python code to execute for this block.\n\nRequired."
                  },
                  "dependencies": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "List the Python packages this script needs, separated by spaces or new lines. Use standard version specifiers such as pandas>=0.25.1 or pandas==0.24.2."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "r"
                  },
                  "rVersion": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the R version or executable to run this script with. Use the default environment when this is left unset.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `HOST_UNRESTRICTED`."
                  },
                  "dockerOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure Docker-based execution settings for this R block. Leave unset to use the default execution environment.",
                    "properties": {
                      "customSystemPackages": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "List Debian or Ubuntu package names to install in the Docker container with apt. Set this only when the custom execution image is based on Debian or Ubuntu and needs extra system packages.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "useCustomBaseImage": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Enable this to run the block in your own Docker image instead of a bundled Visokio image.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      },
                      "baseImage": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the Docker image name to use as the custom base image, from a local registry or a private or public registry.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "installOmniscopeApiLibraries": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Install the Omniscope API libraries into the custom image before running the block. Enable this when your custom image does not already include them.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "scriptBody": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the R script to run.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "showPartitioning": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable partitioning so users can split execution by partitions. Use this only when the number and type of output fields never depend on the input data.\n\nRequired."
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the block partitions its execution. Set this only when partitioning is enabled.\n\nRelevant when `showPartitioning` equals `true`.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          },
          "customOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "The block's own options: `customOptions` declares them (name, type, title), `values` sets them - an object keyed by option name. A name in `values` must match one declared in `customOptions`.\n\nSet additional custom block options.\n\nRequired.",
            "properties": {
              "customOptions": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Define the list of custom option items to include in this block.",
                "items": {
                  "type": "object",
                  "properties": {
                    "optionType": {
                      "description": "Select the kind of custom option to configure. Choose the variant that matches the input the block should accept.\n\nRequired.",
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "text"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required so users must provide a value.\n\nRequired."
                            },
                            "multiline": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Allow the text value to span multiple lines instead of a single line.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title in the Options tab."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the options UI."
                            },
                            "optionWidth": {
                              "description": "Choose the rendered width of the option field in the UI.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "password"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required in the Options tab.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the display width of the option in the form.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "choice"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required before the user can continue.\n\nRequired."
                            },
                            "dropdown": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Enable a dropdown-style choice control for this option.\n\nRequired."
                            },
                            "layout": {
                              "description": "Choose how the available choices are laid out in the UI.\n\nRequired.\n\nValid values: `auto`, `list`, `compact`, `multiColumn`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "auto",
                                    "list",
                                    "compact",
                                    "multiColumn"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Show this text as a tooltip next to the option title."
                            },
                            "choices": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Define the list of selectable choices for this option.\n\nRequired.",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "value": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the option value shown to users and used internally for this choice.\n\nRequired."
                                  },
                                  "title": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the display title for this choice.\n\nRequired."
                                  },
                                  "description": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the descriptive text for this choice."
                                  },
                                  "tooltip": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the tooltip text shown for this choice."
                                  },
                                  "special": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Mark this choice as special so it can be treated differently by the picker or UI.\n\nRequired."
                                  },
                                  "groupTitle": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the group heading used to cluster this choice with related options."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the UI."
                            },
                            "optionWidth": {
                              "description": "Choose how wide the option should appear in the form.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "integer"
                            },
                            "minimumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the minimum allowed value for this integer option."
                            },
                            "maximumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the maximum allowed value for this integer option."
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Require the option to be filled in.\n\nRequired."
                            },
                            "showAsSlider": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Show this integer option as a slider in the UI. Set it when you want users to pick a value by dragging within the configured range.\n\nRelevant when `minimumValue` is non-empty; when `maximumValue` is non-empty.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group heading used to organize related options."
                            },
                            "optionWidth": {
                              "description": "Choose the option width used when rendering this field. Select one of Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "decimal"
                            },
                            "minimumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the minimum allowed decimal value for this option. Leave unset to allow any lower bound."
                            },
                            "maximumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the maximum allowed decimal value for this option. Leave unset to allow any upper bound."
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Require a value for this option. Turn it on when the option must always be filled in.\n\nRequired."
                            },
                            "showAsSlider": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Display the option as a slider instead of a plain numeric input. Set this only when both minimum and maximum values are defined.\n\nRelevant when `minimumValue` is non-empty; when `maximumValue` is non-empty.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Show this text as the option tooltip next to the title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group."
                            },
                            "optionWidth": {
                              "description": "Choose how wide the option appears in the UI.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "boolean"
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the displayed width for the option. Select from Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "field"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required.\n\nRequired."
                            },
                            "inputIndex": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Select which connected input block this option reads fields from, starting at 1 for the first input.\n\nRequired.",
                              "maximum": 2147483647,
                              "minimum": 0
                            },
                            "fieldTypes": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Choose which field types this option accepts: Integer, Decimal, Text, or Date.\n\nValid values: `integer`, `decimal`, `text`, `date`.",
                              "items": {
                                "type": "string",
                                "enum": [
                                  "integer",
                                  "decimal",
                                  "text",
                                  "date"
                                ]
                              }
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the width used to display the option in the editor.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "fields"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required in the block's options panel.\n\nRequired."
                            },
                            "inputIndex": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Choose which connected input block supplies the selectable fields. Use 1 for the first input, 2 for the second, and so on.\n\nRequired.",
                              "maximum": 2147483647,
                              "minimum": 0
                            },
                            "fieldTypes": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Select which field types are allowed to be chosen for this option: Integer, Decimal, Text, or Date.\n\nValid values: `integer`, `decimal`, `text`, `date`.",
                              "items": {
                                "type": "string",
                                "enum": [
                                  "integer",
                                  "decimal",
                                  "text",
                                  "date"
                                ]
                              }
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the UI."
                            },
                            "width": {
                              "description": "Set the display width for this option: Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "file"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required so users must provide a value.\n\nRequired."
                            },
                            "readOnly": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Make this option read only in the Docker execution environment so users cannot edit it.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title of the group this option appears under."
                            },
                            "optionWidth": {
                              "description": "Choose the display width of the option in the editor: Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "additionalProperties": false
                }
              },
              "values": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Values by option name, e.g. {\"threshold\": 0.5, \"label\": \"hello\"}. Each name must be declared in `customOptions`.",
                "additionalProperties": true
              }
            },
            "additionalProperties": false
          },
          "blockOutputs": {
            "type": [
              "array",
              "null"
            ],
            "description": "Define the block outputs exposed by this script. A script can also write to an output by its position in this list, with omniscope_api.write_output_records(output_data, output_number=0) in Python (zero-based) or write.output.records(omni.api, output.data, output.number=1) in R (one-based).",
            "items": {
              "type": "object",
              "properties": {
                "outputId": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the unique connector id for this output; it must be unique within the block. A script writes to this output by id with omniscope_api.write_output(output_data, \"my_output\") in Python or write.output(omni.api, output.data, \"my_output\") in R.\n\nRequired."
                },
                "displayName": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the full output name shown in the data tab."
                },
                "label": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the label shown on the block connector.\n\nRequired."
                },
                "description": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the connector description shown in the tooltip and preview table. Leave unset if no explanation is needed."
                }
              },
              "additionalProperties": false
            }
          },
          "iconUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the block icon URL, preferably as Base64 data."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Provide a short description of the block's functionality."
          },
          "category": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the category keyword used to group the block in the palette."
          },
          "subcategory": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set a sub-category keyword to further group the block in the palette."
          },
          "tags": {
            "type": [
              "array",
              "null"
            ],
            "description": "Add tags used to find the block in the block palette.",
            "items": {
              "type": "string"
            }
          },
          "introductoryText": {
            "type": [
              "string",
              "null"
            ],
            "description": "Provide introductory text for the block."
          },
          "apiMode": {
            "description": "Choose whether the block runs in batch mode or streaming mode.\n\nRequired.\n\nValid values: `batch`, `streamTransform`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "batch",
                  "streamTransform"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "preserveFieldSettingsByName": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Copy field settings from the first connected input to all outputs for fields with the same name.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_custom",
        "description": "Options for a `custom` block."
      },
      "BlockOptions_customOrder": {
        "type": "object",
        "properties": {
          "fieldToOrder": {
            "type": [
              "string",
              "null"
            ],
            "description": "Choose the field whose values should receive the order from the second input. Use a field of the same kind of value as the order field; the chosen order travels with this field downstream so later sorts, groupings, and report views can reuse it.\n\nRequired.\n\nField name from input 0."
          },
          "orderField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Choose the field that supplies the required order. Row 1 sorts first, row 2 second, and so on; repeated values are ignored after their first occurrence, and values not listed sort after all listed values in their natural order.\n\nRequired.\n\nField name from input 1."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_customOrder",
        "description": "Options for a `customOrder` block."
      },
      "BlockOptions_custom_customPythonScript": {
        "type": "object",
        "properties": {
          "resourceIntensiveScript": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Run this script exclusively so other operations do not run while it is executing.\n\nRequired."
          },
          "type": {
            "description": "Choose the script type for this block. Use the Python or R options that match the code you want to run.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "python"
                  },
                  "pythonVersion": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Python interpreter version used to run the script.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `HOST_UNRESTRICTED`."
                  },
                  "dockerOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure container settings for running the Python block in Docker. Leave unset to use the default execution environment.",
                    "properties": {
                      "customSystemPackages": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "List Debian or Ubuntu package names to install in the Docker container with apt. Set this only when the custom execution image is based on Debian or Ubuntu and needs extra system packages.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "useCustomBaseImage": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Enable this to run the block in your own Docker image instead of a bundled Visokio image.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      },
                      "baseImage": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the Docker image name to use as the custom base image, from a local registry or a private or public registry.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "installOmniscopeApiLibraries": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Install the Omniscope API libraries into the custom image before running the block. Enable this when your custom image does not already include them.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "pythonScript": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Provide the Python code to execute for this block.\n\nRequired."
                  },
                  "dependencies": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "List the Python packages this script needs, separated by spaces or new lines. Use standard version specifiers such as pandas>=0.25.1 or pandas==0.24.2."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "r"
                  },
                  "rVersion": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the R version or executable to run this script with. Use the default environment when this is left unset.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `HOST_UNRESTRICTED`."
                  },
                  "dockerOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure Docker-based execution settings for this R block. Leave unset to use the default execution environment.",
                    "properties": {
                      "customSystemPackages": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "List Debian or Ubuntu package names to install in the Docker container with apt. Set this only when the custom execution image is based on Debian or Ubuntu and needs extra system packages.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "useCustomBaseImage": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Enable this to run the block in your own Docker image instead of a bundled Visokio image.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      },
                      "baseImage": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the Docker image name to use as the custom base image, from a local registry or a private or public registry.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "installOmniscopeApiLibraries": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Install the Omniscope API libraries into the custom image before running the block. Enable this when your custom image does not already include them.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "scriptBody": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the R script to run.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "showPartitioning": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable partitioning so users can split execution by partitions. Use this only when the number and type of output fields never depend on the input data.\n\nRequired."
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the block partitions its execution. Set this only when partitioning is enabled.\n\nRelevant when `showPartitioning` equals `true`.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          },
          "customOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "The block's own options: `customOptions` declares them (name, type, title), `values` sets them - an object keyed by option name. A name in `values` must match one declared in `customOptions`.\n\nSet additional custom block options.\n\nRequired.",
            "properties": {
              "customOptions": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Define the list of custom option items to include in this block.",
                "items": {
                  "type": "object",
                  "properties": {
                    "optionType": {
                      "description": "Select the kind of custom option to configure. Choose the variant that matches the input the block should accept.\n\nRequired.",
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "text"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required so users must provide a value.\n\nRequired."
                            },
                            "multiline": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Allow the text value to span multiple lines instead of a single line.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title in the Options tab."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the options UI."
                            },
                            "optionWidth": {
                              "description": "Choose the rendered width of the option field in the UI.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "password"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required in the Options tab.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the display width of the option in the form.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "choice"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required before the user can continue.\n\nRequired."
                            },
                            "dropdown": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Enable a dropdown-style choice control for this option.\n\nRequired."
                            },
                            "layout": {
                              "description": "Choose how the available choices are laid out in the UI.\n\nRequired.\n\nValid values: `auto`, `list`, `compact`, `multiColumn`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "auto",
                                    "list",
                                    "compact",
                                    "multiColumn"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Show this text as a tooltip next to the option title."
                            },
                            "choices": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Define the list of selectable choices for this option.\n\nRequired.",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "value": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the option value shown to users and used internally for this choice.\n\nRequired."
                                  },
                                  "title": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the display title for this choice.\n\nRequired."
                                  },
                                  "description": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the descriptive text for this choice."
                                  },
                                  "tooltip": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the tooltip text shown for this choice."
                                  },
                                  "special": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Mark this choice as special so it can be treated differently by the picker or UI.\n\nRequired."
                                  },
                                  "groupTitle": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the group heading used to cluster this choice with related options."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the UI."
                            },
                            "optionWidth": {
                              "description": "Choose how wide the option should appear in the form.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "integer"
                            },
                            "minimumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the minimum allowed value for this integer option."
                            },
                            "maximumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the maximum allowed value for this integer option."
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Require the option to be filled in.\n\nRequired."
                            },
                            "showAsSlider": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Show this integer option as a slider in the UI. Set it when you want users to pick a value by dragging within the configured range.\n\nRelevant when `minimumValue` is non-empty; when `maximumValue` is non-empty.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group heading used to organize related options."
                            },
                            "optionWidth": {
                              "description": "Choose the option width used when rendering this field. Select one of Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "decimal"
                            },
                            "minimumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the minimum allowed decimal value for this option. Leave unset to allow any lower bound."
                            },
                            "maximumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the maximum allowed decimal value for this option. Leave unset to allow any upper bound."
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Require a value for this option. Turn it on when the option must always be filled in.\n\nRequired."
                            },
                            "showAsSlider": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Display the option as a slider instead of a plain numeric input. Set this only when both minimum and maximum values are defined.\n\nRelevant when `minimumValue` is non-empty; when `maximumValue` is non-empty.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Show this text as the option tooltip next to the title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group."
                            },
                            "optionWidth": {
                              "description": "Choose how wide the option appears in the UI.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "boolean"
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the displayed width for the option. Select from Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "field"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required.\n\nRequired."
                            },
                            "inputIndex": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Select which connected input block this option reads fields from, starting at 1 for the first input.\n\nRequired.",
                              "maximum": 2147483647,
                              "minimum": 0
                            },
                            "fieldTypes": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Choose which field types this option accepts: Integer, Decimal, Text, or Date.\n\nValid values: `integer`, `decimal`, `text`, `date`.",
                              "items": {
                                "type": "string",
                                "enum": [
                                  "integer",
                                  "decimal",
                                  "text",
                                  "date"
                                ]
                              }
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the width used to display the option in the editor.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "fields"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required in the block's options panel.\n\nRequired."
                            },
                            "inputIndex": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Choose which connected input block supplies the selectable fields. Use 1 for the first input, 2 for the second, and so on.\n\nRequired.",
                              "maximum": 2147483647,
                              "minimum": 0
                            },
                            "fieldTypes": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Select which field types are allowed to be chosen for this option: Integer, Decimal, Text, or Date.\n\nValid values: `integer`, `decimal`, `text`, `date`.",
                              "items": {
                                "type": "string",
                                "enum": [
                                  "integer",
                                  "decimal",
                                  "text",
                                  "date"
                                ]
                              }
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the UI."
                            },
                            "width": {
                              "description": "Set the display width for this option: Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "file"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required so users must provide a value.\n\nRequired."
                            },
                            "readOnly": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Make this option read only in the Docker execution environment so users cannot edit it.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title of the group this option appears under."
                            },
                            "optionWidth": {
                              "description": "Choose the display width of the option in the editor: Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "additionalProperties": false
                }
              },
              "values": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Values by option name, e.g. {\"threshold\": 0.5, \"label\": \"hello\"}. Each name must be declared in `customOptions`.",
                "additionalProperties": true
              }
            },
            "additionalProperties": false
          },
          "blockOutputs": {
            "type": [
              "array",
              "null"
            ],
            "description": "Define the block outputs exposed by this script. A script can also write to an output by its position in this list, with omniscope_api.write_output_records(output_data, output_number=0) in Python (zero-based) or write.output.records(omni.api, output.data, output.number=1) in R (one-based).",
            "items": {
              "type": "object",
              "properties": {
                "outputId": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the unique connector id for this output; it must be unique within the block. A script writes to this output by id with omniscope_api.write_output(output_data, \"my_output\") in Python or write.output(omni.api, output.data, \"my_output\") in R.\n\nRequired."
                },
                "displayName": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the full output name shown in the data tab."
                },
                "label": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the label shown on the block connector.\n\nRequired."
                },
                "description": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the connector description shown in the tooltip and preview table. Leave unset if no explanation is needed."
                }
              },
              "additionalProperties": false
            }
          },
          "iconUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the block icon URL, preferably as Base64 data."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Provide a short description of the block's functionality."
          },
          "category": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the category keyword used to group the block in the palette."
          },
          "subcategory": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set a sub-category keyword to further group the block in the palette."
          },
          "tags": {
            "type": [
              "array",
              "null"
            ],
            "description": "Add tags used to find the block in the block palette.",
            "items": {
              "type": "string"
            }
          },
          "introductoryText": {
            "type": [
              "string",
              "null"
            ],
            "description": "Provide introductory text for the block."
          },
          "apiMode": {
            "description": "Choose whether the block runs in batch mode or streaming mode.\n\nRequired.\n\nValid values: `batch`, `streamTransform`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "batch",
                  "streamTransform"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "preserveFieldSettingsByName": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Copy field settings from the first connected input to all outputs for fields with the same name.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_custom_customPythonScript",
        "description": "Options for a `custom:customPythonScript` block."
      },
      "BlockOptions_custom_customRScript": {
        "type": "object",
        "properties": {
          "resourceIntensiveScript": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Run this script exclusively so other operations do not run while it is executing.\n\nRequired."
          },
          "type": {
            "description": "Choose the script type for this block. Use the Python or R options that match the code you want to run.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "python"
                  },
                  "pythonVersion": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Python interpreter version used to run the script.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `HOST_UNRESTRICTED`."
                  },
                  "dockerOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure container settings for running the Python block in Docker. Leave unset to use the default execution environment.",
                    "properties": {
                      "customSystemPackages": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "List Debian or Ubuntu package names to install in the Docker container with apt. Set this only when the custom execution image is based on Debian or Ubuntu and needs extra system packages.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "useCustomBaseImage": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Enable this to run the block in your own Docker image instead of a bundled Visokio image.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      },
                      "baseImage": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the Docker image name to use as the custom base image, from a local registry or a private or public registry.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "installOmniscopeApiLibraries": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Install the Omniscope API libraries into the custom image before running the block. Enable this when your custom image does not already include them.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "pythonScript": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Provide the Python code to execute for this block.\n\nRequired."
                  },
                  "dependencies": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "List the Python packages this script needs, separated by spaces or new lines. Use standard version specifiers such as pandas>=0.25.1 or pandas==0.24.2."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "r"
                  },
                  "rVersion": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the R version or executable to run this script with. Use the default environment when this is left unset.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `HOST_UNRESTRICTED`."
                  },
                  "dockerOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure Docker-based execution settings for this R block. Leave unset to use the default execution environment.",
                    "properties": {
                      "customSystemPackages": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "List Debian or Ubuntu package names to install in the Docker container with apt. Set this only when the custom execution image is based on Debian or Ubuntu and needs extra system packages.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "useCustomBaseImage": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Enable this to run the block in your own Docker image instead of a bundled Visokio image.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      },
                      "baseImage": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the Docker image name to use as the custom base image, from a local registry or a private or public registry.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`."
                      },
                      "installOmniscopeApiLibraries": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Install the Omniscope API libraries into the custom image before running the block. Enable this when your custom image does not already include them.\n\nRelevant when `useCustomBaseImage` equals `true`; when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "scriptBody": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the R script to run.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "showPartitioning": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable partitioning so users can split execution by partitions. Use this only when the number and type of output fields never depend on the input data.\n\nRequired."
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the block partitions its execution. Set this only when partitioning is enabled.\n\nRelevant when `showPartitioning` equals `true`.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          },
          "customOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "The block's own options: `customOptions` declares them (name, type, title), `values` sets them - an object keyed by option name. A name in `values` must match one declared in `customOptions`.\n\nSet additional custom block options.\n\nRequired.",
            "properties": {
              "customOptions": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Define the list of custom option items to include in this block.",
                "items": {
                  "type": "object",
                  "properties": {
                    "optionType": {
                      "description": "Select the kind of custom option to configure. Choose the variant that matches the input the block should accept.\n\nRequired.",
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "text"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required so users must provide a value.\n\nRequired."
                            },
                            "multiline": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Allow the text value to span multiple lines instead of a single line.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title in the Options tab."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the options UI."
                            },
                            "optionWidth": {
                              "description": "Choose the rendered width of the option field in the UI.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "password"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required in the Options tab.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the display width of the option in the form.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "choice"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required before the user can continue.\n\nRequired."
                            },
                            "dropdown": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Enable a dropdown-style choice control for this option.\n\nRequired."
                            },
                            "layout": {
                              "description": "Choose how the available choices are laid out in the UI.\n\nRequired.\n\nValid values: `auto`, `list`, `compact`, `multiColumn`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "auto",
                                    "list",
                                    "compact",
                                    "multiColumn"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Show this text as a tooltip next to the option title."
                            },
                            "choices": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Define the list of selectable choices for this option.\n\nRequired.",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "value": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the option value shown to users and used internally for this choice.\n\nRequired."
                                  },
                                  "title": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the display title for this choice.\n\nRequired."
                                  },
                                  "description": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the descriptive text for this choice."
                                  },
                                  "tooltip": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the tooltip text shown for this choice."
                                  },
                                  "special": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Mark this choice as special so it can be treated differently by the picker or UI.\n\nRequired."
                                  },
                                  "groupTitle": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the group heading used to cluster this choice with related options."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the UI."
                            },
                            "optionWidth": {
                              "description": "Choose how wide the option should appear in the form.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "integer"
                            },
                            "minimumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the minimum allowed value for this integer option."
                            },
                            "maximumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the maximum allowed value for this integer option."
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Require the option to be filled in.\n\nRequired."
                            },
                            "showAsSlider": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Show this integer option as a slider in the UI. Set it when you want users to pick a value by dragging within the configured range.\n\nRelevant when `minimumValue` is non-empty; when `maximumValue` is non-empty.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group heading used to organize related options."
                            },
                            "optionWidth": {
                              "description": "Choose the option width used when rendering this field. Select one of Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "decimal"
                            },
                            "minimumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the minimum allowed decimal value for this option. Leave unset to allow any lower bound."
                            },
                            "maximumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the maximum allowed decimal value for this option. Leave unset to allow any upper bound."
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Require a value for this option. Turn it on when the option must always be filled in.\n\nRequired."
                            },
                            "showAsSlider": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Display the option as a slider instead of a plain numeric input. Set this only when both minimum and maximum values are defined.\n\nRelevant when `minimumValue` is non-empty; when `maximumValue` is non-empty.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Show this text as the option tooltip next to the title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group."
                            },
                            "optionWidth": {
                              "description": "Choose how wide the option appears in the UI.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "boolean"
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the displayed width for the option. Select from Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "field"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required.\n\nRequired."
                            },
                            "inputIndex": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Select which connected input block this option reads fields from, starting at 1 for the first input.\n\nRequired.",
                              "maximum": 2147483647,
                              "minimum": 0
                            },
                            "fieldTypes": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Choose which field types this option accepts: Integer, Decimal, Text, or Date.\n\nValid values: `integer`, `decimal`, `text`, `date`.",
                              "items": {
                                "type": "string",
                                "enum": [
                                  "integer",
                                  "decimal",
                                  "text",
                                  "date"
                                ]
                              }
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the width used to display the option in the editor.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "fields"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required in the block's options panel.\n\nRequired."
                            },
                            "inputIndex": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Choose which connected input block supplies the selectable fields. Use 1 for the first input, 2 for the second, and so on.\n\nRequired.",
                              "maximum": 2147483647,
                              "minimum": 0
                            },
                            "fieldTypes": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Select which field types are allowed to be chosen for this option: Integer, Decimal, Text, or Date.\n\nValid values: `integer`, `decimal`, `text`, `date`.",
                              "items": {
                                "type": "string",
                                "enum": [
                                  "integer",
                                  "decimal",
                                  "text",
                                  "date"
                                ]
                              }
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the UI."
                            },
                            "width": {
                              "description": "Set the display width for this option: Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "file"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required so users must provide a value.\n\nRequired."
                            },
                            "readOnly": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Make this option read only in the Docker execution environment so users cannot edit it.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title of the group this option appears under."
                            },
                            "optionWidth": {
                              "description": "Choose the display width of the option in the editor: Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "additionalProperties": false
                }
              },
              "values": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Values by option name, e.g. {\"threshold\": 0.5, \"label\": \"hello\"}. Each name must be declared in `customOptions`.",
                "additionalProperties": true
              }
            },
            "additionalProperties": false
          },
          "blockOutputs": {
            "type": [
              "array",
              "null"
            ],
            "description": "Define the block outputs exposed by this script. A script can also write to an output by its position in this list, with omniscope_api.write_output_records(output_data, output_number=0) in Python (zero-based) or write.output.records(omni.api, output.data, output.number=1) in R (one-based).",
            "items": {
              "type": "object",
              "properties": {
                "outputId": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the unique connector id for this output; it must be unique within the block. A script writes to this output by id with omniscope_api.write_output(output_data, \"my_output\") in Python or write.output(omni.api, output.data, \"my_output\") in R.\n\nRequired."
                },
                "displayName": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the full output name shown in the data tab."
                },
                "label": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the label shown on the block connector.\n\nRequired."
                },
                "description": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the connector description shown in the tooltip and preview table. Leave unset if no explanation is needed."
                }
              },
              "additionalProperties": false
            }
          },
          "iconUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the block icon URL, preferably as Base64 data."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Provide a short description of the block's functionality."
          },
          "category": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the category keyword used to group the block in the palette."
          },
          "subcategory": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set a sub-category keyword to further group the block in the palette."
          },
          "tags": {
            "type": [
              "array",
              "null"
            ],
            "description": "Add tags used to find the block in the block palette.",
            "items": {
              "type": "string"
            }
          },
          "introductoryText": {
            "type": [
              "string",
              "null"
            ],
            "description": "Provide introductory text for the block."
          },
          "apiMode": {
            "description": "Choose whether the block runs in batch mode or streaming mode.\n\nRequired.\n\nValid values: `batch`, `streamTransform`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "batch",
                  "streamTransform"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "preserveFieldSettingsByName": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Copy field settings from the first connected input to all outputs for fields with the same name.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_custom_customRScript",
        "description": "Options for a `custom:customRScript` block."
      },
      "BlockOptions_dataTable": {
        "type": "object",
        "properties": {
          "editable": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Allow users and API callers to edit data through the Data tab, Report Table View, and API. Leave unset to keep the block read-only and treat it as a refillable snapshot.\n\nRequired."
          },
          "queryingAndPersistence": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the data table is queried and persisted. Set nested options here to control table loading, storage, and related behavior.\n\nRequired.",
            "properties": {
              "persisted": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Save the block's associated data on disk so it is preserved after restarts. Leave unset to keep the data in memory only and lose it when the app restarts or the project is unloaded.\n\nRequired."
              }
            },
            "additionalProperties": false
          },
          "refillBehaviour": {
            "description": "Choose how a refill or refresh from source updates existing data: replace the table, append all incoming records, append only new records by key, or append only rows with higher field values.\n\nRequired.\n\nValid values: `replaceExistingData`, `appendRows`, `appendNewByRecordKey`, `appendByIncrementalField`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "replaceExistingData",
                  "appendRows",
                  "appendNewByRecordKey",
                  "appendByIncrementalField"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "recordKeyFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the field or fields that uniquely identify a record when appending only new records by key.\n\nRelevant when `refillBehaviour` equals `appendNewByRecordKey`.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "incrementalKeyField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the field used for incremental comparison when appending only rows with higher values. Only rows with a value greater than the current maximum are appended.\n\nRelevant when `refillBehaviour` equals `appendByIncrementalField`.\n\nRequired.\n\nField name from input 0."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_dataTable",
        "description": "Options for a `dataTable` block."
      },
      "BlockOptions_database": {
        "type": "object",
        "properties": {
          "queryType": {
            "description": "Choose whether this block reads a whole table or uses a custom SQL query. Defaults to Table.\n\nRelevant when `connect` equals `true`.\n\nRequired.\n\nValid values: `table`, `custom`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "table",
                  "custom"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "customSql": {
            "type": [
              "string",
              "null"
            ],
            "description": "Enter the SQL query to run when Query type is Custom SQL.\n\nRelevant when `queryType` equals `custom`; when `connect` equals `true`.\n\nRequired."
          },
          "confirmSql": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `customSql` changes.\n\nConfirm that the custom SQL is correct before executing it. Defaults to false.\n\nRelevant when `queryType` equals `custom`; when `connect` equals `true`.\n\nRequired."
          },
          "previewType": {
            "description": "Choose how much preview data to fetch after setup. Defaults to First rows.\n\nRelevant when `connect` equals `true`.\n\nRequired.\n\nValid values: `firstRows`, `schemaOnly`, `none`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "firstRows",
                  "schemaOnly",
                  "none"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "evaluateRecordCount": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Fetch the table row count before streaming data. Defaults to false.\n\nRelevant when `connect` equals `true`.\n\nRequired."
          },
          "autoCorrectFieldNameCase": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Convert column names into a more readable case. Defaults to true.\n\nRelevant when `connect` equals `true`.\n\nRequired."
          },
          "databaseConnection": {
            "description": "Select the database connection settings to use.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "actianAvalanche"
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the database port to connect to.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the database host name or address.\n\nRequired."
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and related login details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor so the query can jump back in the result set. Leave unset to use the default forward-only mode.\n\nRequired."
                  },
                  "additionalParams": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as name-value pairs.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "actianVector"
                  },
                  "port": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the port used to connect to the database server.\n\nRequired."
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the database server host name or address.\n\nRequired."
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the connection credentials and related authentication details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable this to use a scrollable cursor for queries instead of forward-only mode. Turn it on when the workflow needs to move back and forth through query results.\n\nRequired."
                  },
                  "additionalParams": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra connection parameters for the database connection.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "actianXIngres"
                  },
                  "port": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the database server port to connect to.\n\nRequired."
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the database server host name or address.\n\nRequired."
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and related login details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor to allow random access in query results. Leave unset to use forward-only queries for best compatibility and performance.\n\nRequired."
                  },
                  "additionalParams": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as name-value pairs.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonRedshift"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the Redshift cluster host from the endpoint shown in AWS console. Use the hostname portion only, without the port or database path.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the Redshift port from the cluster endpoint shown in AWS console. Use the numeric port, typically 5439.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the Redshift database name from the cluster endpoint shown in AWS console. Use the database segment at the end of the endpoint path.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection authentication details here, such as credentials or other password-related settings.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable this to query with a scrollable cursor so the result set can be navigated randomly. Leave unset to use the default forward-only mode.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters here when the connection needs non-default driver settings.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "clickhouse"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the ClickHouse server host name or address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the server port to connect to. Use 8443 for the HTTPS default port or 8123 for the HTTP default port.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "ssl": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable SSL/TLS for the connection.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Provide the connection credentials and related authentication settings.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "scrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use a scrollable cursor instead of forward-only querying to support random access in query results.\n\nRequired."
                  },
                  "additionalParams": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as key-value items.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "mariadb"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the MariaDB server host name or address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the MariaDB server port.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and authentication details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor instead of forward-only querying to allow random access to query results.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "microsoftAccess"
                  },
                  "location": {
                    "description": "Choose where the Access database is located: either a local file or a URL-based location.\n\nRequired.\n\nAllowed file types: .accdb, .accde, .mdb, .mde. To browse for a matching file, call `list_files({ forBlock: \"<this block>\", forOption: \"databaseConnection.location\" })` (use forType instead of forBlock for a not-yet-added block) - the listing is then auto-restricted to these types, so you do not need to pass the extensions yourself.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "fileInOmniscope"
                          },
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "urlHttpFtp"
                          },
                          "url": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                          },
                          "authentication": {
                            "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "none"
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "basic"
                                  },
                                  "passwordConnectionOptions": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Enter the username to use for this connection."
                                      },
                                      "password": {
                                        "type": [
                                          "object",
                                          "null"
                                        ],
                                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                        "properties": {
                                          "secretUpdate": {
                                            "type": [
                                              "string",
                                              "null"
                                            ],
                                            "description": "The new secret. null leaves the stored one alone."
                                          }
                                        },
                                        "additionalProperties": false
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "bearerToken"
                                  },
                                  "bearerToken": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "oauth2ClientFlow"
                                  },
                                  "tokenEndpointUrl": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                                  },
                                  "clientId": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                                  },
                                  "clientSecret": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  },
                                  "useStandardFlow": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                                  },
                                  "addBasicAuthHeader": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                                  },
                                  "addClientCredentialParams": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                                  },
                                  "requestHeaders": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom headers to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  },
                                  "requestParams": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom parameters to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the credentials and other connection details needed to open the Access database.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "scrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable this to use a scrollable cursor for the query, allowing random access back through the result set. Leave unset to use the default forward-only mode.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as name-value pairs for the Access connection.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "microsoftSqlServerAzureSql"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the server host name or address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the TCP port for the database server.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "instanceName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the SQL Server instance name when connecting to a named instance."
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the database name to connect to."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and related connection details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable scrollable-cursor querying instead of forward-only mode to allow jumping back in query results.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add optional JDBC connection parameters to append to the connection string.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "microsoftSqlServerLegacy"
                  },
                  "driver": {
                    "description": "Select the SQL Server driver to use for the connection.\n\nRequired.\n\nValid values: `sqlServer2008`, `sqlServer2005`, `sqlServer2000`, `jtdsJdbc`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sqlServer2008",
                          "sqlServer2005",
                          "sqlServer2000",
                          "jtdsJdbc"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the SQL Server host name or address.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Enter the TCP port for the SQL Server instance.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "instanceName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the named SQL Server instance to connect to."
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the database name to connect to."
                  },
                  "authentication": {
                    "description": "Select the authentication method to use for the connection.\n\nRequired.\n\nValid values: `windows`, `sqlServer`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "windows",
                          "sqlServer"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Provide the connection credentials and related password settings.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable scrollable cursor mode to allow random access within query results.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "monetdb"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the MonetDB server host name or IP address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the MonetDB server port number to connect to.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the MonetDB database name to use for the connection.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and related login details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor instead of forward-only query results. Use this when the workflow needs to jump back in the returned rows.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as key-value items.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "mysql"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the MySQL server host name or address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the MySQL server port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the connection credentials and related login details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor instead of the default forward-only query mode to support jumping back through result rows.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters for the MySQL connection.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "oracle"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the Oracle server host name or address.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Enter the TCP port used to connect to the Oracle server.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "sid": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the Oracle SID when connecting with an SID-based connection string. Leave unset if you are using a service name instead."
                  },
                  "serviceName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the Oracle service name when connecting with a service-name-based connection string. Leave unset if you are using an SID instead."
                  },
                  "connectAs": {
                    "description": "Choose whether to connect normally or with SYSDBA privileges.\n\nRequired.\n\nValid values: `normal`, `sysdba`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "normal",
                          "sysdba"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the connection credentials and related login details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "scrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor to support random access in query results. Leave unset to use the default forward-only mode for best compatibility and performance.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters to pass through to the Oracle connection.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "postgresql"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the PostgreSQL server host name or address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the TCP port for the PostgreSQL server.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and related login details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable scrollable cursor mode to allow random access within query results. Leave unset to use the default forward-only mode for best compatibility and performance.\n\nRequired."
                  },
                  "additionalParams": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as name-value pairs.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "snowflake"
                  },
                  "accountIdentifier": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the Snowflake account identifier that uniquely identifies your account.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and related password settings for this Snowflake connection.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "scrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor instead of forward-only query execution to allow random access in result sets.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add optional advanced JDBC connection parameters to pass through to the Snowflake connection.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sqlite"
                  },
                  "locationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the file location details for the SQLite database connection. Use this to point the connector at the database file or related local path settings.\n\nRequired.\n\nAllowed file types: .sqlite, .sqlite3, .db. To browse for a matching file, call `list_files({ forBlock: \"<this block>\", forOption: \"databaseConnection.locationOptions\" })` (use forType instead of forBlock for a not-yet-added block) - the listing is then auto-restricted to these types, so you do not need to pass the extensions yourself.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the connection credentials and related access details. Use this when the database file or environment requires a password.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor instead of forward-only querying. Turn this on when the query results need random access or moving back through rows.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra connection parameters for the SQLite JDBC connection. Use this for advanced driver options not covered by the other fields.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sybase10111215"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the Sybase server host name or IP address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Enter the network port the Sybase server listens on.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the target Sybase database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the connection credentials and related authentication details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "scrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use a scrollable cursor instead of forward-only querying to allow random access in the result set. Leave unset to use the default forward-only mode.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as key-value entries.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "vertica"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Specify the Vertica server host name or address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Specify the TCP port for the Vertica server.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Specify the Vertica database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the connection credentials and related authentication details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor instead of the default forward-only query mode. Use this when you need random access to query results.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters for the Vertica connection.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "otherDatabasesViaJdbc"
                  },
                  "driverJarLocation": {
                    "description": "Set the location of the JDBC driver file or folder for the chosen vendor. Use a .jar file or a folder containing multiple driver JARs.\n\nRequired.\n\nAllowed file types: .jar. To browse for a matching file, call `list_files({ forBlock: \"<this block>\", forOption: \"databaseConnection.driverJarLocation\" })` (use forType instead of forBlock for a not-yet-added block) - the listing is then auto-restricted to these types, so you do not need to pass the extensions yourself.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "fileInOmniscope"
                          },
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "urlHttpFtp"
                          },
                          "url": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                          },
                          "authentication": {
                            "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "none"
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "basic"
                                  },
                                  "passwordConnectionOptions": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Enter the username to use for this connection."
                                      },
                                      "password": {
                                        "type": [
                                          "object",
                                          "null"
                                        ],
                                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                        "properties": {
                                          "secretUpdate": {
                                            "type": [
                                              "string",
                                              "null"
                                            ],
                                            "description": "The new secret. null leaves the stored one alone."
                                          }
                                        },
                                        "additionalProperties": false
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "bearerToken"
                                  },
                                  "bearerToken": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "oauth2ClientFlow"
                                  },
                                  "tokenEndpointUrl": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                                  },
                                  "clientId": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                                  },
                                  "clientSecret": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  },
                                  "useStandardFlow": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                                  },
                                  "addBasicAuthHeader": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                                  },
                                  "addClientCredentialParams": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                                  },
                                  "requestHeaders": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom headers to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  },
                                  "requestParams": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom parameters to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "jdbcUrl": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the JDBC connection URL used to connect to the database. Include the vendor-specific protocol, host, database name, and any required properties.\n\nRequired."
                  },
                  "driverClass": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the fully qualified Java driver class name from the JDBC driver documentation. Use this when the driver requires an explicit class name.\n\nRequired."
                  },
                  "databaseVariant": {
                    "description": "Override the detected database type and SQL dialect used for queries. Set this for advanced cases where Omniscope should use a specific variant.\n\nValid values: `actian`, `amazonRedshift`, `apacheImpala`, `clickhouse`, `databricks`, `ingres`, `mariadb`, `microsoftAccessJet`, `microsoftSqlserver`, `monetdb`, `mysql`, `oracle`, `postgres`, `snowflake`, `sqlite`, `genericTransactSql`, `vertica`, `default`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "actian",
                          "amazonRedshift",
                          "apacheImpala",
                          "clickhouse",
                          "databricks",
                          "ingres",
                          "mariadb",
                          "microsoftAccessJet",
                          "microsoftSqlserver",
                          "monetdb",
                          "mysql",
                          "oracle",
                          "postgres",
                          "snowflake",
                          "sqlite",
                          "genericTransactSql",
                          "vertica",
                          "default"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable scrollable cursor mode instead of forward-only querying. Use this to allow jumping back in the result set.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and related password settings.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as key-value items.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "connect": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `databaseConnection` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the connection before reading data. Defaults to false.\n\nRequired."
          },
          "tableQueryOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure options for reading a table when Query type is Table.\n\nRelevant when `queryType` equals `table`; when `connect` equals `true`.\n\nRequired.",
            "properties": {
              "table": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the database table to query.\n\nRequired."
              },
              "filters": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Set filter conditions to narrow the rows returned from the table.\n\nRequired.",
                "properties": {
                  "rules": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the filter rules to apply.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the table field this rule applies to.\n\nRequired."
                        },
                        "filter": {
                          "description": "Choose the comparison or match rule to apply to the selected field.\n\nRequired.",
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "hasAnyValue"
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "hasNoValue"
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "equals"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the value to compare against when filtering for equality."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "notEqual"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the value to exclude. The filter matches records whose field value is not equal to this text."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "greaterThan"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the comparison value to filter for items greater than this number or text value. Leave unset to use the default comparison value."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "greaterThanOrEqual"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the comparison value for this filter. The block matches items whose field value is greater than or equal to this text value."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "lessThan"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the comparison value to filter for items that are less than this number or text value."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "lessThanOrEqual"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the comparison value for this \"less than or equal to\" filter. Leave unset to use the default value handling for the block."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "contains"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the value to test for containment. Use the exact text or token you want this filter to match against the database field."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "doesNotContain"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the value that records must not contain."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "startsWith"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the text to match at the start of the value being filtered. Use this to return only records whose field begins with the given characters."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "endsWith"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the text to match values that end with this string."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "ifRulesMatch": {
                    "description": "Choose whether matching the rules causes the filter to accept or reject items.\n\nRelevant when `rules` has multiple entries.\n\nRequired.\n\nValid values: `accept`, `reject`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "accept",
                          "reject"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "matchAllOrAny": {
                    "description": "Choose whether all rules must match or any one rule may match.\n\nRelevant when `rules` has multiple entries.\n\nRequired.\n\nValid values: `all`, `any`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "all",
                          "any"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false
              },
              "allFields": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Set whether to include every field from the table in the query result.\n\nRequired."
              },
              "selectedFields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the specific fields to return when you are not selecting all fields.\n\nRelevant when `allFields` equals `false`.",
                "items": {
                  "type": "string",
                  "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_database",
        "description": "Options for a `database` block."
      },
      "BlockOptions_databasePublisher": {
        "type": "object",
        "properties": {
          "databaseConnection": {
            "description": "Select the database connection to publish to. Choose the connection profile for the target database type.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "actianAvalanche"
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the database port to connect to.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the database host name or address.\n\nRequired."
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and related login details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor so the query can jump back in the result set. Leave unset to use the default forward-only mode.\n\nRequired."
                  },
                  "additionalParams": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as name-value pairs.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "actianVector"
                  },
                  "port": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the port used to connect to the database server.\n\nRequired."
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the database server host name or address.\n\nRequired."
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the connection credentials and related authentication details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable this to use a scrollable cursor for queries instead of forward-only mode. Turn it on when the workflow needs to move back and forth through query results.\n\nRequired."
                  },
                  "additionalParams": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra connection parameters for the database connection.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "actianXIngres"
                  },
                  "port": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the database server port to connect to.\n\nRequired."
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the database server host name or address.\n\nRequired."
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and related login details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor to allow random access in query results. Leave unset to use forward-only queries for best compatibility and performance.\n\nRequired."
                  },
                  "additionalParams": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as name-value pairs.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonRedshift"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the Redshift cluster host from the endpoint shown in AWS console. Use the hostname portion only, without the port or database path.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the Redshift port from the cluster endpoint shown in AWS console. Use the numeric port, typically 5439.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the Redshift database name from the cluster endpoint shown in AWS console. Use the database segment at the end of the endpoint path.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection authentication details here, such as credentials or other password-related settings.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable this to query with a scrollable cursor so the result set can be navigated randomly. Leave unset to use the default forward-only mode.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters here when the connection needs non-default driver settings.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "clickhouse"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the ClickHouse server host name or address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the server port to connect to. Use 8443 for the HTTPS default port or 8123 for the HTTP default port.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "ssl": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable SSL/TLS for the connection.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Provide the connection credentials and related authentication settings.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "scrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use a scrollable cursor instead of forward-only querying to support random access in query results.\n\nRequired."
                  },
                  "additionalParams": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as key-value items.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "mariadb"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the MariaDB server host name or address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the MariaDB server port.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and authentication details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor instead of forward-only querying to allow random access to query results.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "microsoftAccess"
                  },
                  "location": {
                    "description": "Choose where the Access database is located: either a local file or a URL-based location.\n\nRequired.\n\nAllowed file types: .accdb, .accde, .mdb, .mde. To browse for a matching file, call `list_files({ forBlock: \"<this block>\", forOption: \"databaseConnection.location\" })` (use forType instead of forBlock for a not-yet-added block) - the listing is then auto-restricted to these types, so you do not need to pass the extensions yourself.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "fileInOmniscope"
                          },
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "urlHttpFtp"
                          },
                          "url": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                          },
                          "authentication": {
                            "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "none"
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "basic"
                                  },
                                  "passwordConnectionOptions": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Enter the username to use for this connection."
                                      },
                                      "password": {
                                        "type": [
                                          "object",
                                          "null"
                                        ],
                                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                        "properties": {
                                          "secretUpdate": {
                                            "type": [
                                              "string",
                                              "null"
                                            ],
                                            "description": "The new secret. null leaves the stored one alone."
                                          }
                                        },
                                        "additionalProperties": false
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "bearerToken"
                                  },
                                  "bearerToken": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "oauth2ClientFlow"
                                  },
                                  "tokenEndpointUrl": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                                  },
                                  "clientId": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                                  },
                                  "clientSecret": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  },
                                  "useStandardFlow": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                                  },
                                  "addBasicAuthHeader": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                                  },
                                  "addClientCredentialParams": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                                  },
                                  "requestHeaders": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom headers to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  },
                                  "requestParams": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom parameters to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the credentials and other connection details needed to open the Access database.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "scrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable this to use a scrollable cursor for the query, allowing random access back through the result set. Leave unset to use the default forward-only mode.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as name-value pairs for the Access connection.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "microsoftSqlServerAzureSql"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the server host name or address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the TCP port for the database server.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "instanceName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the SQL Server instance name when connecting to a named instance."
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the database name to connect to."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and related connection details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable scrollable-cursor querying instead of forward-only mode to allow jumping back in query results.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add optional JDBC connection parameters to append to the connection string.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "microsoftSqlServerLegacy"
                  },
                  "driver": {
                    "description": "Select the SQL Server driver to use for the connection.\n\nRequired.\n\nValid values: `sqlServer2008`, `sqlServer2005`, `sqlServer2000`, `jtdsJdbc`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sqlServer2008",
                          "sqlServer2005",
                          "sqlServer2000",
                          "jtdsJdbc"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the SQL Server host name or address.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Enter the TCP port for the SQL Server instance.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "instanceName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the named SQL Server instance to connect to."
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the database name to connect to."
                  },
                  "authentication": {
                    "description": "Select the authentication method to use for the connection.\n\nRequired.\n\nValid values: `windows`, `sqlServer`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "windows",
                          "sqlServer"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Provide the connection credentials and related password settings.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable scrollable cursor mode to allow random access within query results.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "monetdb"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the MonetDB server host name or IP address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the MonetDB server port number to connect to.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the MonetDB database name to use for the connection.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and related login details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor instead of forward-only query results. Use this when the workflow needs to jump back in the returned rows.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as key-value items.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "mysql"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the MySQL server host name or address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the MySQL server port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the connection credentials and related login details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor instead of the default forward-only query mode to support jumping back through result rows.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters for the MySQL connection.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "oracle"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the Oracle server host name or address.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Enter the TCP port used to connect to the Oracle server.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "sid": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the Oracle SID when connecting with an SID-based connection string. Leave unset if you are using a service name instead."
                  },
                  "serviceName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the Oracle service name when connecting with a service-name-based connection string. Leave unset if you are using an SID instead."
                  },
                  "connectAs": {
                    "description": "Choose whether to connect normally or with SYSDBA privileges.\n\nRequired.\n\nValid values: `normal`, `sysdba`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "normal",
                          "sysdba"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the connection credentials and related login details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "scrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor to support random access in query results. Leave unset to use the default forward-only mode for best compatibility and performance.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters to pass through to the Oracle connection.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "postgresql"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the PostgreSQL server host name or address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the TCP port for the PostgreSQL server.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and related login details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable scrollable cursor mode to allow random access within query results. Leave unset to use the default forward-only mode for best compatibility and performance.\n\nRequired."
                  },
                  "additionalParams": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as name-value pairs.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "snowflake"
                  },
                  "accountIdentifier": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the Snowflake account identifier that uniquely identifies your account.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and related password settings for this Snowflake connection.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "scrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor instead of forward-only query execution to allow random access in result sets.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add optional advanced JDBC connection parameters to pass through to the Snowflake connection.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sqlite"
                  },
                  "locationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the file location details for the SQLite database connection. Use this to point the connector at the database file or related local path settings.\n\nRequired.\n\nAllowed file types: .sqlite, .sqlite3, .db. To browse for a matching file, call `list_files({ forBlock: \"<this block>\", forOption: \"databaseConnection.locationOptions\" })` (use forType instead of forBlock for a not-yet-added block) - the listing is then auto-restricted to these types, so you do not need to pass the extensions yourself.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the connection credentials and related access details. Use this when the database file or environment requires a password.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor instead of forward-only querying. Turn this on when the query results need random access or moving back through rows.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra connection parameters for the SQLite JDBC connection. Use this for advanced driver options not covered by the other fields.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sybase10111215"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the Sybase server host name or IP address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Enter the network port the Sybase server listens on.\n\nRequired.",
                    "maximum": 65535,
                    "minimum": 0
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Enter the target Sybase database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the connection credentials and related authentication details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "scrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use a scrollable cursor instead of forward-only querying to allow random access in the result set. Leave unset to use the default forward-only mode.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as key-value entries.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "vertica"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Specify the Vertica server host name or address to connect to.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Specify the TCP port for the Vertica server.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "databaseName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Specify the Vertica database name to connect to.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the connection credentials and related authentication details.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable a scrollable cursor instead of the default forward-only query mode. Use this when you need random access to query results.\n\nRequired."
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters for the Vertica connection.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "otherDatabasesViaJdbc"
                  },
                  "driverJarLocation": {
                    "description": "Set the location of the JDBC driver file or folder for the chosen vendor. Use a .jar file or a folder containing multiple driver JARs.\n\nRequired.\n\nAllowed file types: .jar. To browse for a matching file, call `list_files({ forBlock: \"<this block>\", forOption: \"databaseConnection.driverJarLocation\" })` (use forType instead of forBlock for a not-yet-added block) - the listing is then auto-restricted to these types, so you do not need to pass the extensions yourself.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "fileInOmniscope"
                          },
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "urlHttpFtp"
                          },
                          "url": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                          },
                          "authentication": {
                            "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "none"
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "basic"
                                  },
                                  "passwordConnectionOptions": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Enter the username to use for this connection."
                                      },
                                      "password": {
                                        "type": [
                                          "object",
                                          "null"
                                        ],
                                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                        "properties": {
                                          "secretUpdate": {
                                            "type": [
                                              "string",
                                              "null"
                                            ],
                                            "description": "The new secret. null leaves the stored one alone."
                                          }
                                        },
                                        "additionalProperties": false
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "bearerToken"
                                  },
                                  "bearerToken": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "oauth2ClientFlow"
                                  },
                                  "tokenEndpointUrl": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                                  },
                                  "clientId": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                                  },
                                  "clientSecret": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  },
                                  "useStandardFlow": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                                  },
                                  "addBasicAuthHeader": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                                  },
                                  "addClientCredentialParams": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                                  },
                                  "requestHeaders": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom headers to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  },
                                  "requestParams": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom parameters to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "jdbcUrl": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the JDBC connection URL used to connect to the database. Include the vendor-specific protocol, host, database name, and any required properties.\n\nRequired."
                  },
                  "driverClass": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the fully qualified Java driver class name from the JDBC driver documentation. Use this when the driver requires an explicit class name.\n\nRequired."
                  },
                  "databaseVariant": {
                    "description": "Override the detected database type and SQL dialect used for queries. Set this for advanced cases where Omniscope should use a specific variant.\n\nValid values: `actian`, `amazonRedshift`, `apacheImpala`, `clickhouse`, `databricks`, `ingres`, `mariadb`, `microsoftAccessJet`, `microsoftSqlserver`, `monetdb`, `mysql`, `oracle`, `postgres`, `snowflake`, `sqlite`, `genericTransactSql`, `vertica`, `default`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "actian",
                          "amazonRedshift",
                          "apacheImpala",
                          "clickhouse",
                          "databricks",
                          "ingres",
                          "mariadb",
                          "microsoftAccessJet",
                          "microsoftSqlserver",
                          "monetdb",
                          "mysql",
                          "oracle",
                          "postgres",
                          "snowflake",
                          "sqlite",
                          "genericTransactSql",
                          "vertica",
                          "default"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "useScrollableCursor": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable scrollable cursor mode instead of forward-only querying. Use this to allow jumping back in the result set.\n\nRequired."
                  },
                  "connectionDetails": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the connection credentials and related password settings.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "additionalParameters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add extra JDBC connection parameters as key-value items.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "param": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the JDBC connection parameter to configure. Choose the parameter name from the available connection settings.\n\nRequired."
                        },
                        "secret": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Mark this parameter as secret when it contains sensitive data such as a password or private key.\n\nRequired."
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the parameter value for non-secret settings.\n\nRelevant when `secret` equals `false`.\n\nRequired."
                        },
                        "secretValue": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the secret value for this parameter, such as a password or private key.\n\nRelevant when `secret` equals `true`.\n\nRequired.",
                          "properties": {
                            "secretUpdate": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The new secret. null leaves the stored one alone."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "catalog": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the target catalog name. Leave unset to use the default catalog."
          },
          "schema": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the target schema name. Leave unset to use the default schema."
          },
          "tableName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the destination table name to publish to. The table is created if it does not already exist.\n\nRequired."
          },
          "publishMethod": {
            "description": "Choose how to write data to the destination table: replace the table, replace existing row data, append row data, or update row data.\n\nRequired.\n\nValid values: `replaceTable`, `replaceData`, `appendData`, `updateData`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "replaceTable",
                  "replaceData",
                  "appendData",
                  "updateData"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "recordKeyFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the field or fields that uniquely identify each record when updating row data.\n\nRelevant when `publishMethod` equals `updateData`.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "supportsNullKeyValues": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable this when the record key can contain null or empty values during update row data publishing.\n\nRelevant when `publishMethod` equals `updateData`.\n\nRequired."
          },
          "fieldDataTypeOverrides": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set database data types to use when creating a new destination table.\n\nRequired.",
            "properties": {
              "integerType": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Set the database type to use for integer fields, such as BIGINT. Leave unset to use the default type."
              },
              "decimalType": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Set the database type to use for decimal fields, such as DOUBLE PRECISION. Leave unset to use the default type."
              },
              "textType": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Set the database type to use for text fields, such as LONGVARCHAR. Leave unset to use the default type."
              },
              "dateType": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Set the database type to use for date and date-time fields, such as TIMESTAMP. Leave unset to use the default type."
              }
            },
            "additionalProperties": false
          },
          "fieldOverrides": {
            "type": [
              "array",
              "null"
            ],
            "description": "Provide per-field override settings for the published data.",
            "items": {
              "type": "object",
              "properties": {
                "inputField": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Choose the input field to override. This field supplies the source column that the other settings in this block apply to.\n\nRequired.\n\nField name from input 0."
                },
                "outputColumnName": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the database column name to use when creating or updating the table. Leave unset to use the input field name."
                },
                "sqlDataType": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the SQL data type to use when creating the table. Leave unset to let the type be chosen from the input field type and the SQL data type defaults."
                },
                "allowNull": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Allow the database column to accept null or empty values. Leave unset to use the default nullable behavior."
                },
                "primaryKey": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Mark the field as a primary key when creating the table."
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_databasePublisher",
        "description": "Options for a `databasePublisher` block."
      },
      "BlockOptions_deDuplicate": {
        "type": "object",
        "properties": {
          "allFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Set whether duplicates are calculated using all fields.\n\nRequired."
          },
          "fields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the fields used to calculate duplicate records. Choose a combination that uniquely identifies a single record, and leave this unset when matching on all fields.\n\nRelevant when `allFields` equals `false`.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "minimumGroupSize": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the minimum number of matching records required to form a duplicate group.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": 2
          },
          "caseSensitive": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Treat field values as case-sensitive when comparing records for duplicates.\n\nRequired."
          },
          "warnIfEmptyValues": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Warn when duplicate matching encounters empty values in the selected fields.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_deDuplicate",
        "description": "Options for a `deDuplicate` block."
      },
      "BlockOptions_defineSchema": {
        "type": "object",
        "properties": {
          "missingFieldHandling": {
            "description": "Control how extra, missing, or ambiguous fields are handled.\n\nChoose how to handle schema fields that are missing from the input. Use Ignore to skip them, Warning to report them, or Error to fail.\n\nRequired.\n\nValid values: `ignore`, `warning`, `error`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "ignore",
                  "warning",
                  "error"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "unexpectedFieldHandling": {
            "description": "Control how extra, missing, or ambiguous fields are handled.\n\nChoose how to handle input fields that do not map to any schema field. Pass them through, drop them, warn, or fail as needed.\n\nRequired.\n\nValid values: `passThrough`, `passThroughWarn`, `drop`, `dropWarn`, `error`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "passThrough",
                  "passThroughWarn",
                  "drop",
                  "dropWarn",
                  "error"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "multiMatchHandling": {
            "description": "Control how extra, missing, or ambiguous fields are handled.\n\nChoose what to do when multiple input fields match the same schema field. Use the merge option only for text fields.\n\nRequired.\n\nValid values: `takeFirst`, `takeFirstWarn`, `fail`, `coalesce`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "takeFirst",
                  "takeFirstWarn",
                  "fail",
                  "coalesce"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "autoMatchSimilarFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Control how extra, missing, or ambiguous fields are handled.\n\nEnable fuzzy matching from schema field names to input fields after exact name and alias matches. Similarity must be at least 50%.\n\nRequired."
          },
          "allowRepeatedInputFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Control how extra, missing, or ambiguous fields are handled.\n\nAllow a single input field to be mapped to more than one schema field.\n\nRequired."
          },
          "annotateOutputDescriptionWithSourceName": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Set each output field description to the resolved source field name.\n\nRequired."
          },
          "resetToMatchCurrentInputData": {
            "type": [
              "string",
              "null"
            ],
            "description": "(This setting cannot be set through the API - a write here is ignored.)\n\nReplace the schema fields with the field names and types currently present in the input.\n\nRequired."
          },
          "schemaFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Define the schema fields to use for this block.",
            "items": {
              "type": "object",
              "properties": {
                "schemaFieldName": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the schema field name to match the canonical name you want to map from source data.\n\nRequired."
                },
                "dataType": {
                  "description": "Choose the data type this schema field should use: Integer, Decimal, Text, or Date.\n\nRequired.\n\nValid values: `integer`, `decimal`, `text`, `date`.",
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "integer",
                        "decimal",
                        "text",
                        "date"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "exactSourceAliases": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "description": "Add exact source names that should match this schema field in addition to the schema field name. The field matches the name first, then these aliases, then fuzzy schema-name matching if enabled.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "alias": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the alias to use when defining the schema. Enter the alternate name that should represent the schema in the workflow.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "inputPattern": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSet the date pattern used to convert incoming text into a date value, such as yyyy-MM-dd HH:mm:ss.\n\nRelevant when `dataType` is in [date, ]."
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_defineSchema",
        "description": "Options for a `defineSchema` block."
      },
      "BlockOptions_deleteEmptyData": {
        "type": "object",
        "properties": {
          "deleteEmptyFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Delete empty fields from the output.\n\nRequired."
          },
          "deleteEmptyRecords": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Delete records that are empty from the output.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_deleteEmptyData",
        "description": "Options for a `deleteEmptyData` block."
      },
      "BlockOptions_demoData": {
        "type": "object",
        "properties": {
          "demoDataset": {
            "type": [
              "string",
              "null"
            ],
            "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the demo dataset to use for this block.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_demoData",
        "description": "Options for a `demoData` block."
      },
      "BlockOptions_depivot": {
        "type": "object",
        "properties": {
          "valueFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the fields to collapse into one output value field with one output record per input field value.\n\nRequired.",
            "items": {
              "type": "string",
              "description": "Field name from upstream input. Provide one or more field names."
            }
          },
          "seriesFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the output field name that will contain the original field names from the selected value fields.\n\nRequired."
          },
          "valuesFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the output field name that will contain the corresponding cell values from the selected value fields.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_depivot",
        "description": "Options for a `depivot` block."
      },
      "BlockOptions_detokenise": {
        "type": "object",
        "properties": {
          "field": {
            "type": [
              "string",
              "null"
            ],
            "description": "Choose the field to detokenise. Select the input column or field whose tokenized values should be converted back into text.\n\nRequired.\n\nField name from input 0."
          },
          "separator": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the character used to split the detokenised text into separate values. Use \\n for a newline, \\r for a carriage return, \\f for a form feed, or \\t for a tab.\n\nRequired."
          },
          "separatorIsCaseSensitive": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Set whether matching the separator should respect letter case.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_detokenise",
        "description": "Options for a `detokenise` block."
      },
      "BlockOptions_dimensionalityReduction": {
        "type": "object",
        "properties": {
          "allFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Select all eligible numeric fields for dimensionality reduction.\n\nRequired."
          },
          "fieldsToReduce": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose the numeric fields to reduce when you are not using all eligible fields.\n\nRelevant when `allFields` equals `false`.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "outputFieldMode": {
            "description": "Choose how to determine the number of output dimensions: automatic variance preservation, a fixed number of fields, or a target percentage of variance.\n\nValid values: `auto`, `fixednumber`, `percentage`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "auto",
                  "fixednumber",
                  "percentage"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "outputDimensions": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the fixed number of output dimensions to keep when using a fixed-size reduction.\n\nRelevant when `outputFieldMode` equals `fixednumber`.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "variancePreserve": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the percentage of variance to preserve when using a percentage-based reduction.\n\nRelevant when `outputFieldMode` equals `percentage`.",
            "maximum": 100,
            "minimum": 0
          },
          "useGroupingField": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable a grouping field to use linear discriminant analysis instead of principal component analysis.\n\nRequired."
          },
          "groupingField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Choose the field that contains the group labels for the reduction.\n\nRelevant when `useGroupingField` equals `true`.\n\nRequired.\n\nField name from input 0."
          },
          "normaliseData": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Normalise the data before reduction to account for differing scales between fields.\n\nRelevant when `useGroupingField` equals `false`.\n\nRequired."
          },
          "keepOriginalInputFieldsInOutput": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Keep the original input fields alongside the reduced dimensions in the output.\n\nRequired."
          },
          "missingValueBehaviour": {
            "description": "Choose how to handle missing values during reduction: ignore them or remove rows with missing values.\n\nRequired.\n\nValid values: `ignore`, `remove`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "ignore",
                  "remove"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure the partitioning settings used when a fixed number of output fields is selected.\n\nRelevant when `outputFieldMode` equals `fixednumber`.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_dimensionalityReduction",
        "description": "Options for a `dimensionalityReduction` block."
      },
      "BlockOptions_distributionInput": {
        "type": "object",
        "properties": {
          "fieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the output field name to populate in generated records.\n\nRequired."
          },
          "recordCount": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set how many records to generate for this field.\n\nRequired.",
            "minimum": 1
          },
          "distribution": {
            "description": "Choose the distribution used to generate values. Select the variant that matches the shape and parameters you want.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "beta"
                  },
                  "alpha": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the alpha shape parameter for the beta distribution.\n\nRequired."
                  },
                  "beta": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the beta shape parameter for the beta distribution.\n\nRequired."
                  },
                  "randomSeed": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the random number generator settings used by this distribution. Use it to control or reproduce the random sequence.",
                    "properties": {
                      "randomSeed": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the random seed used to initialize the generator."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "binomial"
                  },
                  "trialCount": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the number of trials in the binomial distribution.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "successProbability": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the probability of success for each trial.\n\nRequired.",
                    "maximum": 1,
                    "minimum": 0
                  },
                  "randomGenerator": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Provide the random number generator used to sample the distribution. Leave unset to use the default random source.",
                    "properties": {
                      "randomSeed": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the random seed used to initialize the generator."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "chiSquared"
                  },
                  "degreesOfFreedom": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the degrees of freedom for the chi-squared distribution.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "randomSeed": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the random number generator used by this distribution block to make its output reproducible.",
                    "properties": {
                      "randomSeed": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the random seed used to initialize the generator."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "exponential"
                  },
                  "lambda": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the exponential distribution rate parameter. Larger values produce shorter expected intervals.\n\nRequired."
                  },
                  "randomSource": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Provide the random number source used to generate exponential values. Leave unset to use the block's default random generator.",
                    "properties": {
                      "randomSeed": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the random seed used to initialize the generator."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "gamma"
                  },
                  "shape": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the gamma distribution shape parameter.\n\nRequired."
                  },
                  "scale": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the gamma distribution scale parameter.\n\nRequired."
                  },
                  "randomSeed": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the random generator used by this block. Set it when you need repeatable random values.",
                    "properties": {
                      "randomSeed": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the random seed used to initialize the generator."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "logistic"
                  },
                  "location": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the logistic distribution location, which shifts the distribution along the value axis.\n\nRequired."
                  },
                  "scale": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the logistic distribution scale, which controls how spread out the distribution is.\n\nRequired."
                  },
                  "randomSeed": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the random source used by this distribution block. Leave unset to use the default seeded randomness.",
                    "properties": {
                      "randomSeed": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the random seed used to initialize the generator."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "normal"
                  },
                  "mean": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the mean value for the normal distribution.\n\nRequired."
                  },
                  "standardDeviation": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the standard deviation for the normal distribution.\n\nRequired.",
                    "minimum": 0
                  },
                  "randomGenerator": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Provide the random number generator used by this normal distribution. Leave unset to use the default seeded random source.",
                    "properties": {
                      "randomSeed": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the random seed used to initialize the generator."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "truncatedNormal"
                  },
                  "mean": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the mean of the truncated normal distribution.\n\nRequired."
                  },
                  "standardDeviation": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the standard deviation of the truncated normal distribution.\n\nRequired.",
                    "minimum": 0
                  },
                  "minimum": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the lower bound for the truncated normal distribution.\n\nRequired."
                  },
                  "maximum": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the upper bound for the truncated normal distribution.\n\nRequired."
                  },
                  "randomGenerator": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Provide the random generator used to sample from the distribution. Leave unset to use the default generator.",
                    "properties": {
                      "randomSeed": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the random seed used to initialize the generator."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "poisson"
                  },
                  "lambda": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the Poisson rate parameter. Use larger values for a higher expected event count.\n\nRequired."
                  },
                  "randomGenerator": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the random number generator used to produce Poisson values. Leave unset to use the default random source.",
                    "properties": {
                      "randomSeed": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the random seed used to initialize the generator."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "t"
                  },
                  "degreesOfFreedom": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the degrees of freedom for the t distribution. Use a positive numeric value to control the shape of the distribution.\n\nRequired."
                  },
                  "randomSeed": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the random source used by this distribution. Leave unset to use the default randomness for the block.",
                    "properties": {
                      "randomSeed": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the random seed used to initialize the generator."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "uniform"
                  },
                  "minimum": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the minimum value for the uniform distribution.\n\nRequired."
                  },
                  "maximum": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the maximum value for the uniform distribution.\n\nRequired."
                  },
                  "randomGenerator": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the random source used to generate values for this distribution.",
                    "properties": {
                      "randomSeed": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the random seed used to initialize the generator."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_distributionInput",
        "description": "Options for a `distributionInput` block."
      },
      "BlockOptions_doubleClick": {
        "type": "object",
        "properties": {
          "connection": {
            "type": [
              "string",
              "null"
            ],
            "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the account connection to DoubleClick. Set the authorization details needed to access the service.\n\nRequired."
          },
          "profile": {
            "type": [
              "string",
              "null"
            ],
            "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the DoubleClick profile to use for requests after the connection is established.\n\nRelevant when `connected` equals `true`.\n\nRequired."
          },
          "report": {
            "description": "Choose which report type to run and configure the options for that report.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "standard"
                  },
                  "saveReportToServer": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Save the report to the DoubleClick server so it is available in ReportBuilder and the report chooser.\n\nRequired."
                  },
                  "reportName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Name the report when you choose to save it to the server.\n\nRelevant when `saveReportToServer` equals `true`.\n\nRequired."
                  },
                  "dateRangeType": {
                    "description": "Choose the report date range. Fixed date ranges are interpreted in UTC.\n\nRequired.\n\nValid values: `today`, `yesterday`, `weekToDate`, `monthToDate`, `quarterToDate`, `yearToDate`, `previousWeek`, `previousMonth`, `previousQuarter`, `previousYear`, `last7Days`, `last30Days`, `last90Days`, `last365Days`, `last24Months`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "today",
                          "yesterday",
                          "weekToDate",
                          "monthToDate",
                          "quarterToDate",
                          "yearToDate",
                          "previousWeek",
                          "previousMonth",
                          "previousQuarter",
                          "previousYear",
                          "last7Days",
                          "last30Days",
                          "last90Days",
                          "last365Days",
                          "last24Months",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "customDateRangeOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the custom start and end dates when you choose a custom date range.\n\nRelevant when `dateRangeType` equals `custom`.\n\nRequired.",
                    "properties": {
                      "rangeType": {
                        "description": "Choose how the date range is defined: a single day, a fixed start and end date, or a relative timeframe.\n\nRequired.\n\nValid values: `singleDay`, `fixedRange`, `timeframe`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "singleDay",
                              "fixedRange",
                              "timeframe"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "date": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the single day to include from the beginning through the end of that day.\n\nRelevant when `rangeType` equals `singleDay`.\n\nRequired.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "startDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive start date for a fixed date range. The range begins at the start of this day.\n\nRelevant when `rangeType` equals `fixedRange`.\n\nRequired.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "endDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive end date for a fixed date range. The range includes this day through the end of the day, and leaves the end open when unset to use today.\n\nRelevant when `rangeType` equals `fixedRange`.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "timeframeAmount": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the numeric size of the relative timeframe, such as 7 days or 3 months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": -2147483648
                      },
                      "timeframePeriod": {
                        "description": "Choose the unit for the relative timeframe, such as seconds, minutes, hours, days, weeks, or months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.\n\nValid values: `second`, `minute`, `hour`, `day`, `week`, `month`, `year`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "second",
                              "minute",
                              "hour",
                              "day",
                              "week",
                              "month",
                              "year"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "additionalProperties": false
                  },
                  "filters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add one or more filters to restrict the report data.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "dimension": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the dimension to filter. This determines which report dimension the filter applies to.\n\nRequired."
                        },
                        "filterType": {
                          "description": "Set how the dimension is filtered: include all values or match values containing text.\n\nRequired.\n\nValid values: `allValues`, `contains`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "allValues",
                                "contains"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "containsText": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text to match when the filter type is set to Contains.\n\nRelevant when `filterType` equals `contains`.\n\nRequired."
                        },
                        "confirmFilter": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `dimension`, `filterType`, `containsText` changes.\n\nConfirm the filter settings before the selected values are applied.\n\nRequired."
                        },
                        "values": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "description": "Select the dimension values to include after confirming the filter.\n\nRelevant when `confirmFilter` equals `true`.\n\nRequired.",
                          "items": {
                            "type": "string",
                            "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                          }
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "dimensions": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose the report dimension.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "metrics": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose the report metric.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "activityOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set activity-related options for the report.\n\nRequired.",
                    "properties": {
                      "activityType": {
                        "description": "Choose how the report activities are grouped in the output. Set this to show each activity separately or roll activities up by group.\n\nRequired.\n\nValid values: `none`, `showEachActivity`, `rollUpByGroup`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "none",
                              "showEachActivity",
                              "rollUpByGroup"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "activityGroups": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Select the activity groups to include when activities are rolled up by group. Leave unset to use the default group selection.\n\nRelevant when `activityType` does not equal `none`.",
                        "items": {
                          "type": "string",
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                        }
                      },
                      "activities": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Select the individual activities to include when showing each activity separately.\n\nRelevant when `activityType` equals `showEachActivity`.",
                        "items": {
                          "type": "string",
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                        }
                      },
                      "activityMetrics": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Select the metrics to include for the chosen activity grouping mode.\n\nRelevant when `activityType` does not equal `none`.",
                        "items": {
                          "type": "string",
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                        }
                      }
                    },
                    "additionalProperties": false
                  },
                  "richMediaEvents": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose the rich media event to include in the report.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "synchronous": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Run the report synchronously for small to moderate reports. Leave unset for large reports.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "floodlight"
                  },
                  "saveReportToServer": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Save the report to the DoubleClick server so it is accessible through the ReportBuilder web interface and selectable in the report chooser.\n\nRequired."
                  },
                  "reportName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the report name used when saving the report to the server.\n\nRelevant when `saveReportToServer` equals `true`.\n\nRequired."
                  },
                  "dateRangeType": {
                    "description": "Choose the report date range. Fixed date ranges are interpreted in UTC.\n\nRequired.\n\nValid values: `today`, `yesterday`, `weekToDate`, `monthToDate`, `quarterToDate`, `yearToDate`, `previousWeek`, `previousMonth`, `previousQuarter`, `previousYear`, `last7Days`, `last30Days`, `last90Days`, `last365Days`, `last24Months`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "today",
                          "yesterday",
                          "weekToDate",
                          "monthToDate",
                          "quarterToDate",
                          "yearToDate",
                          "previousWeek",
                          "previousMonth",
                          "previousQuarter",
                          "previousYear",
                          "last7Days",
                          "last30Days",
                          "last90Days",
                          "last365Days",
                          "last24Months",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "customDateRangeOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the custom date range details when the date range is custom.\n\nRelevant when `dateRangeType` equals `custom`.\n\nRequired.",
                    "properties": {
                      "rangeType": {
                        "description": "Choose how the date range is defined: a single day, a fixed start and end date, or a relative timeframe.\n\nRequired.\n\nValid values: `singleDay`, `fixedRange`, `timeframe`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "singleDay",
                              "fixedRange",
                              "timeframe"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "date": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the single day to include from the beginning through the end of that day.\n\nRelevant when `rangeType` equals `singleDay`.\n\nRequired.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "startDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive start date for a fixed date range. The range begins at the start of this day.\n\nRelevant when `rangeType` equals `fixedRange`.\n\nRequired.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "endDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive end date for a fixed date range. The range includes this day through the end of the day, and leaves the end open when unset to use today.\n\nRelevant when `rangeType` equals `fixedRange`.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "timeframeAmount": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the numeric size of the relative timeframe, such as 7 days or 3 months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": -2147483648
                      },
                      "timeframePeriod": {
                        "description": "Choose the unit for the relative timeframe, such as seconds, minutes, hours, days, weeks, or months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.\n\nValid values: `second`, `minute`, `hour`, `day`, `week`, `month`, `year`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "second",
                              "minute",
                              "hour",
                              "day",
                              "week",
                              "month",
                              "year"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "additionalProperties": false
                  },
                  "floodlightConfigId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Floodlight configuration ID to report on."
                  },
                  "includeAttributedIpConversions": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include attributed IP conversions in the report.\n\nRequired."
                  },
                  "includeUnattributedCookieConversions": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include unattributed cookie conversions in the report.\n\nRequired."
                  },
                  "includeUnattributedIpConversions": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include unattributed IP conversions in the report.\n\nRequired."
                  },
                  "filters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add filter rules to narrow the report results.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "dimension": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the dimension to filter. Use the dimension that the values and filter type should apply to.\n\nRequired."
                        },
                        "filterType": {
                          "description": "Choose how to match the selected dimension, either all values or values containing specific text.\n\nRequired.\n\nValid values: `allValues`, `contains`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "allValues",
                                "contains"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "contains": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text to match when the filter type is set to contains.\n\nRelevant when `filterType` equals `contains`.\n\nRequired."
                        },
                        "confirmed": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `dimension`, `filterType`, `contains` changes.\n\nConfirm the filter before applying it.\n\nRequired."
                        },
                        "values": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "description": "Select the dimension values to include once the filter is confirmed.\n\nRelevant when `confirmed` equals `true`.\n\nRequired.",
                          "items": {
                            "type": "string",
                            "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                          }
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "dimensions": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose the dimensions to include in the report.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "metrics": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose the metrics to include in the report.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "synchronous": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Run the request synchronously for small to moderate reports. Leave it unset for large reports.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "reach"
                  },
                  "saveReportToServer": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Save the report to the server so it is available in the ReportBuilder web interface and report chooser. Leave unset to keep it local.\n\nRequired."
                  },
                  "reportName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name to use when saving the report to the server.\n\nRelevant when `saveReportToServer` equals `true`.\n\nRequired."
                  },
                  "dateRangeType": {
                    "description": "Choose the report date range preset. Fixed dates are interpreted in UTC.\n\nRequired.\n\nValid values: `today`, `yesterday`, `weekToDate`, `monthToDate`, `quarterToDate`, `yearToDate`, `previousWeek`, `previousMonth`, `previousQuarter`, `previousYear`, `last7Days`, `last30Days`, `last90Days`, `last365Days`, `last24Months`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "today",
                          "yesterday",
                          "weekToDate",
                          "monthToDate",
                          "quarterToDate",
                          "yearToDate",
                          "previousWeek",
                          "previousMonth",
                          "previousQuarter",
                          "previousYear",
                          "last7Days",
                          "last30Days",
                          "last90Days",
                          "last365Days",
                          "last24Months",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "customDateRange": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the custom date range when the date range is set to custom.\n\nRelevant when `dateRangeType` equals `custom`.\n\nRequired.",
                    "properties": {
                      "rangeType": {
                        "description": "Choose how the date range is defined: a single day, a fixed start and end date, or a relative timeframe.\n\nRequired.\n\nValid values: `singleDay`, `fixedRange`, `timeframe`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "singleDay",
                              "fixedRange",
                              "timeframe"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "date": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the single day to include from the beginning through the end of that day.\n\nRelevant when `rangeType` equals `singleDay`.\n\nRequired.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "startDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive start date for a fixed date range. The range begins at the start of this day.\n\nRelevant when `rangeType` equals `fixedRange`.\n\nRequired.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "endDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive end date for a fixed date range. The range includes this day through the end of the day, and leaves the end open when unset to use today.\n\nRelevant when `rangeType` equals `fixedRange`.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "timeframeAmount": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the numeric size of the relative timeframe, such as 7 days or 3 months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": -2147483648
                      },
                      "timeframePeriod": {
                        "description": "Choose the unit for the relative timeframe, such as seconds, minutes, hours, days, weeks, or months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.\n\nValid values: `second`, `minute`, `hour`, `day`, `week`, `month`, `year`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "second",
                              "minute",
                              "hour",
                              "day",
                              "week",
                              "month",
                              "year"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "additionalProperties": false
                  },
                  "filters": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add one or more filters to restrict the report data.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "dimension": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the report dimension to filter by.\n\nRequired."
                        },
                        "filterType": {
                          "description": "Choose whether to keep all values or filter by a contained text match.\n\nRequired.\n\nValid values: `allValues`, `contains`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "allValues",
                                "contains"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "containsText": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text to match when filtering by contains.\n\nRelevant when `filterType` equals `contains`.\n\nRequired."
                        },
                        "confirmFilter": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `dimension`, `filterType`, `containsText` changes.\n\nConfirm the current filter settings before applying them.\n\nRequired."
                        },
                        "values": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "description": "Select the dimension values to include after confirming the filter.\n\nRelevant when `confirmFilter` equals `true`.\n\nRequired.",
                          "items": {
                            "type": "string",
                            "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                          }
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "dimensions": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose the reach dimension to use in the report.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "metrics": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose the reach metric to include in the report.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "reachByFrequencyMetrics": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose the reach-by-frequency metric to include in the report.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "activityOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure activity options for the reach report.\n\nRequired.",
                    "properties": {
                      "activityType": {
                        "description": "Choose how the report should organize activities: show none, list each activity separately, or roll them up by group.\n\nRequired.\n\nValid values: `none`, `showEachActivity`, `rollUpByGroup`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "none",
                              "showEachActivity",
                              "rollUpByGroup"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "activityGroups": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Select the activity groups to include when activity grouping is enabled.\n\nRelevant when `activityType` does not equal `none`.",
                        "items": {
                          "type": "string",
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                        }
                      },
                      "activities": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Select the activities to include when the report shows each activity separately.\n\nRelevant when `activityType` equals `showEachActivity`.",
                        "items": {
                          "type": "string",
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                        }
                      },
                      "activityMetrics": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Select the reach activity metrics to include when activity data is shown.\n\nRelevant when `activityType` does not equal `none`.",
                        "items": {
                          "type": "string",
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                        }
                      }
                    },
                    "additionalProperties": false
                  },
                  "richMediaEvents": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose the rich media event to include in the report.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "synchronous": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Run the request synchronously. Use this for small to moderate reports; leave unset for large reports.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "pathToConversion"
                  },
                  "saveReportToServer": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Save the report to the server so it is accessible in the ReportBuilder web interface and selectable in the report chooser.\n\nRequired."
                  },
                  "reportName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name used when saving the report to the server.\n\nRelevant when `saveReportToServer` equals `true`.\n\nRequired."
                  },
                  "dateRangeType": {
                    "description": "Choose the reporting date range. Fixed dates are interpreted in UTC.\n\nRequired.\n\nValid values: `today`, `yesterday`, `weekToDate`, `monthToDate`, `quarterToDate`, `yearToDate`, `previousWeek`, `previousMonth`, `previousQuarter`, `previousYear`, `last7Days`, `last30Days`, `last90Days`, `last365Days`, `last24Months`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "today",
                          "yesterday",
                          "weekToDate",
                          "monthToDate",
                          "quarterToDate",
                          "yearToDate",
                          "previousWeek",
                          "previousMonth",
                          "previousQuarter",
                          "previousYear",
                          "last7Days",
                          "last30Days",
                          "last90Days",
                          "last365Days",
                          "last24Months",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "customDateRangeOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the start and end dates for a custom date range.\n\nRelevant when `dateRangeType` equals `custom`.\n\nRequired.",
                    "properties": {
                      "rangeType": {
                        "description": "Choose how the date range is defined: a single day, a fixed start and end date, or a relative timeframe.\n\nRequired.\n\nValid values: `singleDay`, `fixedRange`, `timeframe`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "singleDay",
                              "fixedRange",
                              "timeframe"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "date": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the single day to include from the beginning through the end of that day.\n\nRelevant when `rangeType` equals `singleDay`.\n\nRequired.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "startDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive start date for a fixed date range. The range begins at the start of this day.\n\nRelevant when `rangeType` equals `fixedRange`.\n\nRequired.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "endDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive end date for a fixed date range. The range includes this day through the end of the day, and leaves the end open when unset to use today.\n\nRelevant when `rangeType` equals `fixedRange`.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "timeframeAmount": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the numeric size of the relative timeframe, such as 7 days or 3 months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": -2147483648
                      },
                      "timeframePeriod": {
                        "description": "Choose the unit for the relative timeframe, such as seconds, minutes, hours, days, weeks, or months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.\n\nValid values: `second`, `minute`, `hour`, `day`, `week`, `month`, `year`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "second",
                              "minute",
                              "hour",
                              "day",
                              "week",
                              "month",
                              "year"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "additionalProperties": false
                  },
                  "floodlightConfigId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Floodlight configuration ID to use for the report."
                  },
                  "activityGroups": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the activity groups to include in the report.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "activities": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the activities to include in the report.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "clicksLookbackWindow": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the click lookback window.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "impressionsLookbackWindow": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the impression lookback window.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "maxInteractionGap": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the maximum gap allowed between interactions.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "maxClickInteractions": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the maximum number of click interactions to include.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "maxImpressionInteractions": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the maximum number of impression interactions to include.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "pivotOnInteractionPath": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Pivot the report by interaction path instead of the default layout.\n\nRequired."
                  },
                  "includeAttributedIpConversions": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include attributed IP conversions in the report.\n\nRequired."
                  },
                  "includeUnattributedCookieConversions": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include unattributed cookie conversions in the report.\n\nRequired."
                  },
                  "includeUnattributedIpConversions": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include unattributed IP conversions in the report.\n\nRequired."
                  },
                  "conversionDimensions": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the conversion dimensions to include in the report.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "perInteractionDimensions": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the per-interaction dimensions to include in the report.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "metrics": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the conversion metrics to include in the report.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "customFloodlightVariables": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the custom Floodlight variables to include in the report.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "synchronous": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Run the request synchronously for small to moderate reports. Leave unset for large reports.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "server"
                  },
                  "synchronous": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable synchronous requests for this report. Use it for small to moderate sized reports; leave unset for large reports.\n\nRequired."
                  },
                  "report": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose which DoubleClick Server report to run.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_doubleClick",
        "description": "Options for a `doubleClick` block."
      },
      "BlockOptions_elasticsearch": {
        "type": "object",
        "properties": {
          "host": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the Elasticsearch host to connect to.\n\nRequired."
          },
          "port": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the Elasticsearch port. Use 443 for HTTPS and 9200 for non-HTTPS unless your server uses a different port.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "useHttps": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable HTTPS to communicate with the Elasticsearch server over a secure connection.\n\nRequired."
          },
          "indexName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the Elasticsearch index name to query.\n\nRequired."
          },
          "typeName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the document type name within the index. Leave unset for modern Elasticsearch setups that do not use types."
          },
          "userAuthentication": {
            "description": "Choose the user authentication method for connecting to Elasticsearch.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "none"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "basicAuthentication"
                  },
                  "passwordOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the password used for basic authentication.\n\nRequired.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "pkiAuthentication": {
            "description": "Choose whether to authenticate with PKI certificates.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "none"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "keyStoreAuthentication"
                  },
                  "keyStorePath": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the file path to the key store that contains the keys and certificates used for authentication. Use a .p12, .jks, or other supported key store file location.\n\nRequired.\n\nAllowed file types: .p12, .pfx, .jks. To browse for a matching file, call `list_files({ forBlock: \"<this block>\", forOption: \"pkiAuthentication.keyStorePath\" })` (use forType instead of forBlock for a not-yet-added block) - the listing is then auto-restricted to these types, so you do not need to pass the extensions yourself.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "keyStorePassword": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to open the key store file. Leave unset if the key store does not require a password.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "keyPassword": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password for the key entry inside the key store. Use the same value as the key store password when the key is protected that way.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "parseResults": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Parse returned values according to their types instead of treating every value as text.\n\nRequired."
          },
          "queryOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set the Elasticsearch query options used for the search request.\n\nRequired.",
            "properties": {
              "scoreResults": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable scored search results so better matches appear first. Leave unset to use the default relevance ordering.\n\nRequired."
              },
              "allFields": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Search across all fields in the query target. Set this to false when you want to limit the search to specific fields.\n\nRequired."
              },
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to search when allFields is false. Select one or more index fields to restrict matching to those fields.\n\nRelevant when `allFields` equals `false`.",
                "items": {
                  "type": "string",
                  "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted."
                }
              },
              "include": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Add clauses that must match for a document to be included in the results.",
                "items": {
                  "type": "object",
                  "properties": {
                    "condition": {
                      "description": "Select the query condition to apply to this field. Choose the exact term, match, range, or exists variant as needed.\n\nRequired.",
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "exactTerm"
                            },
                            "value": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Enter the exact term to match. The block filters to items whose field value equals this text.\n\nRequired."
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "match"
                            },
                            "value": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the text value to match against.\n\nRequired."
                            },
                            "operator": {
                              "description": "Choose whether this condition should match all or any of the specified criteria.\n\nRequired.\n\nValid values: `and`, `or`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "and",
                                    "or"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "range"
                            },
                            "minimum": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the lower bound of the range query. Leave unset to apply no minimum."
                            },
                            "maximum": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the upper bound of the range query. Leave unset to apply no maximum."
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "exists"
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "field": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Set the field name to query against.\n\nRequired."
                    }
                  },
                  "additionalProperties": false
                }
              },
              "exclude": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Add clauses that must not match for a document to be included in the results.",
                "items": {
                  "type": "object",
                  "properties": {
                    "condition": {
                      "description": "Select the query condition to apply to this field. Choose the exact term, match, range, or exists variant as needed.\n\nRequired.",
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "exactTerm"
                            },
                            "value": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Enter the exact term to match. The block filters to items whose field value equals this text.\n\nRequired."
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "match"
                            },
                            "value": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the text value to match against.\n\nRequired."
                            },
                            "operator": {
                              "description": "Choose whether this condition should match all or any of the specified criteria.\n\nRequired.\n\nValid values: `and`, `or`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "and",
                                    "or"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "range"
                            },
                            "minimum": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the lower bound of the range query. Leave unset to apply no minimum."
                            },
                            "maximum": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the upper bound of the range query. Leave unset to apply no maximum."
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "exists"
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "field": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Set the field name to query against.\n\nRequired."
                    }
                  },
                  "additionalProperties": false
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_elasticsearch",
        "description": "Options for a `elasticsearch` block."
      },
      "BlockOptions_email": {
        "type": "object",
        "properties": {
          "connectionConfirmed": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm that the email connection has been set up successfully. Defaults to false.\n\nRequired."
          },
          "fields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose which email fields to download, such as folders, sender, recipients, or attachments-related content. Selecting content or attachment fields is slower.\n\nRequired.\n\nValid values: `folder`, `from`, `allRecipients`, `toRecipients`, `ccRecipients`, `bccRecipients`, `sentDate`, `receivedDate`, `subject`, `answered`, `deleted`, `draft`, `flagged`, `recent`, `seen`, `receivedSpf`, `senderIp`, `contentText`, `contentHtml`, `attachmentNames`, `downloadedAttachmentNames`.",
            "items": {
              "type": "string",
              "enum": [
                "folder",
                "from",
                "allRecipients",
                "toRecipients",
                "ccRecipients",
                "bccRecipients",
                "sentDate",
                "receivedDate",
                "subject",
                "answered",
                "deleted",
                "draft",
                "flagged",
                "recent",
                "seen",
                "receivedSpf",
                "senderIp",
                "contentText",
                "contentHtml",
                "attachmentNames",
                "downloadedAttachmentNames"
              ]
            }
          },
          "folders": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the email folders to include. This field is available only after the connection is confirmed.\n\nRelevant when `connectionConfirmed` equals `true`.\n\nRequired.",
            "items": {
              "type": "string",
              "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
            }
          },
          "maxMessages": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the maximum number of messages to download; defaults to 10000. There is no value that means \"all\": null means use the default, so it still caps at 10000. To download everything, send a deliberately large number, for example 1000000.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "connectionOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure the email source connection settings.",
            "properties": {
              "mailProtocol": {
                "description": "Select the mail server protocol to use for the connection. Prefer IMAP when the server supports it; use POP3 only when it is the available option.\n\nRequired.\n\nValid values: `IMAP`, `POP3`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "IMAP",
                      "POP3"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "mailServerUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Enter the mail server address used for the connection.\n\nRequired."
              },
              "mailServerPort": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Enter the mail server port to connect to. Use the port specified by your mail server settings, typically 993 for IMAP over SSL or 995 for POP3 over SSL.\n\nRequired.",
                "maximum": 2147483647,
                "minimum": -2147483648
              },
              "useSslEncryption": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable SSL encryption for the mail server connection. Leave unset to use the default connection behavior.\n\nRequired."
              },
              "username": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Enter the username used to authenticate with the mail server.\n\nRequired."
              },
              "password": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password used to authenticate with the mail server.\n\nRequired.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "filterOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure which emails to include by applying filter rules.",
            "properties": {
              "fromAddressFilter": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Match messages by sender address using a partial or full, case-insensitive search string."
              },
              "recipientAddressFilter": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Match messages by any recipient address in the To, CC, or BCC fields using a partial or full, case-insensitive search string."
              },
              "specifyDateFilter": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable the date filter for this email search.\n\nRequired."
              },
              "subjectFilter": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Match messages by subject using a partial or full, case-insensitive search string."
              },
              "contentBodyFilter": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Match messages by body text using a partial or full, case-insensitive search string."
              },
              "dateFilterOptions": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Configure the date range used when date filtering is enabled.\n\nRelevant when `specifyDateFilter` equals `true`.\n\nRequired.",
                "properties": {
                  "rangeType": {
                    "description": "Choose how the date range is defined: a single day, a fixed start and end date, or a relative timeframe.\n\nRequired.\n\nValid values: `singleDay`, `fixedRange`, `timeframe`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "singleDay",
                          "fixedRange",
                          "timeframe"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the single day to include from the beginning through the end of that day.\n\nRelevant when `rangeType` equals `singleDay`.\n\nRequired.",
                    "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                  },
                  "startDate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive start date for a fixed date range. The range begins at the start of this day.\n\nRelevant when `rangeType` equals `fixedRange`.\n\nRequired.",
                    "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                  },
                  "endDate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive end date for a fixed date range. The range includes this day through the end of the day, and leaves the end open when unset to use today.\n\nRelevant when `rangeType` equals `fixedRange`.",
                    "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                  },
                  "timeframeAmount": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the numeric size of the relative timeframe, such as 7 days or 3 months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "timeframePeriod": {
                    "description": "Choose the unit for the relative timeframe, such as seconds, minutes, hours, days, weeks, or months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.\n\nValid values: `second`, `minute`, `hour`, `day`, `week`, `month`, `year`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "second",
                          "minute",
                          "hour",
                          "day",
                          "week",
                          "month",
                          "year"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "attachmentOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how email attachments are handled when downloading messages.",
            "properties": {
              "downloadAttachments": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Download email attachments to the selected folder. Enable this to save attachments locally.\n\nRequired."
              },
              "filenameFilter": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Filter which attachments to download by filename using a wildcard pattern such as *.xlsx. Matching is case insensitive.\n\nRelevant when `downloadAttachments` equals `true`.\n\nRequired."
              },
              "overwriteExistingFiles": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Overwrite files in the attachment folder when a downloaded attachment has the same name as an existing file.\n\nRelevant when `downloadAttachments` equals `true`.\n\nRequired."
              },
              "attachmentFolder": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Choose the folder where downloaded attachments are saved.\n\nRelevant when `downloadAttachments` equals `true`.\n\nRequired.",
                "properties": {
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_email",
        "description": "Options for a `email` block."
      },
      "BlockOptions_emailPublisher": {
        "type": "object",
        "properties": {
          "fromAddress": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the sender email address for the message. Leave unset to use the server-wide email address."
          },
          "toAddresses": {
            "type": [
              "array",
              "null"
            ],
            "description": "Set the primary recipient email addresses.",
            "items": {
              "type": "string"
            }
          },
          "ccAddresses": {
            "type": [
              "array",
              "null"
            ],
            "description": "Set the CC recipient email addresses.",
            "items": {
              "type": "string"
            }
          },
          "bccAddresses": {
            "type": [
              "array",
              "null"
            ],
            "description": "Set the BCC recipient email addresses.",
            "items": {
              "type": "string"
            }
          },
          "messageSubject": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the email subject line.\n\nRequired."
          },
          "addSubjectTimestamp": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Append a timestamp to the subject line.\n\nRequired."
          },
          "subjectTimestampFormat": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the date/time format pattern for the subject timestamp, such as yyyyMMdd-HHmm.\n\nRelevant when `addSubjectTimestamp` equals `true`.\n\nRequired."
          },
          "subjectTimestampInsertSpace": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Insert a space between the subject text and the timestamp.\n\nRelevant when `addSubjectTimestamp` equals `true`.\n\nRequired."
          },
          "messageText": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the plain text body of the email."
          },
          "addInlineDataTable": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Embed the data in the email body as an inline table.\n\nRequired."
          },
          "inlineDataTableMaxRows": {
            "type": [
              "number",
              "null"
            ],
            "description": "Limit the number of rows included in the inline data table. Leave unset to include all rows.\n\nRelevant when `addInlineDataTable` equals `true`.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "dynamicContent": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set rich text HTML content, including formulas, as authored in Omniscope Classic."
          },
          "externalAttachments": {
            "type": [
              "array",
              "null"
            ],
            "description": "Add external files to attach to the email.",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                }
              },
              "additionalProperties": false
            }
          },
          "includeDataAttachment": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include the data as a file attachment.\n\nRequired."
          },
          "addAttachmentTimestamp": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Append a timestamp to the data attachment filename.\n\nRelevant when `includeDataAttachment` equals `true`.\n\nRequired."
          },
          "attachmentTimestampFormat": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the date/time format pattern for the data attachment timestamp, such as yyyyMMdd-HHmm.\n\nRelevant when `includeDataAttachment` equals `true`; when `addAttachmentTimestamp` equals `true`.\n\nRequired."
          },
          "attachmentTimestampInsertSpace": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Insert a space between the data attachment filename and the timestamp.\n\nRelevant when `includeDataAttachment` equals `true`; when `addAttachmentTimestamp` equals `true`.\n\nRequired."
          },
          "dataFilename": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the data attachment filename, including its extension.\n\nRelevant when `includeDataAttachment` equals `true`.\n\nRequired."
          },
          "dataAttachmentFileType": {
            "description": "Choose the file type used for the data attachment.\n\nRelevant when `includeDataAttachment` equals `true`.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding for the output file. Defaults to UTF-8.\n\nRequired."
                  },
                  "writeBOM": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Write a byte-order mark at the start of UTF encoded files. Defaults to true.\n\nRelevant when `encoding` is in [UTF-8, UTF-16BE, UTF-16LE, UTF-16].\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character used to separate cells in each row; defaults to a comma. To write each row as a single field, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuoteCharacter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character used to quote cell values; defaults to a double quote. To disable quoting, and replace illegal characters with underscores, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the nested table data publishing options.",
                    "properties": {
                      "includeHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Include the header row when publishing the table data. Set this to false to write only the data rows.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "allowIllegal": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Allow invalid CSV output when quoting or separators are disabled. Defaults to false.\n\nRelevant when `cellQuoteCharacter` equals ``; when `cellSeparator` equals ``.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "fileConfiguration": {
                    "description": "Choose which file configuration to use when writing the .iok file. Select the default, target file, template file, or current file configuration as appropriate.\n\nRequired.\n\nValid values: `defaultFileConfig`, `targetFileConfig`, `templateFileConfig`, `currentFileConfig`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "defaultFileConfig",
                          "targetFileConfig",
                          "templateFileConfig",
                          "currentFileConfig"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "stronglyCompressed": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Write the file using strong compression.\n\nRequired."
                  },
                  "timeLimiting": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable file expiry based on a date and time.\n\nRequired."
                  },
                  "expiryDateTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the date and time when this file expires.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "serverPermissioning": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Require users to authenticate with a website before opening the file.\n\nRequired."
                  },
                  "serverUrl": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL text shown after the file has expired.\n\nRelevant when `serverPermissioning` equals `true`.\n\nRequired."
                  },
                  "domainLocked": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Restrict opening the file to specific domains.\n\nRequired."
                  },
                  "domainNames": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "List the domains that are allowed to host this file, separated by commas.\n\nRelevant when `domainLocked` equals `true`.\n\nRequired."
                  },
                  "warningOnSave": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Show a warning when the file is saved.\n\nRequired."
                  },
                  "warningText": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the warning text shown when the file is saved.\n\nRelevant when `warningOnSave` equals `true`.\n\nRequired."
                  },
                  "walledGarden": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the walled garden option to apply."
                  },
                  "showWelcomePage": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Show the server page after a successful login.\n\nRelevant when `serverPermissioning` equals `true`.\n\nRequired."
                  },
                  "ownerLocked": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Require a password to open the file.\n\nRequired."
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to lock the file.\n\nRelevant when `ownerLocked` equals `true`.\n\nRequired.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "confirmPassword": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nRepeat the file password to confirm it.\n\nRelevant when `ownerLocked` equals `true`.\n\nRequired.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "keepLinkHistory": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Keep link and history information in the file.\n\nRequired."
                  },
                  "refreshOnOpen": {
                    "description": "Choose when linked data should refresh when the file opens: never, auto-detect, or always.\n\nRelevant when `keepLinkHistory` equals `true`.\n\nRequired.\n\nValid values: `never`, `autoDetect`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "autoDetect",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "templateFile": {
                    "description": "Set the template file location to use when writing from a template. The template must be compatible with the published data.\n\nRelevant when `fileConfiguration` equals `templateFileConfig`.\n\nRequired.\n\nAllowed file types: .iok, .iom. To browse for a matching file, call `list_files({ forBlock: \"<this block>\", forOption: \"dataAttachmentFileType.templateFile\" })` (use forType instead of forBlock for a not-yet-added block) - the listing is then auto-restricted to these types, so you do not need to pass the extensions yourself.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "fileInOmniscope"
                          },
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "urlHttpFtp"
                          },
                          "url": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                          },
                          "authentication": {
                            "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "none"
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "basic"
                                  },
                                  "passwordConnectionOptions": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Enter the username to use for this connection."
                                      },
                                      "password": {
                                        "type": [
                                          "object",
                                          "null"
                                        ],
                                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                        "properties": {
                                          "secretUpdate": {
                                            "type": [
                                              "string",
                                              "null"
                                            ],
                                            "description": "The new secret. null leaves the stored one alone."
                                          }
                                        },
                                        "additionalProperties": false
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "bearerToken"
                                  },
                                  "bearerToken": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "oauth2ClientFlow"
                                  },
                                  "tokenEndpointUrl": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                                  },
                                  "clientId": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                                  },
                                  "clientSecret": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  },
                                  "useStandardFlow": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                                  },
                                  "addBasicAuthHeader": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                                  },
                                  "addClientCredentialParams": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                                  },
                                  "requestHeaders": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom headers to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  },
                                  "requestParams": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom parameters to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "preserveTemplateFormat": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Keep the template's field formatting and formulas when writing the file.\n\nRelevant when `fileConfiguration` equals `templateFileConfig`.\n\nRequired."
                  },
                  "requireServerTimeCheck": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Require an internet time server check before the file can be opened after expiry.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "allowAccessWithWarning": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Allow opening the expired file after showing a warning message.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "expiryMessage": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the message shown when the file has expired.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "convertFormulasToStaticValues": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Convert formulas to static values when writing the file.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "writer": {
                    "description": "Choose how the spreadsheet is written. Use Omniscope for the standard writer, or Excel direct when you need direct Excel file output if available.\n\nRequired.\n\nValid values: `omniscope`, `excelJacobDirect`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "excelJacobDirect"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "publishMethod": {
                    "description": "Select how to update an existing Excel file. A new workbook is created when the file does not already exist.\n\nRequired.\n\nValid values: `replaceWorkbook`, `replaceWorksheet`, `replaceData`, `overwriteData`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "replaceWorkbook",
                          "replaceWorksheet",
                          "replaceData",
                          "overwriteData"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "sheetName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the worksheet name to write to in the Excel file.\n\nRequired."
                  },
                  "useTemporaryStagingFile": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable this when writing to a locally synchronised folder such as OneDrive. This writes through a temporary staging file to avoid save conflicts with the sync agent and Excel.\n\nRelevant when `writer` equals `excelJacobDirect`.\n\nRequired."
                  },
                  "insertDataAtRow": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the starting row for inserting data in the sheet.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "insertDataAtColumn": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the starting column for inserting data in the sheet.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data publishing options for how the data is written.",
                    "properties": {
                      "includeHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Include the header row when publishing the table data. Set this to false to write only the data rows.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_emailPublisher",
        "description": "Options for a `emailPublisher` block."
      },
      "BlockOptions_entityRecognition": {
        "type": "object",
        "properties": {
          "fields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the upstream text field or fields to extract entities from.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "finderOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure the entity extraction engine settings used to find names and other entities in the selected text.",
            "properties": {
              "entities": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Select the entities to find from the input text.\n\nRequired.",
                "items": {
                  "type": "string",
                  "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_entityRecognition",
        "description": "Options for a `entityRecognition` block."
      },
      "BlockOptions_fieldFilter": {
        "type": "object",
        "properties": {
          "condition": {
            "description": "Choose whether matching the rules means the field is accepted or rejected.\n\nRequired.\n\nValid values: `accept`, `reject`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "accept",
                  "reject"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "match": {
            "description": "Select whether all listed rules must match or any one of them may match.\n\nRelevant when `rules` has multiple entries.\n\nRequired.\n\nValid values: `all`, `any`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "all",
                  "any"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "autoPopulate": {
            "type": [
              "string",
              "null"
            ],
            "description": "(This setting cannot be set through the API - a write here is ignored.)\n\nTrigger auto-population of the rule list and related filter settings.\n\nRequired."
          },
          "rules": {
            "type": [
              "array",
              "null"
            ],
            "description": "Provide the list of field filter rules to evaluate.",
            "items": {
              "type": "object",
              "properties": {
                "filterType": {
                  "description": "Choose which field attribute to filter by: name, number, type, description, source, or group.\n\nRequired.\n\nValid values: `fieldName`, `fieldNumber`, `fieldType`, `fieldDescription`, `fieldSource`, `fieldGroup`.",
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "fieldName",
                        "fieldNumber",
                        "fieldType",
                        "fieldDescription",
                        "fieldSource",
                        "fieldGroup"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "filter": {
                  "description": "Set the matching rule for the selected field attribute. Pick the comparison or text-matching option that should be applied.\n\nRelevant when `filterType` does not equal `fieldType`.\n\nRequired.",
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "equals"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to compare against. Use this as the match text for the equals filter."
                        },
                        "accentSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable accent-sensitive matching so accented and unaccented characters are treated as different.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching so uppercase and lowercase letters are treated as different.\n\nRelevant when `accentSensitive` equals `true`.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the value: exact text, wildcard patterns, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "notEqual"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to compare against. The filter matches items that are not equal to this text."
                        },
                        "accentSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable accent-sensitive comparison so accented and unaccented characters are treated as different.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive comparison so uppercase and lowercase characters are treated as different.\n\nRelevant when `accentSensitive` equals `true`.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the value: as plain text, wildcard text using * and ?, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "greaterThan"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the comparison value to test against. Use the text you want this filter to match as greater than.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching when comparing the value. Leave unset to use the default case-insensitive behavior.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "greaterThanOrEqual"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the comparison value to test against. Provide the threshold or exact text to match, depending on the data type.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching when comparing text values.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "lessThan"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the value to compare against with the less-than filter.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching when the value is text; leave unset to use the default comparison behavior.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "lessThanOrEqual"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the comparison value to test against with the less-than-or-equal condition.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Set whether text comparisons should treat uppercase and lowercase letters as different.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "contains"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text or pattern to search for with the contains filter.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Set whether the contains match should respect letter case.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the value: as plain text, wildcards, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "doesNotContain"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to test against. The filter keeps items that do not contain this text.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Match uppercase and lowercase characters exactly when checking whether the value contains the text.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the search text: plain text, wildcards, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "startsWith"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the text to match at the start of each input value.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching when checking whether values start with the given text.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the match text: normal, wildcard patterns, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "endsWith"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text to match at the end of the field value.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Match text using exact letter case when enabled.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the match text: normal text, wildcards using * and ?, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "fuzzyMatchSoundex"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text to fuzzy-match using Soundex."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "fuzzyMatchLevenshtein"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text to match against. The filter keeps items whose text matches this value with Levenshtein fuzzy matching."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching for the fuzzy comparison.\n\nRequired."
                        },
                        "closeness": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Set how many edits are allowed between the input text and a match. Higher values make the fuzzy match broader.\n\nRequired.",
                          "maximum": 2147483647,
                          "minimum": -2147483648
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "fieldTypeFilter": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "description": "Set the type-specific filter settings used when filtering by field type.\n\nRelevant when `filterType` equals `fieldType`.\n\nRequired.",
                  "properties": {
                    "filterType": {
                      "description": "Choose which comparison to apply to the value: equals or does not equal.\n\nRequired.\n\nValid values: `equals`, `notEquals`.",
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "equals",
                            "notEquals"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "valueType": {
                      "description": "Choose the type of value to match against: integer, decimal, text, or date.\n\nRequired.\n\nValid values: `integer`, `decimal`, `text`, `date`.",
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "integer",
                            "decimal",
                            "text",
                            "date"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "additionalProperties": false
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fieldFilter",
        "description": "Options for a `fieldFilter` block."
      },
      "BlockOptions_fieldMetadata": {
        "type": "object",
        "properties": {
          "fieldMetadata": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose which field metadata to include in the output. Use the selected attribute as the visible label for each field.\n\nRequired.\n\nValid values: `name`, `dataType`, `description`, `source`, `group`, `count`, `nullCount`, `nonNullCount`, `minText`, `maxText`, `minNumber`, `maxNumber`, `minDate`, `maxDate`, `singletonText`, `singletonNumber`, `singletonDate`, `firstNonEmptyValueText`, `firstNonEmptyValueNumber`, `firstNonEmptyValueDate`, `meanNumber`, `meanDate`, `median`, `mode`, `standardDeviation`, `thousandSeparator`, `percent`, `decimalPlaces`, `numberPrefix`, `numberSuffix`, `negativeNumberFormat`, `dateFormat`.",
            "items": {
              "type": "string",
              "enum": [
                "name",
                "dataType",
                "description",
                "source",
                "group",
                "count",
                "nullCount",
                "nonNullCount",
                "minText",
                "maxText",
                "minNumber",
                "maxNumber",
                "minDate",
                "maxDate",
                "singletonText",
                "singletonNumber",
                "singletonDate",
                "firstNonEmptyValueText",
                "firstNonEmptyValueNumber",
                "firstNonEmptyValueDate",
                "meanNumber",
                "meanDate",
                "median",
                "mode",
                "standardDeviation",
                "thousandSeparator",
                "percent",
                "decimalPlaces",
                "numberPrefix",
                "numberSuffix",
                "negativeNumberFormat",
                "dateFormat"
              ]
            }
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fieldMetadata",
        "description": "Options for a `fieldMetadata` block."
      },
      "BlockOptions_fieldOrganiser": {
        "type": "object",
        "properties": {
          "mappings": {
            "type": [
              "array",
              "null"
            ],
            "description": "A list of rules, one per field you want to change. Each rule targets an existing input field by inputFieldName (to rename, change type, reformat, or delete it), or creates a NEW field when inputFieldName is null. Any field you do not list passes through unchanged. Add a rule only for a field you actually want to change or add. Note: in the default mode this list's order does NOT set the output order (use outputFieldOrder, or leave it null to follow the input order); only when freeze is true does the output appear in this list's order.\n\nField name from input 0.",
            "items": {
              "type": "object",
              "properties": {
                "outputFieldName": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The new name for the field. Leave null to keep the input field's existing name. Required (non-null) when creating a new field (inputFieldName null). To duplicate a field, add a second rule with the same inputFieldName and a different outputFieldName here."
                },
                "outputDataType": {
                  "description": "Convert the field to this type: text, integer, decimal, or date. Leave null to keep the input field's type. Required (non-null) when creating a new field.\n\nValid values: `inherit`, `integer`, `decimal`, `text`, `date`.",
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "inherit",
                        "integer",
                        "decimal",
                        "text",
                        "date"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "inputLocale": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used when converting text into numbers or dates. Use it when the input values follow a different locale.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [date, decimal, integer, ]."
                },
                "formula": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "A formula expression that computes the field's values; reference other OUTPUT fields by name in square brackets, e.g. [Price] * [Quantity]. Use it on a new field (inputFieldName null) to compute it, or on an existing field to replace its values. A formula cannot read the field's own previous value, and may depend only on other output fields. Call the lookup_formula_functions tool to discover functions and signatures - don't guess. Examples: ROUND([Price]*[Quantity], 2); IF([Revenue]>0, \"profit\", \"loss\"). Null for no formula.\n\nRelevant when `delete` equals `false`."
                },
                "inputFieldName": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "(Free-text value; its meaning depends on the block.)\n\nThe existing input field this rule changes — rename, change type, reformat, or delete it. Match an upstream field name (case-insensitive). Set null to create a NEW field instead. If you leave it null by mistake on a rule meant for an existing field, that field is not changed and you instead add a clashing new field."
                },
                "defaultValue": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Only for a NEW constant field (inputFieldName null and no formula): the fixed value placed in every row. Null otherwise.\n\nRelevant when `delete` equals `false`; when `inputFieldName` is in []."
                },
                "delete": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Set true to remove this input field from the output. Requires inputFieldName, and the other transform options on the rule are then ignored.\n\nRequired."
                },
                "showThousandSeparator": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Numeric display only: show thousands separators. Null inherits the field's current setting.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [integer, decimal, ].\n\nomit/null = Use the setting as passed through."
                },
                "showAsPercent": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Numeric display only: show the value as a percentage. Null inherits.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [integer, decimal, ].\n\nomit/null = Use the setting as passed through."
                },
                "decimalPlaces": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Set the number of decimal places to display for numeric output.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [integer, decimal, ].",
                  "maximum": 2147483647,
                  "minimum": -2147483648
                },
                "prefix": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Short text shown before a numeric value, e.g. a currency symbol. Display only; does not change the stored value. Null for none.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [integer, decimal, ]."
                },
                "suffix": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Short text shown after a numeric value, e.g. a unit. Display only; does not change the stored value. Null for none.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [integer, decimal, ]."
                },
                "negativeNumberFormat": {
                  "description": "How negative numbers are displayed, e.g. a leading minus sign or parentheses. Null inherits.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [integer, decimal, ].\n\nValid values: `minusSign`, `accounting`, `ledger`.",
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "minusSign",
                        "accounting",
                        "ledger"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "inputDatePattern": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nWhen converting text into a date, the Java SimpleDateFormat pattern used to parse the incoming text, e.g. yyyy-MM-dd or dd/MM/yyyy HH:mm. Null uses the locale's default parsing. (Note: 'Y' is week-year and needs 'w'; for a calendar year use 'y'.)\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [date, ]."
                },
                "outputDatePattern": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nThe Java SimpleDateFormat pattern used to format the date, e.g. dd MMM yyyy. Unlike numeric decimalPlaces (display only), this also FIXES the stored date granularity: a pattern with no time component (e.g. yyyy-MM-dd) truncates the value to whole days. Null inherits the input pattern / full granularity.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [date, ]."
                },
                "tokenised": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Keep text as multiple tokenised values so they can be listed and filtered individually (classic data engine). Null inherits.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [text, ].\n\nomit/null = Use the setting as passed through."
                },
                "source": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "description": "Set the source metadata for the field to track its origin.\n\nRequired.",
                  "properties": {
                    "set": {
                      "type": [
                        "boolean",
                        "null"
                      ],
                      "description": "Whether to write this metadata field at all. true = write `value` (a null value therefore CLEARS it); false = leave whatever is already there untouched, which is the default. On a NEW field (no inputFieldName) this flag is ignored and `value` is always applied, so an untouched object writes an empty value rather than inheriting one.\n\nRequired."
                    },
                    "value": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The metadata text to write. Applied when set is true, and on a new field always; null with set true is how you clear an existing value.\n\nRelevant when `set` equals `true`."
                    }
                  },
                  "additionalProperties": false
                },
                "group": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "description": "Set the group metadata for the field to classify it with related fields.\n\nRequired.",
                  "properties": {
                    "set": {
                      "type": [
                        "boolean",
                        "null"
                      ],
                      "description": "Whether to write this metadata field at all. true = write `value` (a null value therefore CLEARS it); false = leave whatever is already there untouched, which is the default. On a NEW field (no inputFieldName) this flag is ignored and `value` is always applied, so an untouched object writes an empty value rather than inheriting one.\n\nRequired."
                    },
                    "value": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The metadata text to write. Applied when set is true, and on a new field always; null with set true is how you clear an existing value.\n\nRelevant when `set` equals `true`."
                    }
                  },
                  "additionalProperties": false
                },
                "description": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "description": "Set the field description metadata, including any notes about its contents, meaning, or source.\n\nRequired.",
                  "properties": {
                    "set": {
                      "type": [
                        "boolean",
                        "null"
                      ],
                      "description": "Whether to write this metadata field at all. true = write `value` (a null value therefore CLEARS it); false = leave whatever is already there untouched, which is the default. On a NEW field (no inputFieldName) this flag is ignored and `value` is always applied, so an untouched object writes an empty value rather than inheriting one.\n\nRequired."
                    },
                    "value": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The metadata text to write. Applied when set is true, and on a new field always; null with set true is how you clear an existing value.\n\nRelevant when `set` equals `true`."
                    }
                  },
                  "additionalProperties": false
                },
                "customSortOrder": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "description": "Enter each value in the desired sort order, one per line. Values not listed appear after all ordered values in natural sort order.\n\nRelevant when `delete` equals `false`; when `outputDataType` is in [text, ].",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "additionalProperties": false
            }
          },
          "onMissingField": {
            "description": "Choose what happens when a rule targets an input field that is absent from the upstream data: error (fail the block), warning (drop the field but warn), or dropField (drop it silently).\n\nRequired.\n\nValid values: `fail`, `warning`, `dropField`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "fail",
                  "warning",
                  "dropField"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "onDeletedField": {
            "description": "Choose what happens when a field this block deletes is already absent upstream (so the delete rule is redundant): error, warning, or ignore.\n\nRequired.\n\nValid values: `fail`, `warning`, `ignore`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "fail",
                  "warning",
                  "ignore"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "includeOtherInputFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Only applies when freeze is true. When true, input fields not named by any rule are still passed through to the output; when false the output is exactly the listed fields. It has no effect when freeze is false, because unlisted fields always pass through in that mode.\n\nRelevant when `freeze` equals `true`.\n\nRequired."
          },
          "outputFieldOrder": {
            "type": [
              "array",
              "null"
            ],
            "description": "Pin the output order as a list of output field names (use the output name — the renamed name if you renamed the field). Listed fields appear first, in this order; every other field, and any newly-arriving upstream field, follows in input order. Leave null to use the input order and keep adapting to upstream changes. Ignored when freeze is true (order then follows the mappings list).\n\nRequired.",
            "items": {
              "type": "string"
            }
          },
          "freeze": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Switch from the default adaptive mode to an exact, fixed output. When true, the output is exactly the fields listed in mappings, in this list's order, and the block stops adapting to upstream schema changes (outputFieldOrder is ignored); set includeOtherInputFields=true to also let unlisted input fields through. Leave false (default) for adaptive mode, where unlisted fields pass through and the output follows the input order unless outputFieldOrder is set.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fieldOrganiser",
        "description": "Options for a `fieldOrganiser` block."
      },
      "BlockOptions_fileMeta": {
        "type": "object",
        "properties": {
          "fileTypes": {
            "description": "Choose which files to include: all files, images only, or a custom filename filter.\n\nRequired.\n\nValid values: `all`, `images`, `custom`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "all",
                  "images",
                  "custom"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "includeFilenames": {
            "type": [
              "string",
              "null"
            ],
            "description": "List the filename patterns to include when file types are set to custom. Use the same comma-separated wildcard syntax as exclude filenames.\n\nRelevant when `fileTypes` equals `custom`.\n\nRequired."
          },
          "excludeFilenames": {
            "type": [
              "string",
              "null"
            ],
            "description": "List filename patterns to exclude using comma-separated rules with '*' and '?' wildcards. For example, '*.pdf' excludes PDFs and '??.txt' excludes text files with two-character names."
          },
          "caseSensitive": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Treat custom include and exclude filename and subfolder-name patterns as case sensitive.\n\nRequired."
          },
          "includeSubfolderNames": {
            "type": [
              "string",
              "null"
            ],
            "description": "Limit results to subfolders whose names match these comma-separated wildcard patterns."
          },
          "excludeSubfolderNames": {
            "type": [
              "string",
              "null"
            ],
            "description": "Exclude subfolders whose names match these comma-separated wildcard patterns."
          },
          "includeHiddenFiles": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include hidden files in the file listing.\n\nRequired."
          },
          "includeFoldersAsRecords": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include folders as records in the output.\n\nRequired."
          },
          "absolutePaths": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Output full absolute filesystem paths instead of paths relative to the folder location.\n\nRequired."
          },
          "importEmbeddedTags": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Import tags embedded within file contents, such as media metadata.\n\nRequired."
          },
          "importFilenameTags": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Split filenames into multiple fields using the built-in separators.\n\nRequired."
          },
          "filenameTagFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Define the field and delimiter sequence used to break a filename into separate fields.\n\nRelevant when `importFilenameTags` equals `true`.\n\nRequired.",
            "items": {
              "type": "string"
            }
          },
          "locationType": {
            "description": "Choose the location source type for this file listing.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fileMeta",
        "description": "Options for a `fileMeta` block."
      },
      "BlockOptions_filePublisher": {
        "type": "object",
        "properties": {
          "addFileTimestamp": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Append a timestamp to the output file name when writing the file.\n\nRequired."
          },
          "fileTimestampFormat": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the timestamp pattern used when adding a timestamp to the file name. Leave unset to use the default format.\n\nRelevant when `addFileTimestamp` equals `true`.\n\nRequired."
          },
          "fileTimestampInsertSpace": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Insert a space before the timestamp in the file name when timestamping is enabled.\n\nRelevant when `addFileTimestamp` equals `true`.\n\nRequired."
          },
          "locationOptions": {
            "description": "Choose the output location type for the file publisher.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "remoteFileViaSshSftpScp"
                  },
                  "protocol": {
                    "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sftp",
                          "scp"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote server host name.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the SSH port number to connect to.\n\nRequired.",
                    "maximum": 65536,
                    "minimum": 0
                  },
                  "usePrivateKey": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                  },
                  "passwordConnectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure password-based connection options for this SSH location.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "privateKeyFileLocationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "writerOptions": {
            "description": "Choose the file format to write.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "writeCompression": {
                    "description": "Choose whether to compress the written IOD data, and pick the compression level to use.\n\nRequired.\n\nValid values: `none`, `fastCompression`, `highCompression`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "fastCompression",
                          "highCompression"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "appendData": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Set this to append incoming data to the existing IOD file instead of writing a new file from scratch.\n\nRequired."
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "When appending to an IOD created in a different timezone, choose how to handle date and time fields across timezones. Use a conversion setting that preserves logical local dates and times, or keep the same absolute timestamp.\n\nRelevant when `appendData` equals `true`.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding for the output file. Defaults to UTF-8.\n\nRequired."
                  },
                  "writeBOM": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Write a byte-order mark at the start of UTF encoded files. Defaults to true.\n\nRelevant when `encoding` is in [UTF-8, UTF-16BE, UTF-16LE, UTF-16].\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character used to separate cells in each row; defaults to a comma. To write each row as a single field, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuoteCharacter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character used to quote cell values; defaults to a double quote. To disable quoting, and replace illegal characters with underscores, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the nested table data publishing options.",
                    "properties": {
                      "includeHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Include the header row when publishing the table data. Set this to false to write only the data rows.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "allowIllegal": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Allow invalid CSV output when quoting or separators are disabled. Defaults to false.\n\nRelevant when `cellQuoteCharacter` equals ``; when `cellSeparator` equals ``.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "writer": {
                    "description": "Choose how the spreadsheet is written. Use Omniscope for the standard writer, or Excel direct when you need direct Excel file output if available.\n\nRequired.\n\nValid values: `omniscope`, `excelJacobDirect`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "excelJacobDirect"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "publishMethod": {
                    "description": "Select how to update an existing Excel file. A new workbook is created when the file does not already exist.\n\nRequired.\n\nValid values: `replaceWorkbook`, `replaceWorksheet`, `replaceData`, `overwriteData`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "replaceWorkbook",
                          "replaceWorksheet",
                          "replaceData",
                          "overwriteData"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "sheetName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the worksheet name to write to in the Excel file.\n\nRequired."
                  },
                  "useTemporaryStagingFile": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable this when writing to a locally synchronised folder such as OneDrive. This writes through a temporary staging file to avoid save conflicts with the sync agent and Excel.\n\nRelevant when `writer` equals `excelJacobDirect`.\n\nRequired."
                  },
                  "insertDataAtRow": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the starting row for inserting data in the sheet.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "insertDataAtColumn": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the starting column for inserting data in the sheet.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data publishing options for how the data is written.",
                    "properties": {
                      "includeHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Include the header row when publishing the table data. Set this to false to write only the data rows.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "rWorkspaceDataRdataFile"
                  },
                  "compress": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Compress the .rdata file when writing it.\n\nRequired."
                  },
                  "dataName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name to assign to the data in the workspace file.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "fileConfiguration": {
                    "description": "Choose which file configuration to use when writing the .iok file. Select the default, target file, template file, or current file configuration as appropriate.\n\nRequired.\n\nValid values: `defaultFileConfig`, `targetFileConfig`, `templateFileConfig`, `currentFileConfig`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "defaultFileConfig",
                          "targetFileConfig",
                          "templateFileConfig",
                          "currentFileConfig"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "stronglyCompressed": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Write the file using strong compression.\n\nRequired."
                  },
                  "timeLimiting": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable file expiry based on a date and time.\n\nRequired."
                  },
                  "expiryDateTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the date and time when this file expires.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "serverPermissioning": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Require users to authenticate with a website before opening the file.\n\nRequired."
                  },
                  "serverUrl": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL text shown after the file has expired.\n\nRelevant when `serverPermissioning` equals `true`.\n\nRequired."
                  },
                  "domainLocked": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Restrict opening the file to specific domains.\n\nRequired."
                  },
                  "domainNames": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "List the domains that are allowed to host this file, separated by commas.\n\nRelevant when `domainLocked` equals `true`.\n\nRequired."
                  },
                  "warningOnSave": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Show a warning when the file is saved.\n\nRequired."
                  },
                  "warningText": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the warning text shown when the file is saved.\n\nRelevant when `warningOnSave` equals `true`.\n\nRequired."
                  },
                  "walledGarden": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the walled garden option to apply."
                  },
                  "showWelcomePage": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Show the server page after a successful login.\n\nRelevant when `serverPermissioning` equals `true`.\n\nRequired."
                  },
                  "ownerLocked": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Require a password to open the file.\n\nRequired."
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to lock the file.\n\nRelevant when `ownerLocked` equals `true`.\n\nRequired.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "confirmPassword": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nRepeat the file password to confirm it.\n\nRelevant when `ownerLocked` equals `true`.\n\nRequired.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "keepLinkHistory": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Keep link and history information in the file.\n\nRequired."
                  },
                  "refreshOnOpen": {
                    "description": "Choose when linked data should refresh when the file opens: never, auto-detect, or always.\n\nRelevant when `keepLinkHistory` equals `true`.\n\nRequired.\n\nValid values: `never`, `autoDetect`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "autoDetect",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "templateFile": {
                    "description": "Set the template file location to use when writing from a template. The template must be compatible with the published data.\n\nRelevant when `fileConfiguration` equals `templateFileConfig`.\n\nRequired.\n\nAllowed file types: .iok, .iom. To browse for a matching file, call `list_files({ forBlock: \"<this block>\", forOption: \"writerOptions.templateFile\" })` (use forType instead of forBlock for a not-yet-added block) - the listing is then auto-restricted to these types, so you do not need to pass the extensions yourself.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "fileInOmniscope"
                          },
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "urlHttpFtp"
                          },
                          "url": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                          },
                          "authentication": {
                            "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "none"
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "basic"
                                  },
                                  "passwordConnectionOptions": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Enter the username to use for this connection."
                                      },
                                      "password": {
                                        "type": [
                                          "object",
                                          "null"
                                        ],
                                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                        "properties": {
                                          "secretUpdate": {
                                            "type": [
                                              "string",
                                              "null"
                                            ],
                                            "description": "The new secret. null leaves the stored one alone."
                                          }
                                        },
                                        "additionalProperties": false
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "bearerToken"
                                  },
                                  "bearerToken": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "oauth2ClientFlow"
                                  },
                                  "tokenEndpointUrl": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                                  },
                                  "clientId": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                                  },
                                  "clientSecret": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  },
                                  "useStandardFlow": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                                  },
                                  "addBasicAuthHeader": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                                  },
                                  "addClientCredentialParams": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                                  },
                                  "requestHeaders": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom headers to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  },
                                  "requestParams": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom parameters to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "preserveTemplateFormat": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Keep the template's field formatting and formulas when writing the file.\n\nRelevant when `fileConfiguration` equals `templateFileConfig`.\n\nRequired."
                  },
                  "requireServerTimeCheck": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Require an internet time server check before the file can be opened after expiry.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "allowAccessWithWarning": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Allow opening the expired file after showing a warning message.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "expiryMessage": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the message shown when the file has expired.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "convertFormulasToStaticValues": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Convert formulas to static values when writing the file.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "tableauDataExtractTdeFile"
                  },
                  "publishMethod": {
                    "description": "Choose how to publish to an existing data extract file. Use Replace data to overwrite the existing extract, or Append data to add to it.\n\nRequired.\n\nValid values: `replaceData`, `appendData`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "replaceData",
                          "appendData"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheAvroAvroFile"
                  },
                  "recordName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the schema record name used with the namespace to uniquely identify the Avro record, such as person or transaction.\n\nRequired."
                  },
                  "recordNamespace": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the schema namespace that, together with the record name, uniquely identifies the Avro record. Use a namespace meaningful to your organisation, such as com.mycompany."
                  },
                  "compression": {
                    "description": "Choose the compression method for the Avro file: uncompressed, snappy, or deflate.\n\nRequired.\n\nValid values: `uncompressed`, `snappy`, `deflate`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "uncompressed",
                          "snappy",
                          "deflate"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "deflateLevel": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the deflate compression level from 1 to 9 when using deflate compression.\n\nRelevant when `compression` equals `deflate`.\n\nRequired.",
                    "maximum": 9,
                    "minimum": 1
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheParquetParquetFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_filePublisher",
        "description": "Options for a `filePublisher` block."
      },
      "BlockOptions_filePublisher_fileOutput": {
        "type": "object",
        "properties": {
          "addFileTimestamp": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Append a timestamp to the output file name when writing the file.\n\nRequired."
          },
          "fileTimestampFormat": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the timestamp pattern used when adding a timestamp to the file name. Leave unset to use the default format.\n\nRelevant when `addFileTimestamp` equals `true`.\n\nRequired."
          },
          "fileTimestampInsertSpace": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Insert a space before the timestamp in the file name when timestamping is enabled.\n\nRelevant when `addFileTimestamp` equals `true`.\n\nRequired."
          },
          "locationOptions": {
            "description": "Choose the output location type for the file publisher.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "remoteFileViaSshSftpScp"
                  },
                  "protocol": {
                    "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sftp",
                          "scp"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote server host name.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the SSH port number to connect to.\n\nRequired.",
                    "maximum": 65536,
                    "minimum": 0
                  },
                  "usePrivateKey": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                  },
                  "passwordConnectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure password-based connection options for this SSH location.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "privateKeyFileLocationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "writerOptions": {
            "description": "Choose the file format to write.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "writeCompression": {
                    "description": "Choose whether to compress the written IOD data, and pick the compression level to use.\n\nRequired.\n\nValid values: `none`, `fastCompression`, `highCompression`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "fastCompression",
                          "highCompression"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "appendData": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Set this to append incoming data to the existing IOD file instead of writing a new file from scratch.\n\nRequired."
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "When appending to an IOD created in a different timezone, choose how to handle date and time fields across timezones. Use a conversion setting that preserves logical local dates and times, or keep the same absolute timestamp.\n\nRelevant when `appendData` equals `true`.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding for the output file. Defaults to UTF-8.\n\nRequired."
                  },
                  "writeBOM": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Write a byte-order mark at the start of UTF encoded files. Defaults to true.\n\nRelevant when `encoding` is in [UTF-8, UTF-16BE, UTF-16LE, UTF-16].\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character used to separate cells in each row; defaults to a comma. To write each row as a single field, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuoteCharacter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character used to quote cell values; defaults to a double quote. To disable quoting, and replace illegal characters with underscores, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the nested table data publishing options.",
                    "properties": {
                      "includeHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Include the header row when publishing the table data. Set this to false to write only the data rows.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "allowIllegal": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Allow invalid CSV output when quoting or separators are disabled. Defaults to false.\n\nRelevant when `cellQuoteCharacter` equals ``; when `cellSeparator` equals ``.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "writer": {
                    "description": "Choose how the spreadsheet is written. Use Omniscope for the standard writer, or Excel direct when you need direct Excel file output if available.\n\nRequired.\n\nValid values: `omniscope`, `excelJacobDirect`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "excelJacobDirect"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "publishMethod": {
                    "description": "Select how to update an existing Excel file. A new workbook is created when the file does not already exist.\n\nRequired.\n\nValid values: `replaceWorkbook`, `replaceWorksheet`, `replaceData`, `overwriteData`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "replaceWorkbook",
                          "replaceWorksheet",
                          "replaceData",
                          "overwriteData"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "sheetName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the worksheet name to write to in the Excel file.\n\nRequired."
                  },
                  "useTemporaryStagingFile": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable this when writing to a locally synchronised folder such as OneDrive. This writes through a temporary staging file to avoid save conflicts with the sync agent and Excel.\n\nRelevant when `writer` equals `excelJacobDirect`.\n\nRequired."
                  },
                  "insertDataAtRow": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the starting row for inserting data in the sheet.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "insertDataAtColumn": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the starting column for inserting data in the sheet.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data publishing options for how the data is written.",
                    "properties": {
                      "includeHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Include the header row when publishing the table data. Set this to false to write only the data rows.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "rWorkspaceDataRdataFile"
                  },
                  "compress": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Compress the .rdata file when writing it.\n\nRequired."
                  },
                  "dataName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name to assign to the data in the workspace file.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "fileConfiguration": {
                    "description": "Choose which file configuration to use when writing the .iok file. Select the default, target file, template file, or current file configuration as appropriate.\n\nRequired.\n\nValid values: `defaultFileConfig`, `targetFileConfig`, `templateFileConfig`, `currentFileConfig`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "defaultFileConfig",
                          "targetFileConfig",
                          "templateFileConfig",
                          "currentFileConfig"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "stronglyCompressed": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Write the file using strong compression.\n\nRequired."
                  },
                  "timeLimiting": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable file expiry based on a date and time.\n\nRequired."
                  },
                  "expiryDateTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the date and time when this file expires.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "serverPermissioning": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Require users to authenticate with a website before opening the file.\n\nRequired."
                  },
                  "serverUrl": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL text shown after the file has expired.\n\nRelevant when `serverPermissioning` equals `true`.\n\nRequired."
                  },
                  "domainLocked": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Restrict opening the file to specific domains.\n\nRequired."
                  },
                  "domainNames": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "List the domains that are allowed to host this file, separated by commas.\n\nRelevant when `domainLocked` equals `true`.\n\nRequired."
                  },
                  "warningOnSave": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Show a warning when the file is saved.\n\nRequired."
                  },
                  "warningText": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the warning text shown when the file is saved.\n\nRelevant when `warningOnSave` equals `true`.\n\nRequired."
                  },
                  "walledGarden": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the walled garden option to apply."
                  },
                  "showWelcomePage": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Show the server page after a successful login.\n\nRelevant when `serverPermissioning` equals `true`.\n\nRequired."
                  },
                  "ownerLocked": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Require a password to open the file.\n\nRequired."
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to lock the file.\n\nRelevant when `ownerLocked` equals `true`.\n\nRequired.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "confirmPassword": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nRepeat the file password to confirm it.\n\nRelevant when `ownerLocked` equals `true`.\n\nRequired.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "keepLinkHistory": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Keep link and history information in the file.\n\nRequired."
                  },
                  "refreshOnOpen": {
                    "description": "Choose when linked data should refresh when the file opens: never, auto-detect, or always.\n\nRelevant when `keepLinkHistory` equals `true`.\n\nRequired.\n\nValid values: `never`, `autoDetect`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "autoDetect",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "templateFile": {
                    "description": "Set the template file location to use when writing from a template. The template must be compatible with the published data.\n\nRelevant when `fileConfiguration` equals `templateFileConfig`.\n\nRequired.\n\nAllowed file types: .iok, .iom. To browse for a matching file, call `list_files({ forBlock: \"<this block>\", forOption: \"writerOptions.templateFile\" })` (use forType instead of forBlock for a not-yet-added block) - the listing is then auto-restricted to these types, so you do not need to pass the extensions yourself.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "fileInOmniscope"
                          },
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "urlHttpFtp"
                          },
                          "url": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                          },
                          "authentication": {
                            "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "none"
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "basic"
                                  },
                                  "passwordConnectionOptions": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Enter the username to use for this connection."
                                      },
                                      "password": {
                                        "type": [
                                          "object",
                                          "null"
                                        ],
                                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                        "properties": {
                                          "secretUpdate": {
                                            "type": [
                                              "string",
                                              "null"
                                            ],
                                            "description": "The new secret. null leaves the stored one alone."
                                          }
                                        },
                                        "additionalProperties": false
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "bearerToken"
                                  },
                                  "bearerToken": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "oauth2ClientFlow"
                                  },
                                  "tokenEndpointUrl": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                                  },
                                  "clientId": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                                  },
                                  "clientSecret": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  },
                                  "useStandardFlow": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                                  },
                                  "addBasicAuthHeader": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                                  },
                                  "addClientCredentialParams": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                                  },
                                  "requestHeaders": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom headers to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  },
                                  "requestParams": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom parameters to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "preserveTemplateFormat": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Keep the template's field formatting and formulas when writing the file.\n\nRelevant when `fileConfiguration` equals `templateFileConfig`.\n\nRequired."
                  },
                  "requireServerTimeCheck": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Require an internet time server check before the file can be opened after expiry.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "allowAccessWithWarning": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Allow opening the expired file after showing a warning message.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "expiryMessage": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the message shown when the file has expired.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "convertFormulasToStaticValues": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Convert formulas to static values when writing the file.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "tableauDataExtractTdeFile"
                  },
                  "publishMethod": {
                    "description": "Choose how to publish to an existing data extract file. Use Replace data to overwrite the existing extract, or Append data to add to it.\n\nRequired.\n\nValid values: `replaceData`, `appendData`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "replaceData",
                          "appendData"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheAvroAvroFile"
                  },
                  "recordName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the schema record name used with the namespace to uniquely identify the Avro record, such as person or transaction.\n\nRequired."
                  },
                  "recordNamespace": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the schema namespace that, together with the record name, uniquely identifies the Avro record. Use a namespace meaningful to your organisation, such as com.mycompany."
                  },
                  "compression": {
                    "description": "Choose the compression method for the Avro file: uncompressed, snappy, or deflate.\n\nRequired.\n\nValid values: `uncompressed`, `snappy`, `deflate`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "uncompressed",
                          "snappy",
                          "deflate"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "deflateLevel": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the deflate compression level from 1 to 9 when using deflate compression.\n\nRelevant when `compression` equals `deflate`.\n\nRequired.",
                    "maximum": 9,
                    "minimum": 1
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheParquetParquetFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_filePublisher_fileOutput",
        "description": "Options for a `filePublisher:fileOutput` block."
      },
      "BlockOptions_filePublisher_urlOutput": {
        "type": "object",
        "properties": {
          "addFileTimestamp": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Append a timestamp to the output file name when writing the file.\n\nRequired."
          },
          "fileTimestampFormat": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the timestamp pattern used when adding a timestamp to the file name. Leave unset to use the default format.\n\nRelevant when `addFileTimestamp` equals `true`.\n\nRequired."
          },
          "fileTimestampInsertSpace": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Insert a space before the timestamp in the file name when timestamping is enabled.\n\nRelevant when `addFileTimestamp` equals `true`.\n\nRequired."
          },
          "locationOptions": {
            "description": "Choose the output location type for the file publisher.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "remoteFileViaSshSftpScp"
                  },
                  "protocol": {
                    "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sftp",
                          "scp"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote server host name.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the SSH port number to connect to.\n\nRequired.",
                    "maximum": 65536,
                    "minimum": 0
                  },
                  "usePrivateKey": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                  },
                  "passwordConnectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure password-based connection options for this SSH location.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "privateKeyFileLocationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "writerOptions": {
            "description": "Choose the file format to write.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "writeCompression": {
                    "description": "Choose whether to compress the written IOD data, and pick the compression level to use.\n\nRequired.\n\nValid values: `none`, `fastCompression`, `highCompression`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "fastCompression",
                          "highCompression"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "appendData": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Set this to append incoming data to the existing IOD file instead of writing a new file from scratch.\n\nRequired."
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "When appending to an IOD created in a different timezone, choose how to handle date and time fields across timezones. Use a conversion setting that preserves logical local dates and times, or keep the same absolute timestamp.\n\nRelevant when `appendData` equals `true`.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding for the output file. Defaults to UTF-8.\n\nRequired."
                  },
                  "writeBOM": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Write a byte-order mark at the start of UTF encoded files. Defaults to true.\n\nRelevant when `encoding` is in [UTF-8, UTF-16BE, UTF-16LE, UTF-16].\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character used to separate cells in each row; defaults to a comma. To write each row as a single field, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuoteCharacter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character used to quote cell values; defaults to a double quote. To disable quoting, and replace illegal characters with underscores, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the nested table data publishing options.",
                    "properties": {
                      "includeHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Include the header row when publishing the table data. Set this to false to write only the data rows.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "allowIllegal": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Allow invalid CSV output when quoting or separators are disabled. Defaults to false.\n\nRelevant when `cellQuoteCharacter` equals ``; when `cellSeparator` equals ``.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "writer": {
                    "description": "Choose how the spreadsheet is written. Use Omniscope for the standard writer, or Excel direct when you need direct Excel file output if available.\n\nRequired.\n\nValid values: `omniscope`, `excelJacobDirect`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "excelJacobDirect"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "publishMethod": {
                    "description": "Select how to update an existing Excel file. A new workbook is created when the file does not already exist.\n\nRequired.\n\nValid values: `replaceWorkbook`, `replaceWorksheet`, `replaceData`, `overwriteData`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "replaceWorkbook",
                          "replaceWorksheet",
                          "replaceData",
                          "overwriteData"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "sheetName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the worksheet name to write to in the Excel file.\n\nRequired."
                  },
                  "useTemporaryStagingFile": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable this when writing to a locally synchronised folder such as OneDrive. This writes through a temporary staging file to avoid save conflicts with the sync agent and Excel.\n\nRelevant when `writer` equals `excelJacobDirect`.\n\nRequired."
                  },
                  "insertDataAtRow": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the starting row for inserting data in the sheet.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "insertDataAtColumn": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the starting column for inserting data in the sheet.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data publishing options for how the data is written.",
                    "properties": {
                      "includeHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Include the header row when publishing the table data. Set this to false to write only the data rows.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "rWorkspaceDataRdataFile"
                  },
                  "compress": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Compress the .rdata file when writing it.\n\nRequired."
                  },
                  "dataName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name to assign to the data in the workspace file.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "fileConfiguration": {
                    "description": "Choose which file configuration to use when writing the .iok file. Select the default, target file, template file, or current file configuration as appropriate.\n\nRequired.\n\nValid values: `defaultFileConfig`, `targetFileConfig`, `templateFileConfig`, `currentFileConfig`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "defaultFileConfig",
                          "targetFileConfig",
                          "templateFileConfig",
                          "currentFileConfig"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "stronglyCompressed": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Write the file using strong compression.\n\nRequired."
                  },
                  "timeLimiting": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable file expiry based on a date and time.\n\nRequired."
                  },
                  "expiryDateTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the date and time when this file expires.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "serverPermissioning": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Require users to authenticate with a website before opening the file.\n\nRequired."
                  },
                  "serverUrl": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL text shown after the file has expired.\n\nRelevant when `serverPermissioning` equals `true`.\n\nRequired."
                  },
                  "domainLocked": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Restrict opening the file to specific domains.\n\nRequired."
                  },
                  "domainNames": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "List the domains that are allowed to host this file, separated by commas.\n\nRelevant when `domainLocked` equals `true`.\n\nRequired."
                  },
                  "warningOnSave": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Show a warning when the file is saved.\n\nRequired."
                  },
                  "warningText": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the warning text shown when the file is saved.\n\nRelevant when `warningOnSave` equals `true`.\n\nRequired."
                  },
                  "walledGarden": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the walled garden option to apply."
                  },
                  "showWelcomePage": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Show the server page after a successful login.\n\nRelevant when `serverPermissioning` equals `true`.\n\nRequired."
                  },
                  "ownerLocked": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Require a password to open the file.\n\nRequired."
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to lock the file.\n\nRelevant when `ownerLocked` equals `true`.\n\nRequired.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "confirmPassword": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nRepeat the file password to confirm it.\n\nRelevant when `ownerLocked` equals `true`.\n\nRequired.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "keepLinkHistory": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Keep link and history information in the file.\n\nRequired."
                  },
                  "refreshOnOpen": {
                    "description": "Choose when linked data should refresh when the file opens: never, auto-detect, or always.\n\nRelevant when `keepLinkHistory` equals `true`.\n\nRequired.\n\nValid values: `never`, `autoDetect`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "autoDetect",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "templateFile": {
                    "description": "Set the template file location to use when writing from a template. The template must be compatible with the published data.\n\nRelevant when `fileConfiguration` equals `templateFileConfig`.\n\nRequired.\n\nAllowed file types: .iok, .iom. To browse for a matching file, call `list_files({ forBlock: \"<this block>\", forOption: \"writerOptions.templateFile\" })` (use forType instead of forBlock for a not-yet-added block) - the listing is then auto-restricted to these types, so you do not need to pass the extensions yourself.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "fileInOmniscope"
                          },
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "urlHttpFtp"
                          },
                          "url": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                          },
                          "authentication": {
                            "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                            "anyOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "none"
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "basic"
                                  },
                                  "passwordConnectionOptions": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Enter the username to use for this connection."
                                      },
                                      "password": {
                                        "type": [
                                          "object",
                                          "null"
                                        ],
                                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                        "properties": {
                                          "secretUpdate": {
                                            "type": [
                                              "string",
                                              "null"
                                            ],
                                            "description": "The new secret. null leaves the stored one alone."
                                          }
                                        },
                                        "additionalProperties": false
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "bearerToken"
                                  },
                                  "bearerToken": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "@type": {
                                    "type": "string",
                                    "const": "oauth2ClientFlow"
                                  },
                                  "tokenEndpointUrl": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                                  },
                                  "clientId": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                                  },
                                  "clientSecret": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                                    "properties": {
                                      "secretUpdate": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The new secret. null leaves the stored one alone."
                                      }
                                    },
                                    "additionalProperties": false
                                  },
                                  "useStandardFlow": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                                  },
                                  "addBasicAuthHeader": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                                  },
                                  "addClientCredentialParams": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                                  },
                                  "requestHeaders": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom headers to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  },
                                  "requestParams": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Add custom parameters to the token request.",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "name": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                        },
                                        "value": {
                                          "type": [
                                            "string",
                                            "null"
                                          ],
                                          "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                        }
                                      },
                                      "additionalProperties": false
                                    }
                                  }
                                },
                                "additionalProperties": false,
                                "required": [
                                  "@type"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "preserveTemplateFormat": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Keep the template's field formatting and formulas when writing the file.\n\nRelevant when `fileConfiguration` equals `templateFileConfig`.\n\nRequired."
                  },
                  "requireServerTimeCheck": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Require an internet time server check before the file can be opened after expiry.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "allowAccessWithWarning": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Allow opening the expired file after showing a warning message.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "expiryMessage": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the message shown when the file has expired.\n\nRelevant when `timeLimiting` equals `true`.\n\nRequired."
                  },
                  "convertFormulasToStaticValues": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Convert formulas to static values when writing the file.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "tableauDataExtractTdeFile"
                  },
                  "publishMethod": {
                    "description": "Choose how to publish to an existing data extract file. Use Replace data to overwrite the existing extract, or Append data to add to it.\n\nRequired.\n\nValid values: `replaceData`, `appendData`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "replaceData",
                          "appendData"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheAvroAvroFile"
                  },
                  "recordName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the schema record name used with the namespace to uniquely identify the Avro record, such as person or transaction.\n\nRequired."
                  },
                  "recordNamespace": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the schema namespace that, together with the record name, uniquely identifies the Avro record. Use a namespace meaningful to your organisation, such as com.mycompany."
                  },
                  "compression": {
                    "description": "Choose the compression method for the Avro file: uncompressed, snappy, or deflate.\n\nRequired.\n\nValid values: `uncompressed`, `snappy`, `deflate`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "uncompressed",
                          "snappy",
                          "deflate"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "deflateLevel": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the deflate compression level from 1 to 9 when using deflate compression.\n\nRelevant when `compression` equals `deflate`.\n\nRequired.",
                    "maximum": 9,
                    "minimum": 1
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheParquetParquetFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_filePublisher_urlOutput",
        "description": "Options for a `filePublisher:urlOutput` block."
      },
      "BlockOptions_fileSource": {
        "type": "object",
        "properties": {
          "locationType": {
            "description": "Choose the source location type for the input file. Select the variant that matches where the file is stored, such as local, uploaded, URL, remote server, or cloud storage.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "UI-only: signals a human must upload a file via the app; the agent cannot fulfil this - pick a real location type instead (a file already in Omniscope, a URL, or a cloud source). Choose a file on your local computer or device, which must be uploaded to Omniscope before using it.",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "onYourComputerDevice"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "httpApiGetPost"
                  },
                  "requestMethod": {
                    "description": "Select the HTTP method used for this request, either GET or POST.\n\nRequired.\n\nValid values: `get`, `post`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "get",
                          "post"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "address": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the request URL to send the HTTP call to.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use for the request, or leave unset to send no authentication.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "httpHeaders": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add one or more HTTP headers to include with the request.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "headerName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, suggested values: A-IM, Accept, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Language, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-Control, Connection, Content-Encoding, .... Custom values are also accepted.\n\nSelect the HTTP header name to configure.\n\nRequired."
                        },
                        "headerValue": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to send for the selected HTTP header.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "timeoutSeconds": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the request timeout in seconds.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "postDataType": {
                    "description": "Choose the body format to use when the request method is POST.\n\nRelevant when `requestMethod` equals `post`.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "json"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the JSON payload to post. Provide the request body content for this block.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "plainText"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the plain text content to send in the POST body.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "xml"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the XML post body to send as the request content.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "remoteFileViaSshSftpScp"
                  },
                  "protocol": {
                    "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sftp",
                          "scp"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote server host name.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the SSH port number to connect to.\n\nRequired.",
                    "maximum": 65536,
                    "minimum": 0
                  },
                  "usePrivateKey": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                  },
                  "passwordConnectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure password-based connection options for this SSH location.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "privateKeyFileLocationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "embeddedDataFile"
                  },
                  "embeddedFile": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the embedded file to use as the data source for this block.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "archiveOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set archive extraction settings for compressed files such as ZIP archives. Leave unset for plain files.\n\nRequired.",
            "properties": {
              "archivePassword": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to encrypt or protect the archive file.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "readerType": {
            "description": "Choose how to read the file contents, such as delimited text, Excel, JSON, XML, or another supported reader type.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the file text encoding, which defaults to UTF-8.\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character that separates cells in each row; defaults to a comma. To read each line as a single cell, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuote": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the quote character used around cells; defaults to a double quote. For no quote character at all, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "fieldTypeDetection": {
                    "description": "Choose how field data types are detected. Defaults to sampling the first 10,000 records; you can also scan all records or treat all fields as text for faster import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data options in the nested table settings.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password required to open a protected workbook. Leave unset for unprotected files.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "readerType": {
                    "description": "Choose how to read the spreadsheet. Use the streaming option for large files, the Microsoft option for full formula support, or the legacy Microsoft option for older Omniscope behavior.\n\nRequired.\n\nValid values: `omniscope`, `microsoft`, `microsoftLegacy`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "microsoft",
                          "microsoftLegacy"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetSelection": {
                    "description": "Choose whether to import the first worksheet, append every worksheet, or append only selected worksheets.\n\nRequired.\n\nValid values: `first`, `all`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "first",
                          "all",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetNames": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the worksheet names to append when importing custom worksheets.\n\nRelevant when `worksheetSelection` equals `custom`.",
                    "items": {
                      "type": "string",
                      "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted."
                    }
                  },
                  "showWorksheetSourceField": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Create an output field containing the worksheet name each row came from. This is ignored when only one worksheet is imported.\n\nRequired."
                  },
                  "worksheetSourceFieldName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name of the output field that stores the worksheet name.\n\nRelevant when `showWorksheetSourceField` equals `true`.\n\nRequired."
                  },
                  "importOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table import options for the spreadsheet reader.\n\nRequired.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  },
                  "autoDetectDataTypes": {
                    "description": "Choose how to detect field types. Use the first 10,000 records for a faster import, scan all records for better detection, or type all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "Control how date and time values are handled when the IOD file was created in a different timezone. Use this to preserve logical local dates/times or to keep the same absolute point in time.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "jsonDataJsonFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be treated as records in the output. Paths are slash-delimited key names and `*` matches any single node at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be extracted as fields in the output, one path per field, relative to the whole document in the same slash-and-wildcard form as recordPath - e.g. `person/*/name`, `person/*/address/*/city`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the field name to use for this JSON path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the JSON path for the field value to read or write.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set preset JSON reader options when you want to use a predefined configuration.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "xmlDataXmlFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify the XML nodes that make up each output record. Paths are slash-delimited element names and `*` matches any single element at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the XML nodes to extract as fields within each record, one path per field, in the same slash-and-wildcard form as recordPath - and prefix an ATTRIBUTE with `@`: `root/a@id` is the `id` attribute of each `a`, `person/info@name` the `name` attribute of `info`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the name of the field to read or write in the XML path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the XML path used to locate the field value in the record.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set optional preset parsing options for XML input.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "textAsSingleCellTxtFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the character encoding used to decode the text file.\n\nRequired."
                  },
                  "removeHTMLTags": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Remove HTML tags from the file and keep only the text content.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password required to open the Omniscope Classic report and data file. Leave unset if the file is not password protected.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "formulaRecalculation": {
                    "description": "Choose how formulas are recalculated when reading the file: none, only formulas that change over time, or all formulas.\n\nRequired.\n\nValid values: `none`, `changeOverTime`, `all`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "changeOverTime",
                          "all"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeLegacyDataTableIsdFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheAvroAvroFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheParquetParquetFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "logFileLogFileExperimental"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding used to read the log file. Defaults to windows-1252.\n\nRequired."
                  },
                  "locale": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used when interpreting the log file's text and formatted values. Defaults to en_US."
                  },
                  "autoDetectFieldTypes": {
                    "description": "Choose how field data types are detected during import. Select a faster, shallower detection mode for large datasets, or keep all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "personalStorageTablePstFile"
                  },
                  "messageFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which message fields to retrieve from the PST file. Include Body only when you need message content, as it can slow the import.\n\nRequired.\n\nValid values: `folderName`, `senderName`, `senderEmail`, `displayTo`, `displayCc`, `displayBcc`, `messageDeliveryTime`, `subject`, `body`.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "folderName",
                        "senderName",
                        "senderEmail",
                        "displayTo",
                        "displayCc",
                        "displayBcc",
                        "messageDeliveryTime",
                        "subject",
                        "body"
                      ]
                    }
                  },
                  "maxMessages": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Limit how many messages are loaded from the PST file. Leave unset to load all messages.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "folderNameFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Load messages only from folders whose names contain this text. Leave unset to load messages from all folders."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sasTransportFormatXptFile"
                  },
                  "datasetIndex": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Select which dataset to read from the XPT file. Use 1 for the first dataset.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "useVariableLabelInsteadOfName": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use each variable's label as the output field name instead of its variable name when possible.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "retryOnIoError": {
            "type": [
              "object",
              "null"
            ],
            "description": "Enable retry settings for I/O errors when reading the input source. Use this to configure retries for temporary file or network access failures.\n\nRequired.",
            "properties": {
              "retryOnIoError": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable retries when an operation fails with an I/O error. Leave unset to disable I/O retrying."
              },
              "retryIntervalSeconds": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set how long to wait before each retry, in seconds. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "maxRetryAttempts": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of retry attempts after an I/O error. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "allowChangeDuringExecution": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Allow the source file to change while a single execution is running. Use this for files that are expected to be updated continuously, such as append-only logs."
              }
            },
            "additionalProperties": false
          },
          "disablePreviewData": {
            "type": [
              "object",
              "null"
            ],
            "description": "Disable preview data generation for this source. Set this when previewing the input is unnecessary or too expensive.\n\nRequired.",
            "properties": {
              "disablePreviewData": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Disable preview data generation for this block. Leave unset to keep generating sample preview data from the current file and options.\n\nRequired."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fileSource",
        "description": "Options for a `fileSource` block."
      },
      "BlockOptions_fileSource_amazonS3": {
        "type": "object",
        "properties": {
          "locationType": {
            "description": "Choose the source location type for the input file. Select the variant that matches where the file is stored, such as local, uploaded, URL, remote server, or cloud storage.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "UI-only: signals a human must upload a file via the app; the agent cannot fulfil this - pick a real location type instead (a file already in Omniscope, a URL, or a cloud source). Choose a file on your local computer or device, which must be uploaded to Omniscope before using it.",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "onYourComputerDevice"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "httpApiGetPost"
                  },
                  "requestMethod": {
                    "description": "Select the HTTP method used for this request, either GET or POST.\n\nRequired.\n\nValid values: `get`, `post`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "get",
                          "post"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "address": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the request URL to send the HTTP call to.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use for the request, or leave unset to send no authentication.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "httpHeaders": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add one or more HTTP headers to include with the request.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "headerName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, suggested values: A-IM, Accept, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Language, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-Control, Connection, Content-Encoding, .... Custom values are also accepted.\n\nSelect the HTTP header name to configure.\n\nRequired."
                        },
                        "headerValue": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to send for the selected HTTP header.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "timeoutSeconds": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the request timeout in seconds.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "postDataType": {
                    "description": "Choose the body format to use when the request method is POST.\n\nRelevant when `requestMethod` equals `post`.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "json"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the JSON payload to post. Provide the request body content for this block.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "plainText"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the plain text content to send in the POST body.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "xml"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the XML post body to send as the request content.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "remoteFileViaSshSftpScp"
                  },
                  "protocol": {
                    "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sftp",
                          "scp"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote server host name.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the SSH port number to connect to.\n\nRequired.",
                    "maximum": 65536,
                    "minimum": 0
                  },
                  "usePrivateKey": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                  },
                  "passwordConnectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure password-based connection options for this SSH location.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "privateKeyFileLocationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "embeddedDataFile"
                  },
                  "embeddedFile": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the embedded file to use as the data source for this block.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "archiveOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set archive extraction settings for compressed files such as ZIP archives. Leave unset for plain files.\n\nRequired.",
            "properties": {
              "archivePassword": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to encrypt or protect the archive file.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "readerType": {
            "description": "Choose how to read the file contents, such as delimited text, Excel, JSON, XML, or another supported reader type.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the file text encoding, which defaults to UTF-8.\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character that separates cells in each row; defaults to a comma. To read each line as a single cell, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuote": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the quote character used around cells; defaults to a double quote. For no quote character at all, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "fieldTypeDetection": {
                    "description": "Choose how field data types are detected. Defaults to sampling the first 10,000 records; you can also scan all records or treat all fields as text for faster import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data options in the nested table settings.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password required to open a protected workbook. Leave unset for unprotected files.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "readerType": {
                    "description": "Choose how to read the spreadsheet. Use the streaming option for large files, the Microsoft option for full formula support, or the legacy Microsoft option for older Omniscope behavior.\n\nRequired.\n\nValid values: `omniscope`, `microsoft`, `microsoftLegacy`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "microsoft",
                          "microsoftLegacy"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetSelection": {
                    "description": "Choose whether to import the first worksheet, append every worksheet, or append only selected worksheets.\n\nRequired.\n\nValid values: `first`, `all`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "first",
                          "all",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetNames": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the worksheet names to append when importing custom worksheets.\n\nRelevant when `worksheetSelection` equals `custom`.",
                    "items": {
                      "type": "string",
                      "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted."
                    }
                  },
                  "showWorksheetSourceField": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Create an output field containing the worksheet name each row came from. This is ignored when only one worksheet is imported.\n\nRequired."
                  },
                  "worksheetSourceFieldName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name of the output field that stores the worksheet name.\n\nRelevant when `showWorksheetSourceField` equals `true`.\n\nRequired."
                  },
                  "importOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table import options for the spreadsheet reader.\n\nRequired.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  },
                  "autoDetectDataTypes": {
                    "description": "Choose how to detect field types. Use the first 10,000 records for a faster import, scan all records for better detection, or type all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "Control how date and time values are handled when the IOD file was created in a different timezone. Use this to preserve logical local dates/times or to keep the same absolute point in time.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "jsonDataJsonFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be treated as records in the output. Paths are slash-delimited key names and `*` matches any single node at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be extracted as fields in the output, one path per field, relative to the whole document in the same slash-and-wildcard form as recordPath - e.g. `person/*/name`, `person/*/address/*/city`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the field name to use for this JSON path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the JSON path for the field value to read or write.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set preset JSON reader options when you want to use a predefined configuration.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "xmlDataXmlFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify the XML nodes that make up each output record. Paths are slash-delimited element names and `*` matches any single element at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the XML nodes to extract as fields within each record, one path per field, in the same slash-and-wildcard form as recordPath - and prefix an ATTRIBUTE with `@`: `root/a@id` is the `id` attribute of each `a`, `person/info@name` the `name` attribute of `info`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the name of the field to read or write in the XML path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the XML path used to locate the field value in the record.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set optional preset parsing options for XML input.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "textAsSingleCellTxtFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the character encoding used to decode the text file.\n\nRequired."
                  },
                  "removeHTMLTags": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Remove HTML tags from the file and keep only the text content.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password required to open the Omniscope Classic report and data file. Leave unset if the file is not password protected.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "formulaRecalculation": {
                    "description": "Choose how formulas are recalculated when reading the file: none, only formulas that change over time, or all formulas.\n\nRequired.\n\nValid values: `none`, `changeOverTime`, `all`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "changeOverTime",
                          "all"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeLegacyDataTableIsdFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheAvroAvroFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheParquetParquetFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "logFileLogFileExperimental"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding used to read the log file. Defaults to windows-1252.\n\nRequired."
                  },
                  "locale": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used when interpreting the log file's text and formatted values. Defaults to en_US."
                  },
                  "autoDetectFieldTypes": {
                    "description": "Choose how field data types are detected during import. Select a faster, shallower detection mode for large datasets, or keep all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "personalStorageTablePstFile"
                  },
                  "messageFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which message fields to retrieve from the PST file. Include Body only when you need message content, as it can slow the import.\n\nRequired.\n\nValid values: `folderName`, `senderName`, `senderEmail`, `displayTo`, `displayCc`, `displayBcc`, `messageDeliveryTime`, `subject`, `body`.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "folderName",
                        "senderName",
                        "senderEmail",
                        "displayTo",
                        "displayCc",
                        "displayBcc",
                        "messageDeliveryTime",
                        "subject",
                        "body"
                      ]
                    }
                  },
                  "maxMessages": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Limit how many messages are loaded from the PST file. Leave unset to load all messages.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "folderNameFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Load messages only from folders whose names contain this text. Leave unset to load messages from all folders."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sasTransportFormatXptFile"
                  },
                  "datasetIndex": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Select which dataset to read from the XPT file. Use 1 for the first dataset.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "useVariableLabelInsteadOfName": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use each variable's label as the output field name instead of its variable name when possible.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "retryOnIoError": {
            "type": [
              "object",
              "null"
            ],
            "description": "Enable retry settings for I/O errors when reading the input source. Use this to configure retries for temporary file or network access failures.\n\nRequired.",
            "properties": {
              "retryOnIoError": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable retries when an operation fails with an I/O error. Leave unset to disable I/O retrying."
              },
              "retryIntervalSeconds": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set how long to wait before each retry, in seconds. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "maxRetryAttempts": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of retry attempts after an I/O error. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "allowChangeDuringExecution": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Allow the source file to change while a single execution is running. Use this for files that are expected to be updated continuously, such as append-only logs."
              }
            },
            "additionalProperties": false
          },
          "disablePreviewData": {
            "type": [
              "object",
              "null"
            ],
            "description": "Disable preview data generation for this source. Set this when previewing the input is unnecessary or too expensive.\n\nRequired.",
            "properties": {
              "disablePreviewData": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Disable preview data generation for this block. Leave unset to keep generating sample preview data from the current file and options.\n\nRequired."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fileSource_amazonS3",
        "description": "Options for a `fileSource:amazonS3` block."
      },
      "BlockOptions_fileSource_api": {
        "type": "object",
        "properties": {
          "locationType": {
            "description": "Choose the source location type for the input file. Select the variant that matches where the file is stored, such as local, uploaded, URL, remote server, or cloud storage.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "UI-only: signals a human must upload a file via the app; the agent cannot fulfil this - pick a real location type instead (a file already in Omniscope, a URL, or a cloud source). Choose a file on your local computer or device, which must be uploaded to Omniscope before using it.",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "onYourComputerDevice"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "httpApiGetPost"
                  },
                  "requestMethod": {
                    "description": "Select the HTTP method used for this request, either GET or POST.\n\nRequired.\n\nValid values: `get`, `post`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "get",
                          "post"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "address": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the request URL to send the HTTP call to.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use for the request, or leave unset to send no authentication.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "httpHeaders": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add one or more HTTP headers to include with the request.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "headerName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, suggested values: A-IM, Accept, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Language, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-Control, Connection, Content-Encoding, .... Custom values are also accepted.\n\nSelect the HTTP header name to configure.\n\nRequired."
                        },
                        "headerValue": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to send for the selected HTTP header.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "timeoutSeconds": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the request timeout in seconds.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "postDataType": {
                    "description": "Choose the body format to use when the request method is POST.\n\nRelevant when `requestMethod` equals `post`.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "json"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the JSON payload to post. Provide the request body content for this block.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "plainText"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the plain text content to send in the POST body.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "xml"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the XML post body to send as the request content.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "remoteFileViaSshSftpScp"
                  },
                  "protocol": {
                    "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sftp",
                          "scp"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote server host name.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the SSH port number to connect to.\n\nRequired.",
                    "maximum": 65536,
                    "minimum": 0
                  },
                  "usePrivateKey": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                  },
                  "passwordConnectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure password-based connection options for this SSH location.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "privateKeyFileLocationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "embeddedDataFile"
                  },
                  "embeddedFile": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the embedded file to use as the data source for this block.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "archiveOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set archive extraction settings for compressed files such as ZIP archives. Leave unset for plain files.\n\nRequired.",
            "properties": {
              "archivePassword": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to encrypt or protect the archive file.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "readerType": {
            "description": "Choose how to read the file contents, such as delimited text, Excel, JSON, XML, or another supported reader type.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the file text encoding, which defaults to UTF-8.\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character that separates cells in each row; defaults to a comma. To read each line as a single cell, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuote": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the quote character used around cells; defaults to a double quote. For no quote character at all, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "fieldTypeDetection": {
                    "description": "Choose how field data types are detected. Defaults to sampling the first 10,000 records; you can also scan all records or treat all fields as text for faster import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data options in the nested table settings.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password required to open a protected workbook. Leave unset for unprotected files.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "readerType": {
                    "description": "Choose how to read the spreadsheet. Use the streaming option for large files, the Microsoft option for full formula support, or the legacy Microsoft option for older Omniscope behavior.\n\nRequired.\n\nValid values: `omniscope`, `microsoft`, `microsoftLegacy`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "microsoft",
                          "microsoftLegacy"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetSelection": {
                    "description": "Choose whether to import the first worksheet, append every worksheet, or append only selected worksheets.\n\nRequired.\n\nValid values: `first`, `all`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "first",
                          "all",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetNames": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the worksheet names to append when importing custom worksheets.\n\nRelevant when `worksheetSelection` equals `custom`.",
                    "items": {
                      "type": "string",
                      "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted."
                    }
                  },
                  "showWorksheetSourceField": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Create an output field containing the worksheet name each row came from. This is ignored when only one worksheet is imported.\n\nRequired."
                  },
                  "worksheetSourceFieldName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name of the output field that stores the worksheet name.\n\nRelevant when `showWorksheetSourceField` equals `true`.\n\nRequired."
                  },
                  "importOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table import options for the spreadsheet reader.\n\nRequired.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  },
                  "autoDetectDataTypes": {
                    "description": "Choose how to detect field types. Use the first 10,000 records for a faster import, scan all records for better detection, or type all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "Control how date and time values are handled when the IOD file was created in a different timezone. Use this to preserve logical local dates/times or to keep the same absolute point in time.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "jsonDataJsonFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be treated as records in the output. Paths are slash-delimited key names and `*` matches any single node at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be extracted as fields in the output, one path per field, relative to the whole document in the same slash-and-wildcard form as recordPath - e.g. `person/*/name`, `person/*/address/*/city`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the field name to use for this JSON path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the JSON path for the field value to read or write.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set preset JSON reader options when you want to use a predefined configuration.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "xmlDataXmlFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify the XML nodes that make up each output record. Paths are slash-delimited element names and `*` matches any single element at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the XML nodes to extract as fields within each record, one path per field, in the same slash-and-wildcard form as recordPath - and prefix an ATTRIBUTE with `@`: `root/a@id` is the `id` attribute of each `a`, `person/info@name` the `name` attribute of `info`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the name of the field to read or write in the XML path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the XML path used to locate the field value in the record.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set optional preset parsing options for XML input.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "textAsSingleCellTxtFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the character encoding used to decode the text file.\n\nRequired."
                  },
                  "removeHTMLTags": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Remove HTML tags from the file and keep only the text content.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password required to open the Omniscope Classic report and data file. Leave unset if the file is not password protected.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "formulaRecalculation": {
                    "description": "Choose how formulas are recalculated when reading the file: none, only formulas that change over time, or all formulas.\n\nRequired.\n\nValid values: `none`, `changeOverTime`, `all`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "changeOverTime",
                          "all"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeLegacyDataTableIsdFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheAvroAvroFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheParquetParquetFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "logFileLogFileExperimental"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding used to read the log file. Defaults to windows-1252.\n\nRequired."
                  },
                  "locale": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used when interpreting the log file's text and formatted values. Defaults to en_US."
                  },
                  "autoDetectFieldTypes": {
                    "description": "Choose how field data types are detected during import. Select a faster, shallower detection mode for large datasets, or keep all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "personalStorageTablePstFile"
                  },
                  "messageFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which message fields to retrieve from the PST file. Include Body only when you need message content, as it can slow the import.\n\nRequired.\n\nValid values: `folderName`, `senderName`, `senderEmail`, `displayTo`, `displayCc`, `displayBcc`, `messageDeliveryTime`, `subject`, `body`.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "folderName",
                        "senderName",
                        "senderEmail",
                        "displayTo",
                        "displayCc",
                        "displayBcc",
                        "messageDeliveryTime",
                        "subject",
                        "body"
                      ]
                    }
                  },
                  "maxMessages": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Limit how many messages are loaded from the PST file. Leave unset to load all messages.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "folderNameFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Load messages only from folders whose names contain this text. Leave unset to load messages from all folders."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sasTransportFormatXptFile"
                  },
                  "datasetIndex": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Select which dataset to read from the XPT file. Use 1 for the first dataset.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "useVariableLabelInsteadOfName": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use each variable's label as the output field name instead of its variable name when possible.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "retryOnIoError": {
            "type": [
              "object",
              "null"
            ],
            "description": "Enable retry settings for I/O errors when reading the input source. Use this to configure retries for temporary file or network access failures.\n\nRequired.",
            "properties": {
              "retryOnIoError": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable retries when an operation fails with an I/O error. Leave unset to disable I/O retrying."
              },
              "retryIntervalSeconds": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set how long to wait before each retry, in seconds. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "maxRetryAttempts": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of retry attempts after an I/O error. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "allowChangeDuringExecution": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Allow the source file to change while a single execution is running. Use this for files that are expected to be updated continuously, such as append-only logs."
              }
            },
            "additionalProperties": false
          },
          "disablePreviewData": {
            "type": [
              "object",
              "null"
            ],
            "description": "Disable preview data generation for this source. Set this when previewing the input is unnecessary or too expensive.\n\nRequired.",
            "properties": {
              "disablePreviewData": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Disable preview data generation for this block. Leave unset to keep generating sample preview data from the current file and options.\n\nRequired."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fileSource_api",
        "description": "Options for a `fileSource:api` block."
      },
      "BlockOptions_fileSource_azureGen2Storage": {
        "type": "object",
        "properties": {
          "locationType": {
            "description": "Choose the source location type for the input file. Select the variant that matches where the file is stored, such as local, uploaded, URL, remote server, or cloud storage.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "UI-only: signals a human must upload a file via the app; the agent cannot fulfil this - pick a real location type instead (a file already in Omniscope, a URL, or a cloud source). Choose a file on your local computer or device, which must be uploaded to Omniscope before using it.",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "onYourComputerDevice"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "httpApiGetPost"
                  },
                  "requestMethod": {
                    "description": "Select the HTTP method used for this request, either GET or POST.\n\nRequired.\n\nValid values: `get`, `post`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "get",
                          "post"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "address": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the request URL to send the HTTP call to.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use for the request, or leave unset to send no authentication.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "httpHeaders": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add one or more HTTP headers to include with the request.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "headerName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, suggested values: A-IM, Accept, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Language, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-Control, Connection, Content-Encoding, .... Custom values are also accepted.\n\nSelect the HTTP header name to configure.\n\nRequired."
                        },
                        "headerValue": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to send for the selected HTTP header.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "timeoutSeconds": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the request timeout in seconds.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "postDataType": {
                    "description": "Choose the body format to use when the request method is POST.\n\nRelevant when `requestMethod` equals `post`.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "json"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the JSON payload to post. Provide the request body content for this block.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "plainText"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the plain text content to send in the POST body.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "xml"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the XML post body to send as the request content.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "remoteFileViaSshSftpScp"
                  },
                  "protocol": {
                    "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sftp",
                          "scp"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote server host name.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the SSH port number to connect to.\n\nRequired.",
                    "maximum": 65536,
                    "minimum": 0
                  },
                  "usePrivateKey": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                  },
                  "passwordConnectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure password-based connection options for this SSH location.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "privateKeyFileLocationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "embeddedDataFile"
                  },
                  "embeddedFile": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the embedded file to use as the data source for this block.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "archiveOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set archive extraction settings for compressed files such as ZIP archives. Leave unset for plain files.\n\nRequired.",
            "properties": {
              "archivePassword": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to encrypt or protect the archive file.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "readerType": {
            "description": "Choose how to read the file contents, such as delimited text, Excel, JSON, XML, or another supported reader type.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the file text encoding, which defaults to UTF-8.\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character that separates cells in each row; defaults to a comma. To read each line as a single cell, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuote": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the quote character used around cells; defaults to a double quote. For no quote character at all, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "fieldTypeDetection": {
                    "description": "Choose how field data types are detected. Defaults to sampling the first 10,000 records; you can also scan all records or treat all fields as text for faster import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data options in the nested table settings.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password required to open a protected workbook. Leave unset for unprotected files.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "readerType": {
                    "description": "Choose how to read the spreadsheet. Use the streaming option for large files, the Microsoft option for full formula support, or the legacy Microsoft option for older Omniscope behavior.\n\nRequired.\n\nValid values: `omniscope`, `microsoft`, `microsoftLegacy`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "microsoft",
                          "microsoftLegacy"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetSelection": {
                    "description": "Choose whether to import the first worksheet, append every worksheet, or append only selected worksheets.\n\nRequired.\n\nValid values: `first`, `all`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "first",
                          "all",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetNames": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the worksheet names to append when importing custom worksheets.\n\nRelevant when `worksheetSelection` equals `custom`.",
                    "items": {
                      "type": "string",
                      "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted."
                    }
                  },
                  "showWorksheetSourceField": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Create an output field containing the worksheet name each row came from. This is ignored when only one worksheet is imported.\n\nRequired."
                  },
                  "worksheetSourceFieldName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name of the output field that stores the worksheet name.\n\nRelevant when `showWorksheetSourceField` equals `true`.\n\nRequired."
                  },
                  "importOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table import options for the spreadsheet reader.\n\nRequired.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  },
                  "autoDetectDataTypes": {
                    "description": "Choose how to detect field types. Use the first 10,000 records for a faster import, scan all records for better detection, or type all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "Control how date and time values are handled when the IOD file was created in a different timezone. Use this to preserve logical local dates/times or to keep the same absolute point in time.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "jsonDataJsonFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be treated as records in the output. Paths are slash-delimited key names and `*` matches any single node at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be extracted as fields in the output, one path per field, relative to the whole document in the same slash-and-wildcard form as recordPath - e.g. `person/*/name`, `person/*/address/*/city`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the field name to use for this JSON path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the JSON path for the field value to read or write.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set preset JSON reader options when you want to use a predefined configuration.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "xmlDataXmlFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify the XML nodes that make up each output record. Paths are slash-delimited element names and `*` matches any single element at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the XML nodes to extract as fields within each record, one path per field, in the same slash-and-wildcard form as recordPath - and prefix an ATTRIBUTE with `@`: `root/a@id` is the `id` attribute of each `a`, `person/info@name` the `name` attribute of `info`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the name of the field to read or write in the XML path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the XML path used to locate the field value in the record.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set optional preset parsing options for XML input.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "textAsSingleCellTxtFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the character encoding used to decode the text file.\n\nRequired."
                  },
                  "removeHTMLTags": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Remove HTML tags from the file and keep only the text content.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password required to open the Omniscope Classic report and data file. Leave unset if the file is not password protected.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "formulaRecalculation": {
                    "description": "Choose how formulas are recalculated when reading the file: none, only formulas that change over time, or all formulas.\n\nRequired.\n\nValid values: `none`, `changeOverTime`, `all`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "changeOverTime",
                          "all"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeLegacyDataTableIsdFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheAvroAvroFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheParquetParquetFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "logFileLogFileExperimental"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding used to read the log file. Defaults to windows-1252.\n\nRequired."
                  },
                  "locale": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used when interpreting the log file's text and formatted values. Defaults to en_US."
                  },
                  "autoDetectFieldTypes": {
                    "description": "Choose how field data types are detected during import. Select a faster, shallower detection mode for large datasets, or keep all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "personalStorageTablePstFile"
                  },
                  "messageFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which message fields to retrieve from the PST file. Include Body only when you need message content, as it can slow the import.\n\nRequired.\n\nValid values: `folderName`, `senderName`, `senderEmail`, `displayTo`, `displayCc`, `displayBcc`, `messageDeliveryTime`, `subject`, `body`.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "folderName",
                        "senderName",
                        "senderEmail",
                        "displayTo",
                        "displayCc",
                        "displayBcc",
                        "messageDeliveryTime",
                        "subject",
                        "body"
                      ]
                    }
                  },
                  "maxMessages": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Limit how many messages are loaded from the PST file. Leave unset to load all messages.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "folderNameFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Load messages only from folders whose names contain this text. Leave unset to load messages from all folders."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sasTransportFormatXptFile"
                  },
                  "datasetIndex": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Select which dataset to read from the XPT file. Use 1 for the first dataset.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "useVariableLabelInsteadOfName": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use each variable's label as the output field name instead of its variable name when possible.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "retryOnIoError": {
            "type": [
              "object",
              "null"
            ],
            "description": "Enable retry settings for I/O errors when reading the input source. Use this to configure retries for temporary file or network access failures.\n\nRequired.",
            "properties": {
              "retryOnIoError": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable retries when an operation fails with an I/O error. Leave unset to disable I/O retrying."
              },
              "retryIntervalSeconds": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set how long to wait before each retry, in seconds. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "maxRetryAttempts": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of retry attempts after an I/O error. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "allowChangeDuringExecution": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Allow the source file to change while a single execution is running. Use this for files that are expected to be updated continuously, such as append-only logs."
              }
            },
            "additionalProperties": false
          },
          "disablePreviewData": {
            "type": [
              "object",
              "null"
            ],
            "description": "Disable preview data generation for this source. Set this when previewing the input is unnecessary or too expensive.\n\nRequired.",
            "properties": {
              "disablePreviewData": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Disable preview data generation for this block. Leave unset to keep generating sample preview data from the current file and options.\n\nRequired."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fileSource_azureGen2Storage",
        "description": "Options for a `fileSource:azureGen2Storage` block."
      },
      "BlockOptions_fileSource_dropboxExperimental": {
        "type": "object",
        "properties": {
          "locationType": {
            "description": "Choose the source location type for the input file. Select the variant that matches where the file is stored, such as local, uploaded, URL, remote server, or cloud storage.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "UI-only: signals a human must upload a file via the app; the agent cannot fulfil this - pick a real location type instead (a file already in Omniscope, a URL, or a cloud source). Choose a file on your local computer or device, which must be uploaded to Omniscope before using it.",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "onYourComputerDevice"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "httpApiGetPost"
                  },
                  "requestMethod": {
                    "description": "Select the HTTP method used for this request, either GET or POST.\n\nRequired.\n\nValid values: `get`, `post`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "get",
                          "post"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "address": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the request URL to send the HTTP call to.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use for the request, or leave unset to send no authentication.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "httpHeaders": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add one or more HTTP headers to include with the request.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "headerName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, suggested values: A-IM, Accept, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Language, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-Control, Connection, Content-Encoding, .... Custom values are also accepted.\n\nSelect the HTTP header name to configure.\n\nRequired."
                        },
                        "headerValue": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to send for the selected HTTP header.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "timeoutSeconds": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the request timeout in seconds.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "postDataType": {
                    "description": "Choose the body format to use when the request method is POST.\n\nRelevant when `requestMethod` equals `post`.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "json"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the JSON payload to post. Provide the request body content for this block.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "plainText"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the plain text content to send in the POST body.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "xml"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the XML post body to send as the request content.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "remoteFileViaSshSftpScp"
                  },
                  "protocol": {
                    "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sftp",
                          "scp"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote server host name.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the SSH port number to connect to.\n\nRequired.",
                    "maximum": 65536,
                    "minimum": 0
                  },
                  "usePrivateKey": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                  },
                  "passwordConnectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure password-based connection options for this SSH location.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "privateKeyFileLocationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "embeddedDataFile"
                  },
                  "embeddedFile": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the embedded file to use as the data source for this block.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "archiveOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set archive extraction settings for compressed files such as ZIP archives. Leave unset for plain files.\n\nRequired.",
            "properties": {
              "archivePassword": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to encrypt or protect the archive file.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "readerType": {
            "description": "Choose how to read the file contents, such as delimited text, Excel, JSON, XML, or another supported reader type.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the file text encoding, which defaults to UTF-8.\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character that separates cells in each row; defaults to a comma. To read each line as a single cell, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuote": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the quote character used around cells; defaults to a double quote. For no quote character at all, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "fieldTypeDetection": {
                    "description": "Choose how field data types are detected. Defaults to sampling the first 10,000 records; you can also scan all records or treat all fields as text for faster import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data options in the nested table settings.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password required to open a protected workbook. Leave unset for unprotected files.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "readerType": {
                    "description": "Choose how to read the spreadsheet. Use the streaming option for large files, the Microsoft option for full formula support, or the legacy Microsoft option for older Omniscope behavior.\n\nRequired.\n\nValid values: `omniscope`, `microsoft`, `microsoftLegacy`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "microsoft",
                          "microsoftLegacy"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetSelection": {
                    "description": "Choose whether to import the first worksheet, append every worksheet, or append only selected worksheets.\n\nRequired.\n\nValid values: `first`, `all`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "first",
                          "all",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetNames": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the worksheet names to append when importing custom worksheets.\n\nRelevant when `worksheetSelection` equals `custom`.",
                    "items": {
                      "type": "string",
                      "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted."
                    }
                  },
                  "showWorksheetSourceField": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Create an output field containing the worksheet name each row came from. This is ignored when only one worksheet is imported.\n\nRequired."
                  },
                  "worksheetSourceFieldName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name of the output field that stores the worksheet name.\n\nRelevant when `showWorksheetSourceField` equals `true`.\n\nRequired."
                  },
                  "importOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table import options for the spreadsheet reader.\n\nRequired.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  },
                  "autoDetectDataTypes": {
                    "description": "Choose how to detect field types. Use the first 10,000 records for a faster import, scan all records for better detection, or type all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "Control how date and time values are handled when the IOD file was created in a different timezone. Use this to preserve logical local dates/times or to keep the same absolute point in time.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "jsonDataJsonFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be treated as records in the output. Paths are slash-delimited key names and `*` matches any single node at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be extracted as fields in the output, one path per field, relative to the whole document in the same slash-and-wildcard form as recordPath - e.g. `person/*/name`, `person/*/address/*/city`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the field name to use for this JSON path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the JSON path for the field value to read or write.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set preset JSON reader options when you want to use a predefined configuration.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "xmlDataXmlFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify the XML nodes that make up each output record. Paths are slash-delimited element names and `*` matches any single element at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the XML nodes to extract as fields within each record, one path per field, in the same slash-and-wildcard form as recordPath - and prefix an ATTRIBUTE with `@`: `root/a@id` is the `id` attribute of each `a`, `person/info@name` the `name` attribute of `info`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the name of the field to read or write in the XML path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the XML path used to locate the field value in the record.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set optional preset parsing options for XML input.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "textAsSingleCellTxtFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the character encoding used to decode the text file.\n\nRequired."
                  },
                  "removeHTMLTags": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Remove HTML tags from the file and keep only the text content.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password required to open the Omniscope Classic report and data file. Leave unset if the file is not password protected.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "formulaRecalculation": {
                    "description": "Choose how formulas are recalculated when reading the file: none, only formulas that change over time, or all formulas.\n\nRequired.\n\nValid values: `none`, `changeOverTime`, `all`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "changeOverTime",
                          "all"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeLegacyDataTableIsdFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheAvroAvroFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheParquetParquetFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "logFileLogFileExperimental"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding used to read the log file. Defaults to windows-1252.\n\nRequired."
                  },
                  "locale": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used when interpreting the log file's text and formatted values. Defaults to en_US."
                  },
                  "autoDetectFieldTypes": {
                    "description": "Choose how field data types are detected during import. Select a faster, shallower detection mode for large datasets, or keep all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "personalStorageTablePstFile"
                  },
                  "messageFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which message fields to retrieve from the PST file. Include Body only when you need message content, as it can slow the import.\n\nRequired.\n\nValid values: `folderName`, `senderName`, `senderEmail`, `displayTo`, `displayCc`, `displayBcc`, `messageDeliveryTime`, `subject`, `body`.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "folderName",
                        "senderName",
                        "senderEmail",
                        "displayTo",
                        "displayCc",
                        "displayBcc",
                        "messageDeliveryTime",
                        "subject",
                        "body"
                      ]
                    }
                  },
                  "maxMessages": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Limit how many messages are loaded from the PST file. Leave unset to load all messages.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "folderNameFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Load messages only from folders whose names contain this text. Leave unset to load messages from all folders."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sasTransportFormatXptFile"
                  },
                  "datasetIndex": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Select which dataset to read from the XPT file. Use 1 for the first dataset.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "useVariableLabelInsteadOfName": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use each variable's label as the output field name instead of its variable name when possible.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "retryOnIoError": {
            "type": [
              "object",
              "null"
            ],
            "description": "Enable retry settings for I/O errors when reading the input source. Use this to configure retries for temporary file or network access failures.\n\nRequired.",
            "properties": {
              "retryOnIoError": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable retries when an operation fails with an I/O error. Leave unset to disable I/O retrying."
              },
              "retryIntervalSeconds": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set how long to wait before each retry, in seconds. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "maxRetryAttempts": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of retry attempts after an I/O error. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "allowChangeDuringExecution": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Allow the source file to change while a single execution is running. Use this for files that are expected to be updated continuously, such as append-only logs."
              }
            },
            "additionalProperties": false
          },
          "disablePreviewData": {
            "type": [
              "object",
              "null"
            ],
            "description": "Disable preview data generation for this source. Set this when previewing the input is unnecessary or too expensive.\n\nRequired.",
            "properties": {
              "disablePreviewData": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Disable preview data generation for this block. Leave unset to keep generating sample preview data from the current file and options.\n\nRequired."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fileSource_dropboxExperimental",
        "description": "Options for a `fileSource:dropboxExperimental` block."
      },
      "BlockOptions_fileSource_embeddedDataFile": {
        "type": "object",
        "properties": {
          "locationType": {
            "description": "Choose the source location type for the input file. Select the variant that matches where the file is stored, such as local, uploaded, URL, remote server, or cloud storage.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "UI-only: signals a human must upload a file via the app; the agent cannot fulfil this - pick a real location type instead (a file already in Omniscope, a URL, or a cloud source). Choose a file on your local computer or device, which must be uploaded to Omniscope before using it.",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "onYourComputerDevice"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "httpApiGetPost"
                  },
                  "requestMethod": {
                    "description": "Select the HTTP method used for this request, either GET or POST.\n\nRequired.\n\nValid values: `get`, `post`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "get",
                          "post"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "address": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the request URL to send the HTTP call to.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use for the request, or leave unset to send no authentication.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "httpHeaders": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add one or more HTTP headers to include with the request.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "headerName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, suggested values: A-IM, Accept, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Language, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-Control, Connection, Content-Encoding, .... Custom values are also accepted.\n\nSelect the HTTP header name to configure.\n\nRequired."
                        },
                        "headerValue": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to send for the selected HTTP header.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "timeoutSeconds": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the request timeout in seconds.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "postDataType": {
                    "description": "Choose the body format to use when the request method is POST.\n\nRelevant when `requestMethod` equals `post`.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "json"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the JSON payload to post. Provide the request body content for this block.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "plainText"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the plain text content to send in the POST body.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "xml"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the XML post body to send as the request content.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "remoteFileViaSshSftpScp"
                  },
                  "protocol": {
                    "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sftp",
                          "scp"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote server host name.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the SSH port number to connect to.\n\nRequired.",
                    "maximum": 65536,
                    "minimum": 0
                  },
                  "usePrivateKey": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                  },
                  "passwordConnectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure password-based connection options for this SSH location.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "privateKeyFileLocationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "embeddedDataFile"
                  },
                  "embeddedFile": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the embedded file to use as the data source for this block.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "archiveOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set archive extraction settings for compressed files such as ZIP archives. Leave unset for plain files.\n\nRequired.",
            "properties": {
              "archivePassword": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to encrypt or protect the archive file.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "readerType": {
            "description": "Choose how to read the file contents, such as delimited text, Excel, JSON, XML, or another supported reader type.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the file text encoding, which defaults to UTF-8.\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character that separates cells in each row; defaults to a comma. To read each line as a single cell, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuote": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the quote character used around cells; defaults to a double quote. For no quote character at all, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "fieldTypeDetection": {
                    "description": "Choose how field data types are detected. Defaults to sampling the first 10,000 records; you can also scan all records or treat all fields as text for faster import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data options in the nested table settings.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password required to open a protected workbook. Leave unset for unprotected files.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "readerType": {
                    "description": "Choose how to read the spreadsheet. Use the streaming option for large files, the Microsoft option for full formula support, or the legacy Microsoft option for older Omniscope behavior.\n\nRequired.\n\nValid values: `omniscope`, `microsoft`, `microsoftLegacy`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "microsoft",
                          "microsoftLegacy"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetSelection": {
                    "description": "Choose whether to import the first worksheet, append every worksheet, or append only selected worksheets.\n\nRequired.\n\nValid values: `first`, `all`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "first",
                          "all",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetNames": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the worksheet names to append when importing custom worksheets.\n\nRelevant when `worksheetSelection` equals `custom`.",
                    "items": {
                      "type": "string",
                      "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted."
                    }
                  },
                  "showWorksheetSourceField": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Create an output field containing the worksheet name each row came from. This is ignored when only one worksheet is imported.\n\nRequired."
                  },
                  "worksheetSourceFieldName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name of the output field that stores the worksheet name.\n\nRelevant when `showWorksheetSourceField` equals `true`.\n\nRequired."
                  },
                  "importOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table import options for the spreadsheet reader.\n\nRequired.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  },
                  "autoDetectDataTypes": {
                    "description": "Choose how to detect field types. Use the first 10,000 records for a faster import, scan all records for better detection, or type all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "Control how date and time values are handled when the IOD file was created in a different timezone. Use this to preserve logical local dates/times or to keep the same absolute point in time.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "jsonDataJsonFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be treated as records in the output. Paths are slash-delimited key names and `*` matches any single node at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be extracted as fields in the output, one path per field, relative to the whole document in the same slash-and-wildcard form as recordPath - e.g. `person/*/name`, `person/*/address/*/city`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the field name to use for this JSON path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the JSON path for the field value to read or write.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set preset JSON reader options when you want to use a predefined configuration.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "xmlDataXmlFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify the XML nodes that make up each output record. Paths are slash-delimited element names and `*` matches any single element at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the XML nodes to extract as fields within each record, one path per field, in the same slash-and-wildcard form as recordPath - and prefix an ATTRIBUTE with `@`: `root/a@id` is the `id` attribute of each `a`, `person/info@name` the `name` attribute of `info`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the name of the field to read or write in the XML path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the XML path used to locate the field value in the record.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set optional preset parsing options for XML input.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "textAsSingleCellTxtFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the character encoding used to decode the text file.\n\nRequired."
                  },
                  "removeHTMLTags": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Remove HTML tags from the file and keep only the text content.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password required to open the Omniscope Classic report and data file. Leave unset if the file is not password protected.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "formulaRecalculation": {
                    "description": "Choose how formulas are recalculated when reading the file: none, only formulas that change over time, or all formulas.\n\nRequired.\n\nValid values: `none`, `changeOverTime`, `all`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "changeOverTime",
                          "all"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeLegacyDataTableIsdFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheAvroAvroFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheParquetParquetFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "logFileLogFileExperimental"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding used to read the log file. Defaults to windows-1252.\n\nRequired."
                  },
                  "locale": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used when interpreting the log file's text and formatted values. Defaults to en_US."
                  },
                  "autoDetectFieldTypes": {
                    "description": "Choose how field data types are detected during import. Select a faster, shallower detection mode for large datasets, or keep all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "personalStorageTablePstFile"
                  },
                  "messageFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which message fields to retrieve from the PST file. Include Body only when you need message content, as it can slow the import.\n\nRequired.\n\nValid values: `folderName`, `senderName`, `senderEmail`, `displayTo`, `displayCc`, `displayBcc`, `messageDeliveryTime`, `subject`, `body`.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "folderName",
                        "senderName",
                        "senderEmail",
                        "displayTo",
                        "displayCc",
                        "displayBcc",
                        "messageDeliveryTime",
                        "subject",
                        "body"
                      ]
                    }
                  },
                  "maxMessages": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Limit how many messages are loaded from the PST file. Leave unset to load all messages.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "folderNameFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Load messages only from folders whose names contain this text. Leave unset to load messages from all folders."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sasTransportFormatXptFile"
                  },
                  "datasetIndex": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Select which dataset to read from the XPT file. Use 1 for the first dataset.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "useVariableLabelInsteadOfName": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use each variable's label as the output field name instead of its variable name when possible.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "retryOnIoError": {
            "type": [
              "object",
              "null"
            ],
            "description": "Enable retry settings for I/O errors when reading the input source. Use this to configure retries for temporary file or network access failures.\n\nRequired.",
            "properties": {
              "retryOnIoError": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable retries when an operation fails with an I/O error. Leave unset to disable I/O retrying."
              },
              "retryIntervalSeconds": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set how long to wait before each retry, in seconds. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "maxRetryAttempts": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of retry attempts after an I/O error. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "allowChangeDuringExecution": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Allow the source file to change while a single execution is running. Use this for files that are expected to be updated continuously, such as append-only logs."
              }
            },
            "additionalProperties": false
          },
          "disablePreviewData": {
            "type": [
              "object",
              "null"
            ],
            "description": "Disable preview data generation for this source. Set this when previewing the input is unnecessary or too expensive.\n\nRequired.",
            "properties": {
              "disablePreviewData": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Disable preview data generation for this block. Leave unset to keep generating sample preview data from the current file and options.\n\nRequired."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fileSource_embeddedDataFile",
        "description": "Options for a `fileSource:embeddedDataFile` block."
      },
      "BlockOptions_fileSource_file": {
        "type": "object",
        "properties": {
          "locationType": {
            "description": "Choose the source location type for the input file. Select the variant that matches where the file is stored, such as local, uploaded, URL, remote server, or cloud storage.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "UI-only: signals a human must upload a file via the app; the agent cannot fulfil this - pick a real location type instead (a file already in Omniscope, a URL, or a cloud source). Choose a file on your local computer or device, which must be uploaded to Omniscope before using it.",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "onYourComputerDevice"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "httpApiGetPost"
                  },
                  "requestMethod": {
                    "description": "Select the HTTP method used for this request, either GET or POST.\n\nRequired.\n\nValid values: `get`, `post`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "get",
                          "post"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "address": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the request URL to send the HTTP call to.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use for the request, or leave unset to send no authentication.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "httpHeaders": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add one or more HTTP headers to include with the request.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "headerName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, suggested values: A-IM, Accept, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Language, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-Control, Connection, Content-Encoding, .... Custom values are also accepted.\n\nSelect the HTTP header name to configure.\n\nRequired."
                        },
                        "headerValue": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to send for the selected HTTP header.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "timeoutSeconds": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the request timeout in seconds.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "postDataType": {
                    "description": "Choose the body format to use when the request method is POST.\n\nRelevant when `requestMethod` equals `post`.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "json"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the JSON payload to post. Provide the request body content for this block.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "plainText"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the plain text content to send in the POST body.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "xml"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the XML post body to send as the request content.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "remoteFileViaSshSftpScp"
                  },
                  "protocol": {
                    "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sftp",
                          "scp"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote server host name.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the SSH port number to connect to.\n\nRequired.",
                    "maximum": 65536,
                    "minimum": 0
                  },
                  "usePrivateKey": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                  },
                  "passwordConnectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure password-based connection options for this SSH location.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "privateKeyFileLocationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "embeddedDataFile"
                  },
                  "embeddedFile": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the embedded file to use as the data source for this block.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "archiveOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set archive extraction settings for compressed files such as ZIP archives. Leave unset for plain files.\n\nRequired.",
            "properties": {
              "archivePassword": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to encrypt or protect the archive file.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "readerType": {
            "description": "Choose how to read the file contents, such as delimited text, Excel, JSON, XML, or another supported reader type.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the file text encoding, which defaults to UTF-8.\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character that separates cells in each row; defaults to a comma. To read each line as a single cell, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuote": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the quote character used around cells; defaults to a double quote. For no quote character at all, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "fieldTypeDetection": {
                    "description": "Choose how field data types are detected. Defaults to sampling the first 10,000 records; you can also scan all records or treat all fields as text for faster import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data options in the nested table settings.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password required to open a protected workbook. Leave unset for unprotected files.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "readerType": {
                    "description": "Choose how to read the spreadsheet. Use the streaming option for large files, the Microsoft option for full formula support, or the legacy Microsoft option for older Omniscope behavior.\n\nRequired.\n\nValid values: `omniscope`, `microsoft`, `microsoftLegacy`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "microsoft",
                          "microsoftLegacy"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetSelection": {
                    "description": "Choose whether to import the first worksheet, append every worksheet, or append only selected worksheets.\n\nRequired.\n\nValid values: `first`, `all`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "first",
                          "all",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetNames": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the worksheet names to append when importing custom worksheets.\n\nRelevant when `worksheetSelection` equals `custom`.",
                    "items": {
                      "type": "string",
                      "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted."
                    }
                  },
                  "showWorksheetSourceField": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Create an output field containing the worksheet name each row came from. This is ignored when only one worksheet is imported.\n\nRequired."
                  },
                  "worksheetSourceFieldName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name of the output field that stores the worksheet name.\n\nRelevant when `showWorksheetSourceField` equals `true`.\n\nRequired."
                  },
                  "importOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table import options for the spreadsheet reader.\n\nRequired.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  },
                  "autoDetectDataTypes": {
                    "description": "Choose how to detect field types. Use the first 10,000 records for a faster import, scan all records for better detection, or type all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "Control how date and time values are handled when the IOD file was created in a different timezone. Use this to preserve logical local dates/times or to keep the same absolute point in time.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "jsonDataJsonFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be treated as records in the output. Paths are slash-delimited key names and `*` matches any single node at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be extracted as fields in the output, one path per field, relative to the whole document in the same slash-and-wildcard form as recordPath - e.g. `person/*/name`, `person/*/address/*/city`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the field name to use for this JSON path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the JSON path for the field value to read or write.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set preset JSON reader options when you want to use a predefined configuration.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "xmlDataXmlFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify the XML nodes that make up each output record. Paths are slash-delimited element names and `*` matches any single element at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the XML nodes to extract as fields within each record, one path per field, in the same slash-and-wildcard form as recordPath - and prefix an ATTRIBUTE with `@`: `root/a@id` is the `id` attribute of each `a`, `person/info@name` the `name` attribute of `info`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the name of the field to read or write in the XML path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the XML path used to locate the field value in the record.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set optional preset parsing options for XML input.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "textAsSingleCellTxtFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the character encoding used to decode the text file.\n\nRequired."
                  },
                  "removeHTMLTags": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Remove HTML tags from the file and keep only the text content.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password required to open the Omniscope Classic report and data file. Leave unset if the file is not password protected.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "formulaRecalculation": {
                    "description": "Choose how formulas are recalculated when reading the file: none, only formulas that change over time, or all formulas.\n\nRequired.\n\nValid values: `none`, `changeOverTime`, `all`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "changeOverTime",
                          "all"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeLegacyDataTableIsdFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheAvroAvroFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheParquetParquetFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "logFileLogFileExperimental"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding used to read the log file. Defaults to windows-1252.\n\nRequired."
                  },
                  "locale": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used when interpreting the log file's text and formatted values. Defaults to en_US."
                  },
                  "autoDetectFieldTypes": {
                    "description": "Choose how field data types are detected during import. Select a faster, shallower detection mode for large datasets, or keep all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "personalStorageTablePstFile"
                  },
                  "messageFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which message fields to retrieve from the PST file. Include Body only when you need message content, as it can slow the import.\n\nRequired.\n\nValid values: `folderName`, `senderName`, `senderEmail`, `displayTo`, `displayCc`, `displayBcc`, `messageDeliveryTime`, `subject`, `body`.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "folderName",
                        "senderName",
                        "senderEmail",
                        "displayTo",
                        "displayCc",
                        "displayBcc",
                        "messageDeliveryTime",
                        "subject",
                        "body"
                      ]
                    }
                  },
                  "maxMessages": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Limit how many messages are loaded from the PST file. Leave unset to load all messages.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "folderNameFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Load messages only from folders whose names contain this text. Leave unset to load messages from all folders."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sasTransportFormatXptFile"
                  },
                  "datasetIndex": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Select which dataset to read from the XPT file. Use 1 for the first dataset.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "useVariableLabelInsteadOfName": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use each variable's label as the output field name instead of its variable name when possible.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "retryOnIoError": {
            "type": [
              "object",
              "null"
            ],
            "description": "Enable retry settings for I/O errors when reading the input source. Use this to configure retries for temporary file or network access failures.\n\nRequired.",
            "properties": {
              "retryOnIoError": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable retries when an operation fails with an I/O error. Leave unset to disable I/O retrying."
              },
              "retryIntervalSeconds": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set how long to wait before each retry, in seconds. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "maxRetryAttempts": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of retry attempts after an I/O error. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "allowChangeDuringExecution": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Allow the source file to change while a single execution is running. Use this for files that are expected to be updated continuously, such as append-only logs."
              }
            },
            "additionalProperties": false
          },
          "disablePreviewData": {
            "type": [
              "object",
              "null"
            ],
            "description": "Disable preview data generation for this source. Set this when previewing the input is unnecessary or too expensive.\n\nRequired.",
            "properties": {
              "disablePreviewData": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Disable preview data generation for this block. Leave unset to keep generating sample preview data from the current file and options.\n\nRequired."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fileSource_file",
        "description": "Options for a `fileSource:file` block."
      },
      "BlockOptions_fileSource_googleCloudStorage": {
        "type": "object",
        "properties": {
          "locationType": {
            "description": "Choose the source location type for the input file. Select the variant that matches where the file is stored, such as local, uploaded, URL, remote server, or cloud storage.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "UI-only: signals a human must upload a file via the app; the agent cannot fulfil this - pick a real location type instead (a file already in Omniscope, a URL, or a cloud source). Choose a file on your local computer or device, which must be uploaded to Omniscope before using it.",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "onYourComputerDevice"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "httpApiGetPost"
                  },
                  "requestMethod": {
                    "description": "Select the HTTP method used for this request, either GET or POST.\n\nRequired.\n\nValid values: `get`, `post`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "get",
                          "post"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "address": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the request URL to send the HTTP call to.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use for the request, or leave unset to send no authentication.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "httpHeaders": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add one or more HTTP headers to include with the request.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "headerName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, suggested values: A-IM, Accept, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Language, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-Control, Connection, Content-Encoding, .... Custom values are also accepted.\n\nSelect the HTTP header name to configure.\n\nRequired."
                        },
                        "headerValue": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to send for the selected HTTP header.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "timeoutSeconds": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the request timeout in seconds.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "postDataType": {
                    "description": "Choose the body format to use when the request method is POST.\n\nRelevant when `requestMethod` equals `post`.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "json"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the JSON payload to post. Provide the request body content for this block.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "plainText"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the plain text content to send in the POST body.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "xml"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the XML post body to send as the request content.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "remoteFileViaSshSftpScp"
                  },
                  "protocol": {
                    "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sftp",
                          "scp"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote server host name.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the SSH port number to connect to.\n\nRequired.",
                    "maximum": 65536,
                    "minimum": 0
                  },
                  "usePrivateKey": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                  },
                  "passwordConnectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure password-based connection options for this SSH location.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "privateKeyFileLocationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "embeddedDataFile"
                  },
                  "embeddedFile": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the embedded file to use as the data source for this block.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "archiveOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set archive extraction settings for compressed files such as ZIP archives. Leave unset for plain files.\n\nRequired.",
            "properties": {
              "archivePassword": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to encrypt or protect the archive file.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "readerType": {
            "description": "Choose how to read the file contents, such as delimited text, Excel, JSON, XML, or another supported reader type.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the file text encoding, which defaults to UTF-8.\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character that separates cells in each row; defaults to a comma. To read each line as a single cell, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuote": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the quote character used around cells; defaults to a double quote. For no quote character at all, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "fieldTypeDetection": {
                    "description": "Choose how field data types are detected. Defaults to sampling the first 10,000 records; you can also scan all records or treat all fields as text for faster import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data options in the nested table settings.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password required to open a protected workbook. Leave unset for unprotected files.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "readerType": {
                    "description": "Choose how to read the spreadsheet. Use the streaming option for large files, the Microsoft option for full formula support, or the legacy Microsoft option for older Omniscope behavior.\n\nRequired.\n\nValid values: `omniscope`, `microsoft`, `microsoftLegacy`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "microsoft",
                          "microsoftLegacy"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetSelection": {
                    "description": "Choose whether to import the first worksheet, append every worksheet, or append only selected worksheets.\n\nRequired.\n\nValid values: `first`, `all`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "first",
                          "all",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetNames": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the worksheet names to append when importing custom worksheets.\n\nRelevant when `worksheetSelection` equals `custom`.",
                    "items": {
                      "type": "string",
                      "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted."
                    }
                  },
                  "showWorksheetSourceField": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Create an output field containing the worksheet name each row came from. This is ignored when only one worksheet is imported.\n\nRequired."
                  },
                  "worksheetSourceFieldName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name of the output field that stores the worksheet name.\n\nRelevant when `showWorksheetSourceField` equals `true`.\n\nRequired."
                  },
                  "importOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table import options for the spreadsheet reader.\n\nRequired.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  },
                  "autoDetectDataTypes": {
                    "description": "Choose how to detect field types. Use the first 10,000 records for a faster import, scan all records for better detection, or type all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "Control how date and time values are handled when the IOD file was created in a different timezone. Use this to preserve logical local dates/times or to keep the same absolute point in time.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "jsonDataJsonFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be treated as records in the output. Paths are slash-delimited key names and `*` matches any single node at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be extracted as fields in the output, one path per field, relative to the whole document in the same slash-and-wildcard form as recordPath - e.g. `person/*/name`, `person/*/address/*/city`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the field name to use for this JSON path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the JSON path for the field value to read or write.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set preset JSON reader options when you want to use a predefined configuration.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "xmlDataXmlFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify the XML nodes that make up each output record. Paths are slash-delimited element names and `*` matches any single element at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the XML nodes to extract as fields within each record, one path per field, in the same slash-and-wildcard form as recordPath - and prefix an ATTRIBUTE with `@`: `root/a@id` is the `id` attribute of each `a`, `person/info@name` the `name` attribute of `info`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the name of the field to read or write in the XML path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the XML path used to locate the field value in the record.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set optional preset parsing options for XML input.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "textAsSingleCellTxtFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the character encoding used to decode the text file.\n\nRequired."
                  },
                  "removeHTMLTags": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Remove HTML tags from the file and keep only the text content.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password required to open the Omniscope Classic report and data file. Leave unset if the file is not password protected.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "formulaRecalculation": {
                    "description": "Choose how formulas are recalculated when reading the file: none, only formulas that change over time, or all formulas.\n\nRequired.\n\nValid values: `none`, `changeOverTime`, `all`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "changeOverTime",
                          "all"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeLegacyDataTableIsdFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheAvroAvroFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheParquetParquetFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "logFileLogFileExperimental"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding used to read the log file. Defaults to windows-1252.\n\nRequired."
                  },
                  "locale": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used when interpreting the log file's text and formatted values. Defaults to en_US."
                  },
                  "autoDetectFieldTypes": {
                    "description": "Choose how field data types are detected during import. Select a faster, shallower detection mode for large datasets, or keep all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "personalStorageTablePstFile"
                  },
                  "messageFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which message fields to retrieve from the PST file. Include Body only when you need message content, as it can slow the import.\n\nRequired.\n\nValid values: `folderName`, `senderName`, `senderEmail`, `displayTo`, `displayCc`, `displayBcc`, `messageDeliveryTime`, `subject`, `body`.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "folderName",
                        "senderName",
                        "senderEmail",
                        "displayTo",
                        "displayCc",
                        "displayBcc",
                        "messageDeliveryTime",
                        "subject",
                        "body"
                      ]
                    }
                  },
                  "maxMessages": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Limit how many messages are loaded from the PST file. Leave unset to load all messages.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "folderNameFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Load messages only from folders whose names contain this text. Leave unset to load messages from all folders."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sasTransportFormatXptFile"
                  },
                  "datasetIndex": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Select which dataset to read from the XPT file. Use 1 for the first dataset.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "useVariableLabelInsteadOfName": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use each variable's label as the output field name instead of its variable name when possible.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "retryOnIoError": {
            "type": [
              "object",
              "null"
            ],
            "description": "Enable retry settings for I/O errors when reading the input source. Use this to configure retries for temporary file or network access failures.\n\nRequired.",
            "properties": {
              "retryOnIoError": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable retries when an operation fails with an I/O error. Leave unset to disable I/O retrying."
              },
              "retryIntervalSeconds": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set how long to wait before each retry, in seconds. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "maxRetryAttempts": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of retry attempts after an I/O error. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "allowChangeDuringExecution": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Allow the source file to change while a single execution is running. Use this for files that are expected to be updated continuously, such as append-only logs."
              }
            },
            "additionalProperties": false
          },
          "disablePreviewData": {
            "type": [
              "object",
              "null"
            ],
            "description": "Disable preview data generation for this source. Set this when previewing the input is unnecessary or too expensive.\n\nRequired.",
            "properties": {
              "disablePreviewData": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Disable preview data generation for this block. Leave unset to keep generating sample preview data from the current file and options.\n\nRequired."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fileSource_googleCloudStorage",
        "description": "Options for a `fileSource:googleCloudStorage` block."
      },
      "BlockOptions_fileSource_googleDrive": {
        "type": "object",
        "properties": {
          "locationType": {
            "description": "Choose the source location type for the input file. Select the variant that matches where the file is stored, such as local, uploaded, URL, remote server, or cloud storage.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "UI-only: signals a human must upload a file via the app; the agent cannot fulfil this - pick a real location type instead (a file already in Omniscope, a URL, or a cloud source). Choose a file on your local computer or device, which must be uploaded to Omniscope before using it.",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "onYourComputerDevice"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "httpApiGetPost"
                  },
                  "requestMethod": {
                    "description": "Select the HTTP method used for this request, either GET or POST.\n\nRequired.\n\nValid values: `get`, `post`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "get",
                          "post"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "address": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the request URL to send the HTTP call to.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use for the request, or leave unset to send no authentication.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "httpHeaders": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add one or more HTTP headers to include with the request.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "headerName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, suggested values: A-IM, Accept, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Language, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-Control, Connection, Content-Encoding, .... Custom values are also accepted.\n\nSelect the HTTP header name to configure.\n\nRequired."
                        },
                        "headerValue": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to send for the selected HTTP header.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "timeoutSeconds": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the request timeout in seconds.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "postDataType": {
                    "description": "Choose the body format to use when the request method is POST.\n\nRelevant when `requestMethod` equals `post`.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "json"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the JSON payload to post. Provide the request body content for this block.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "plainText"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the plain text content to send in the POST body.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "xml"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the XML post body to send as the request content.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "remoteFileViaSshSftpScp"
                  },
                  "protocol": {
                    "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sftp",
                          "scp"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote server host name.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the SSH port number to connect to.\n\nRequired.",
                    "maximum": 65536,
                    "minimum": 0
                  },
                  "usePrivateKey": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                  },
                  "passwordConnectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure password-based connection options for this SSH location.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "privateKeyFileLocationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "embeddedDataFile"
                  },
                  "embeddedFile": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the embedded file to use as the data source for this block.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "archiveOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set archive extraction settings for compressed files such as ZIP archives. Leave unset for plain files.\n\nRequired.",
            "properties": {
              "archivePassword": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to encrypt or protect the archive file.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "readerType": {
            "description": "Choose how to read the file contents, such as delimited text, Excel, JSON, XML, or another supported reader type.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the file text encoding, which defaults to UTF-8.\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character that separates cells in each row; defaults to a comma. To read each line as a single cell, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuote": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the quote character used around cells; defaults to a double quote. For no quote character at all, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "fieldTypeDetection": {
                    "description": "Choose how field data types are detected. Defaults to sampling the first 10,000 records; you can also scan all records or treat all fields as text for faster import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data options in the nested table settings.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password required to open a protected workbook. Leave unset for unprotected files.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "readerType": {
                    "description": "Choose how to read the spreadsheet. Use the streaming option for large files, the Microsoft option for full formula support, or the legacy Microsoft option for older Omniscope behavior.\n\nRequired.\n\nValid values: `omniscope`, `microsoft`, `microsoftLegacy`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "microsoft",
                          "microsoftLegacy"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetSelection": {
                    "description": "Choose whether to import the first worksheet, append every worksheet, or append only selected worksheets.\n\nRequired.\n\nValid values: `first`, `all`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "first",
                          "all",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetNames": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the worksheet names to append when importing custom worksheets.\n\nRelevant when `worksheetSelection` equals `custom`.",
                    "items": {
                      "type": "string",
                      "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted."
                    }
                  },
                  "showWorksheetSourceField": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Create an output field containing the worksheet name each row came from. This is ignored when only one worksheet is imported.\n\nRequired."
                  },
                  "worksheetSourceFieldName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name of the output field that stores the worksheet name.\n\nRelevant when `showWorksheetSourceField` equals `true`.\n\nRequired."
                  },
                  "importOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table import options for the spreadsheet reader.\n\nRequired.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  },
                  "autoDetectDataTypes": {
                    "description": "Choose how to detect field types. Use the first 10,000 records for a faster import, scan all records for better detection, or type all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "Control how date and time values are handled when the IOD file was created in a different timezone. Use this to preserve logical local dates/times or to keep the same absolute point in time.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "jsonDataJsonFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be treated as records in the output. Paths are slash-delimited key names and `*` matches any single node at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be extracted as fields in the output, one path per field, relative to the whole document in the same slash-and-wildcard form as recordPath - e.g. `person/*/name`, `person/*/address/*/city`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the field name to use for this JSON path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the JSON path for the field value to read or write.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set preset JSON reader options when you want to use a predefined configuration.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "xmlDataXmlFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify the XML nodes that make up each output record. Paths are slash-delimited element names and `*` matches any single element at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the XML nodes to extract as fields within each record, one path per field, in the same slash-and-wildcard form as recordPath - and prefix an ATTRIBUTE with `@`: `root/a@id` is the `id` attribute of each `a`, `person/info@name` the `name` attribute of `info`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the name of the field to read or write in the XML path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the XML path used to locate the field value in the record.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set optional preset parsing options for XML input.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "textAsSingleCellTxtFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the character encoding used to decode the text file.\n\nRequired."
                  },
                  "removeHTMLTags": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Remove HTML tags from the file and keep only the text content.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password required to open the Omniscope Classic report and data file. Leave unset if the file is not password protected.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "formulaRecalculation": {
                    "description": "Choose how formulas are recalculated when reading the file: none, only formulas that change over time, or all formulas.\n\nRequired.\n\nValid values: `none`, `changeOverTime`, `all`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "changeOverTime",
                          "all"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeLegacyDataTableIsdFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheAvroAvroFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheParquetParquetFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "logFileLogFileExperimental"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding used to read the log file. Defaults to windows-1252.\n\nRequired."
                  },
                  "locale": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used when interpreting the log file's text and formatted values. Defaults to en_US."
                  },
                  "autoDetectFieldTypes": {
                    "description": "Choose how field data types are detected during import. Select a faster, shallower detection mode for large datasets, or keep all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "personalStorageTablePstFile"
                  },
                  "messageFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which message fields to retrieve from the PST file. Include Body only when you need message content, as it can slow the import.\n\nRequired.\n\nValid values: `folderName`, `senderName`, `senderEmail`, `displayTo`, `displayCc`, `displayBcc`, `messageDeliveryTime`, `subject`, `body`.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "folderName",
                        "senderName",
                        "senderEmail",
                        "displayTo",
                        "displayCc",
                        "displayBcc",
                        "messageDeliveryTime",
                        "subject",
                        "body"
                      ]
                    }
                  },
                  "maxMessages": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Limit how many messages are loaded from the PST file. Leave unset to load all messages.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "folderNameFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Load messages only from folders whose names contain this text. Leave unset to load messages from all folders."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sasTransportFormatXptFile"
                  },
                  "datasetIndex": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Select which dataset to read from the XPT file. Use 1 for the first dataset.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "useVariableLabelInsteadOfName": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use each variable's label as the output field name instead of its variable name when possible.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "retryOnIoError": {
            "type": [
              "object",
              "null"
            ],
            "description": "Enable retry settings for I/O errors when reading the input source. Use this to configure retries for temporary file or network access failures.\n\nRequired.",
            "properties": {
              "retryOnIoError": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable retries when an operation fails with an I/O error. Leave unset to disable I/O retrying."
              },
              "retryIntervalSeconds": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set how long to wait before each retry, in seconds. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "maxRetryAttempts": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of retry attempts after an I/O error. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "allowChangeDuringExecution": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Allow the source file to change while a single execution is running. Use this for files that are expected to be updated continuously, such as append-only logs."
              }
            },
            "additionalProperties": false
          },
          "disablePreviewData": {
            "type": [
              "object",
              "null"
            ],
            "description": "Disable preview data generation for this source. Set this when previewing the input is unnecessary or too expensive.\n\nRequired.",
            "properties": {
              "disablePreviewData": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Disable preview data generation for this block. Leave unset to keep generating sample preview data from the current file and options.\n\nRequired."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fileSource_googleDrive",
        "description": "Options for a `fileSource:googleDrive` block."
      },
      "BlockOptions_fileSource_hadoopHdfs": {
        "type": "object",
        "properties": {
          "locationType": {
            "description": "Choose the source location type for the input file. Select the variant that matches where the file is stored, such as local, uploaded, URL, remote server, or cloud storage.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "UI-only: signals a human must upload a file via the app; the agent cannot fulfil this - pick a real location type instead (a file already in Omniscope, a URL, or a cloud source). Choose a file on your local computer or device, which must be uploaded to Omniscope before using it.",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "onYourComputerDevice"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "httpApiGetPost"
                  },
                  "requestMethod": {
                    "description": "Select the HTTP method used for this request, either GET or POST.\n\nRequired.\n\nValid values: `get`, `post`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "get",
                          "post"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "address": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the request URL to send the HTTP call to.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use for the request, or leave unset to send no authentication.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "httpHeaders": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add one or more HTTP headers to include with the request.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "headerName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, suggested values: A-IM, Accept, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Language, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-Control, Connection, Content-Encoding, .... Custom values are also accepted.\n\nSelect the HTTP header name to configure.\n\nRequired."
                        },
                        "headerValue": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to send for the selected HTTP header.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "timeoutSeconds": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the request timeout in seconds.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "postDataType": {
                    "description": "Choose the body format to use when the request method is POST.\n\nRelevant when `requestMethod` equals `post`.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "json"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the JSON payload to post. Provide the request body content for this block.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "plainText"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the plain text content to send in the POST body.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "xml"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the XML post body to send as the request content.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "remoteFileViaSshSftpScp"
                  },
                  "protocol": {
                    "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sftp",
                          "scp"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote server host name.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the SSH port number to connect to.\n\nRequired.",
                    "maximum": 65536,
                    "minimum": 0
                  },
                  "usePrivateKey": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                  },
                  "passwordConnectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure password-based connection options for this SSH location.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "privateKeyFileLocationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "embeddedDataFile"
                  },
                  "embeddedFile": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the embedded file to use as the data source for this block.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "archiveOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set archive extraction settings for compressed files such as ZIP archives. Leave unset for plain files.\n\nRequired.",
            "properties": {
              "archivePassword": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to encrypt or protect the archive file.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "readerType": {
            "description": "Choose how to read the file contents, such as delimited text, Excel, JSON, XML, or another supported reader type.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the file text encoding, which defaults to UTF-8.\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character that separates cells in each row; defaults to a comma. To read each line as a single cell, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuote": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the quote character used around cells; defaults to a double quote. For no quote character at all, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "fieldTypeDetection": {
                    "description": "Choose how field data types are detected. Defaults to sampling the first 10,000 records; you can also scan all records or treat all fields as text for faster import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data options in the nested table settings.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password required to open a protected workbook. Leave unset for unprotected files.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "readerType": {
                    "description": "Choose how to read the spreadsheet. Use the streaming option for large files, the Microsoft option for full formula support, or the legacy Microsoft option for older Omniscope behavior.\n\nRequired.\n\nValid values: `omniscope`, `microsoft`, `microsoftLegacy`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "microsoft",
                          "microsoftLegacy"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetSelection": {
                    "description": "Choose whether to import the first worksheet, append every worksheet, or append only selected worksheets.\n\nRequired.\n\nValid values: `first`, `all`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "first",
                          "all",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetNames": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the worksheet names to append when importing custom worksheets.\n\nRelevant when `worksheetSelection` equals `custom`.",
                    "items": {
                      "type": "string",
                      "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted."
                    }
                  },
                  "showWorksheetSourceField": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Create an output field containing the worksheet name each row came from. This is ignored when only one worksheet is imported.\n\nRequired."
                  },
                  "worksheetSourceFieldName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name of the output field that stores the worksheet name.\n\nRelevant when `showWorksheetSourceField` equals `true`.\n\nRequired."
                  },
                  "importOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table import options for the spreadsheet reader.\n\nRequired.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  },
                  "autoDetectDataTypes": {
                    "description": "Choose how to detect field types. Use the first 10,000 records for a faster import, scan all records for better detection, or type all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "Control how date and time values are handled when the IOD file was created in a different timezone. Use this to preserve logical local dates/times or to keep the same absolute point in time.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "jsonDataJsonFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be treated as records in the output. Paths are slash-delimited key names and `*` matches any single node at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be extracted as fields in the output, one path per field, relative to the whole document in the same slash-and-wildcard form as recordPath - e.g. `person/*/name`, `person/*/address/*/city`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the field name to use for this JSON path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the JSON path for the field value to read or write.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set preset JSON reader options when you want to use a predefined configuration.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "xmlDataXmlFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify the XML nodes that make up each output record. Paths are slash-delimited element names and `*` matches any single element at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the XML nodes to extract as fields within each record, one path per field, in the same slash-and-wildcard form as recordPath - and prefix an ATTRIBUTE with `@`: `root/a@id` is the `id` attribute of each `a`, `person/info@name` the `name` attribute of `info`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the name of the field to read or write in the XML path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the XML path used to locate the field value in the record.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set optional preset parsing options for XML input.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "textAsSingleCellTxtFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the character encoding used to decode the text file.\n\nRequired."
                  },
                  "removeHTMLTags": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Remove HTML tags from the file and keep only the text content.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password required to open the Omniscope Classic report and data file. Leave unset if the file is not password protected.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "formulaRecalculation": {
                    "description": "Choose how formulas are recalculated when reading the file: none, only formulas that change over time, or all formulas.\n\nRequired.\n\nValid values: `none`, `changeOverTime`, `all`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "changeOverTime",
                          "all"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeLegacyDataTableIsdFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheAvroAvroFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheParquetParquetFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "logFileLogFileExperimental"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding used to read the log file. Defaults to windows-1252.\n\nRequired."
                  },
                  "locale": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used when interpreting the log file's text and formatted values. Defaults to en_US."
                  },
                  "autoDetectFieldTypes": {
                    "description": "Choose how field data types are detected during import. Select a faster, shallower detection mode for large datasets, or keep all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "personalStorageTablePstFile"
                  },
                  "messageFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which message fields to retrieve from the PST file. Include Body only when you need message content, as it can slow the import.\n\nRequired.\n\nValid values: `folderName`, `senderName`, `senderEmail`, `displayTo`, `displayCc`, `displayBcc`, `messageDeliveryTime`, `subject`, `body`.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "folderName",
                        "senderName",
                        "senderEmail",
                        "displayTo",
                        "displayCc",
                        "displayBcc",
                        "messageDeliveryTime",
                        "subject",
                        "body"
                      ]
                    }
                  },
                  "maxMessages": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Limit how many messages are loaded from the PST file. Leave unset to load all messages.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "folderNameFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Load messages only from folders whose names contain this text. Leave unset to load messages from all folders."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sasTransportFormatXptFile"
                  },
                  "datasetIndex": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Select which dataset to read from the XPT file. Use 1 for the first dataset.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "useVariableLabelInsteadOfName": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use each variable's label as the output field name instead of its variable name when possible.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "retryOnIoError": {
            "type": [
              "object",
              "null"
            ],
            "description": "Enable retry settings for I/O errors when reading the input source. Use this to configure retries for temporary file or network access failures.\n\nRequired.",
            "properties": {
              "retryOnIoError": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable retries when an operation fails with an I/O error. Leave unset to disable I/O retrying."
              },
              "retryIntervalSeconds": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set how long to wait before each retry, in seconds. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "maxRetryAttempts": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of retry attempts after an I/O error. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "allowChangeDuringExecution": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Allow the source file to change while a single execution is running. Use this for files that are expected to be updated continuously, such as append-only logs."
              }
            },
            "additionalProperties": false
          },
          "disablePreviewData": {
            "type": [
              "object",
              "null"
            ],
            "description": "Disable preview data generation for this source. Set this when previewing the input is unnecessary or too expensive.\n\nRequired.",
            "properties": {
              "disablePreviewData": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Disable preview data generation for this block. Leave unset to keep generating sample preview data from the current file and options.\n\nRequired."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fileSource_hadoopHdfs",
        "description": "Options for a `fileSource:hadoopHdfs` block."
      },
      "BlockOptions_fileSource_remoteFileViaSsh": {
        "type": "object",
        "properties": {
          "locationType": {
            "description": "Choose the source location type for the input file. Select the variant that matches where the file is stored, such as local, uploaded, URL, remote server, or cloud storage.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "UI-only: signals a human must upload a file via the app; the agent cannot fulfil this - pick a real location type instead (a file already in Omniscope, a URL, or a cloud source). Choose a file on your local computer or device, which must be uploaded to Omniscope before using it.",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "onYourComputerDevice"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "httpApiGetPost"
                  },
                  "requestMethod": {
                    "description": "Select the HTTP method used for this request, either GET or POST.\n\nRequired.\n\nValid values: `get`, `post`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "get",
                          "post"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "address": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the request URL to send the HTTP call to.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use for the request, or leave unset to send no authentication.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "httpHeaders": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add one or more HTTP headers to include with the request.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "headerName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "**Choice**, suggested values: A-IM, Accept, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Language, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-Control, Connection, Content-Encoding, .... Custom values are also accepted.\n\nSelect the HTTP header name to configure.\n\nRequired."
                        },
                        "headerValue": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to send for the selected HTTP header.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "timeoutSeconds": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the request timeout in seconds.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "postDataType": {
                    "description": "Choose the body format to use when the request method is POST.\n\nRelevant when `requestMethod` equals `post`.\n\nRequired.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "json"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the JSON payload to post. Provide the request body content for this block.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "plainText"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the plain text content to send in the POST body.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "xml"
                          },
                          "postData": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the XML post body to send as the request content.\n\nRequired."
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "remoteFileViaSshSftpScp"
                  },
                  "protocol": {
                    "description": "Choose the SSH transfer protocol to use for this remote file location.\n\nRequired.\n\nValid values: `sftp`, `scp`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sftp",
                          "scp"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote server host name.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the SSH port number to connect to.\n\nRequired.",
                    "maximum": 65536,
                    "minimum": 0
                  },
                  "usePrivateKey": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable OpenSSH private key authentication and use the password field as the key passphrase.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the remote file path as an absolute path starting with /.\n\nRequired."
                  },
                  "passwordConnectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure password-based connection options for this SSH location.",
                    "properties": {
                      "username": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the username to use for this connection."
                      },
                      "password": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "privateKeyFileLocationOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the OpenSSH private key file location used when private key authentication is enabled.\n\nRelevant when `usePrivateKey` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleDriveFile"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google account connection used to access Drive. Set it to choose or change the authenticated account for this block.\n\nRequired."
                  },
                  "drive": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Drive to browse for the file. Set it to target the specific drive that contains the file.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "filePath": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the file to read from Google Drive. Provide the file path selection from the chosen drive.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "amazonS3File"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the S3 connection before using the bucket and path settings.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the S3 bucket to connect to.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the S3 object path to read from or write to.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional S3 connection settings.",
                    "properties": {
                      "identifyCredentialsAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify AWS credentials from the system credentials file or EC2 instance role. Leave unset to enter an access key ID and secret access key manually.\n\nRequired."
                      },
                      "accessKeyId": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the AWS access key ID to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired."
                      },
                      "secretAccessKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the AWS secret access key to use when credentials are not identified automatically.\n\nRelevant when `identifyCredentialsAutomatically` equals `false`.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      },
                      "identifyRegionAutomatically": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Automatically identify the AWS region from the system configuration or EC2 instance. Leave unset to specify a region manually.\n\nRequired."
                      },
                      "region": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the AWS region to use when region detection is not automatic.\n\nRelevant when `identifyRegionAutomatically` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "googleCloudStorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the bucket and file fields.\n\nRequired."
                  },
                  "bucket": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the name of the Google Cloud Storage bucket to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file in the selected bucket.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the storage connection options for this Google Cloud Storage location.",
                    "properties": {
                      "credentialsType": {
                        "description": "Choose how this connection authenticates to cloud storage. Set it to find credentials automatically, use a custom credential file location, or connect unauthenticated.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`, `unauthenticated`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "automatic",
                              "credentialsFile",
                              "unauthenticated"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "credentialsFileLocation": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Provide the file location for the custom credentials file. Set this only when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                        "properties": {
                          "path": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "azureGen2StorageFile"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the storage connection before showing the file system and file path fields.\n\nRequired."
                  },
                  "fileSystem": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect or enter the file system to connect to.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "file": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the file to use in the selected file system.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the storage connection details used to access the file system.",
                    "properties": {
                      "accountName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the Azure storage account name to use for shared key authentication.\n\nRequired."
                      },
                      "accountKey": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Azure storage account access key to use for shared key authentication.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "description": "Experimental, testing only - token auth expires after ~4h and it is not for production use; prefer a stable location type for any production setup. Remote file on Dropbox",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "dropboxFileExperimental"
                  },
                  "confirmConnection": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the Dropbox connection before enabling file selection.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the Dropbox file path to use.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired."
                  },
                  "connectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the Dropbox connection settings used to access the file.",
                    "properties": {
                      "accessToken": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the Dropbox access token used to read and write files for this block. Generate a new token when the current one expires after about 4 hours.\n\nRequired.",
                        "properties": {
                          "secretUpdate": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The new secret. null leaves the stored one alone."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "embeddedDataFile"
                  },
                  "embeddedFile": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the embedded file to use as the data source for this block.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "archiveOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set archive extraction settings for compressed files such as ZIP archives. Leave unset for plain files.\n\nRequired.",
            "properties": {
              "archivePassword": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password used to encrypt or protect the archive file.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "readerType": {
            "description": "Choose how to read the file contents, such as delimited text, Excel, JSON, XML, or another supported reader type.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "delimitedTextCsvTsvFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the file text encoding, which defaults to UTF-8.\n\nRequired."
                  },
                  "cellSeparator": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the character that separates cells in each row; defaults to a comma. To read each line as a single cell, send an explicit empty string \"\" - not null, which means use the default and so keeps the comma."
                  },
                  "cellQuote": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the quote character used around cells; defaults to a double quote. For no quote character at all, send an explicit empty string \"\" - not null, which means use the default and so keeps the double quote."
                  },
                  "fieldTypeDetection": {
                    "description": "Choose how field data types are detected. Defaults to sampling the first 10,000 records; you can also scan all records or treat all fields as text for faster import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "tableDataOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table data options in the nested table settings.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "excelSpreadsheetXlsxXlsFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password required to open a protected workbook. Leave unset for unprotected files.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "readerType": {
                    "description": "Choose how to read the spreadsheet. Use the streaming option for large files, the Microsoft option for full formula support, or the legacy Microsoft option for older Omniscope behavior.\n\nRequired.\n\nValid values: `omniscope`, `microsoft`, `microsoftLegacy`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "omniscope",
                          "microsoft",
                          "microsoftLegacy"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetSelection": {
                    "description": "Choose whether to import the first worksheet, append every worksheet, or append only selected worksheets.\n\nRequired.\n\nValid values: `first`, `all`, `custom`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "first",
                          "all",
                          "custom"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "worksheetNames": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select the worksheet names to append when importing custom worksheets.\n\nRelevant when `worksheetSelection` equals `custom`.",
                    "items": {
                      "type": "string",
                      "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted."
                    }
                  },
                  "showWorksheetSourceField": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Create an output field containing the worksheet name each row came from. This is ignored when only one worksheet is imported.\n\nRequired."
                  },
                  "worksheetSourceFieldName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the name of the output field that stores the worksheet name.\n\nRelevant when `showWorksheetSourceField` equals `true`.\n\nRequired."
                  },
                  "importOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional table import options for the spreadsheet reader.\n\nRequired.",
                    "properties": {
                      "hasHeader": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
                      },
                      "firstHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastHeaderRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "headerSeparator": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
                      },
                      "missingFieldPrefix": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
                      },
                      "autoCorrectFieldNameCase": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
                      },
                      "firstDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "lastDataRow": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                        "maximum": 2147483647,
                        "minimum": 1
                      },
                      "skipEmptyDataRows": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
                      },
                      "convertPlaceholdersToNulls": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
                      },
                      "locale": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
                      }
                    },
                    "additionalProperties": false
                  },
                  "autoDetectDataTypes": {
                    "description": "Choose how to detect field types. Use the first 10,000 records for a faster import, scan all records for better detection, or type all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeDataTableIodFile"
                  },
                  "convertDatesAcrossTimezones": {
                    "description": "Control how date and time values are handled when the IOD file was created in a different timezone. Use this to preserve logical local dates/times or to keep the same absolute point in time.\n\nRequired.\n\nValid values: `never`, `auto`, `always`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "never",
                          "auto",
                          "always"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "jsonDataJsonFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be treated as records in the output. Paths are slash-delimited key names and `*` matches any single node at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be extracted as fields in the output, one path per field, relative to the whole document in the same slash-and-wildcard form as recordPath - e.g. `person/*/name`, `person/*/address/*/city`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the field name to use for this JSON path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the JSON path for the field value to read or write.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set preset JSON reader options when you want to use a predefined configuration.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "xmlDataXmlFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify the XML nodes that make up each output record. Paths are slash-delimited element names and `*` matches any single element at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the XML nodes to extract as fields within each record, one path per field, in the same slash-and-wildcard form as recordPath - and prefix an ATTRIBUTE with `@`: `root/a@id` is the `id` attribute of each `a`, `person/info@name` the `name` attribute of `info`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the name of the field to read or write in the XML path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the XML path used to locate the field value in the record.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set optional preset parsing options for XML input.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "textAsSingleCellTxtFile"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the character encoding used to decode the text file.\n\nRequired."
                  },
                  "removeHTMLTags": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Remove HTML tags from the file and keep only the text content.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeClassicReportDataIokFile"
                  },
                  "password": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the password required to open the Omniscope Classic report and data file. Leave unset if the file is not password protected.",
                    "properties": {
                      "secretUpdate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "The new secret. null leaves the stored one alone."
                      }
                    },
                    "additionalProperties": false
                  },
                  "formulaRecalculation": {
                    "description": "Choose how formulas are recalculated when reading the file: none, only formulas that change over time, or all formulas.\n\nRequired.\n\nValid values: `none`, `changeOverTime`, `all`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "none",
                          "changeOverTime",
                          "all"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "omniscopeLegacyDataTableIsdFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheAvroAvroFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "apacheParquetParquetFile"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "logFileLogFileExperimental"
                  },
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the character encoding used to read the log file. Defaults to windows-1252.\n\nRequired."
                  },
                  "locale": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used when interpreting the log file's text and formatted values. Defaults to en_US."
                  },
                  "autoDetectFieldTypes": {
                    "description": "Choose how field data types are detected during import. Select a faster, shallower detection mode for large datasets, or keep all fields as text for the fastest import.\n\nRequired.\n\nValid values: `sample`, `fullData`, `none`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "sample",
                          "fullData",
                          "none"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "personalStorageTablePstFile"
                  },
                  "messageFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which message fields to retrieve from the PST file. Include Body only when you need message content, as it can slow the import.\n\nRequired.\n\nValid values: `folderName`, `senderName`, `senderEmail`, `displayTo`, `displayCc`, `displayBcc`, `messageDeliveryTime`, `subject`, `body`.",
                    "items": {
                      "type": "string",
                      "enum": [
                        "folderName",
                        "senderName",
                        "senderEmail",
                        "displayTo",
                        "displayCc",
                        "displayBcc",
                        "messageDeliveryTime",
                        "subject",
                        "body"
                      ]
                    }
                  },
                  "maxMessages": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Limit how many messages are loaded from the PST file. Leave unset to load all messages.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "folderNameFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Load messages only from folders whose names contain this text. Leave unset to load messages from all folders."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "sasTransportFormatXptFile"
                  },
                  "datasetIndex": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Select which dataset to read from the XPT file. Use 1 for the first dataset.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 1
                  },
                  "useVariableLabelInsteadOfName": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Use each variable's label as the output field name instead of its variable name when possible.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "retryOnIoError": {
            "type": [
              "object",
              "null"
            ],
            "description": "Enable retry settings for I/O errors when reading the input source. Use this to configure retries for temporary file or network access failures.\n\nRequired.",
            "properties": {
              "retryOnIoError": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Enable retries when an operation fails with an I/O error. Leave unset to disable I/O retrying."
              },
              "retryIntervalSeconds": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set how long to wait before each retry, in seconds. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "maxRetryAttempts": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of retry attempts after an I/O error. Use this together with retry-on-I/O-error.\n\nRelevant when `retryOnIoError` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "allowChangeDuringExecution": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Allow the source file to change while a single execution is running. Use this for files that are expected to be updated continuously, such as append-only logs."
              }
            },
            "additionalProperties": false
          },
          "disablePreviewData": {
            "type": [
              "object",
              "null"
            ],
            "description": "Disable preview data generation for this source. Set this when previewing the input is unnecessary or too expensive.\n\nRequired.",
            "properties": {
              "disablePreviewData": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Disable preview data generation for this block. Leave unset to keep generating sample preview data from the current file and options.\n\nRequired."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fileSource_remoteFileViaSsh",
        "description": "Options for a `fileSource:remoteFileViaSsh` block."
      },
      "BlockOptions_fillDown": {
        "type": "object",
        "properties": {
          "allFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Populate blanks by carrying the last non-null value forward independently in each field. Leave unset to process every field; set false and choose specific fields to limit the operation.\n\nRequired."
          },
          "fields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose the fields to fill down when you do not want to process every field. This appears only when All fields is false.\n\nRelevant when `allFields` equals `false`.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_fillDown",
        "description": "Options for a `fillDown` block."
      },
      "BlockOptions_foreach": {
        "type": "object",
        "properties": {
          "useAllFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Select the fields in the Iterations input you want to use as parameters. Field names must match parameter names exactly.\n\nUse all fields from the Iterations input to override app and project parameters. Field names must match parameter names.\n\nRequired."
          },
          "useTheseFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the fields in the Iterations input you want to use as parameters. Field names must match parameter names exactly.\n\nUse the selected Iterations input fields to override app and project parameters. Field names must match parameter names.\n\nRelevant when `useAllFields` equals `false`.\n\nField name from input 1.",
            "items": {
              "type": "string"
            }
          },
          "missingParameterValues": {
            "description": "Select the fields in the Iterations input you want to use as parameters. Field names must match parameter names exactly.\n\nChoose what to do when a parameter value is missing: use the current value or fail.\n\nRequired.\n\nValid values: `useCurrentValue`, `fail`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "useCurrentValue",
                  "fail"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "addIterationNumberField": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Decide which fields should be part of the block output. Either include everything from the Iterations and Workflow inputs, or specify a subset.\n\nAdd a field containing the current workflow iteration number to the output.\n\nRequired."
          },
          "iterationFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Decide which fields should be part of the block output. Either include everything from the Iterations and Workflow inputs, or specify a subset.\n\nSet the output field name for the iteration number.\n\nRelevant when `addIterationNumberField` equals `true`."
          },
          "addParameterFieldPrefix": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Decide which fields should be part of the block output. Either include everything from the Iterations and Workflow inputs, or specify a subset.\n\nAdd a prefix to parameter field names in the output.\n\nRequired."
          },
          "parameterFieldPrefix": {
            "type": [
              "string",
              "null"
            ],
            "description": "Decide which fields should be part of the block output. Either include everything from the Iterations and Workflow inputs, or specify a subset.\n\nSet the prefix that is added to parameter field names in the output.\n\nRelevant when `addParameterFieldPrefix` equals `true`."
          },
          "includeAllIterationInputFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Decide which fields should be part of the block output. Either include everything from the Iterations and Workflow inputs, or specify a subset.\n\nInclude all fields from the Iterations input in the block output.\n\nRequired."
          },
          "iterationInputFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Decide which fields should be part of the block output. Either include everything from the Iterations and Workflow inputs, or specify a subset.\n\nChoose which Iterations input fields to include in the block output.\n\nRelevant when `includeAllIterationInputFields` equals `false`.\n\nField name from input 1.",
            "items": {
              "type": "string"
            }
          },
          "includeAllWorkflowFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Decide which fields should be part of the block output. Either include everything from the Iterations and Workflow inputs, or specify a subset.\n\nInclude all workflow input fields in the block output.\n\nRequired."
          },
          "workflowFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Decide which fields should be part of the block output. Either include everything from the Iterations and Workflow inputs, or specify a subset.\n\nChoose which workflow input fields to include in the block output.\n\nRelevant when `includeAllWorkflowFields` equals `false`.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "additionalBlocksToExecute": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select additional blocks that should also be executed during the for-each execution\n\nSelect additional blocks to execute for each iteration.",
            "items": {
              "type": "string",
              "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
            }
          },
          "iterationMode": {
            "description": "Choose how to handle iterations that have different schemas (different field sets and types). For example, this might happen if your workflow uses Pivot blocks. This applies to the fields emitted after applying the above options.\n\nChoose how to handle iteration inputs with different schemas: require the same schema or combine different schemas.\n\nRequired.\n\nValid values: `enforceSameSchema`, `merge`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "enforceSameSchema",
                  "merge"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_foreach",
        "description": "Options for a `foreach` block."
      },
      "BlockOptions_formatFieldNames": {
        "type": "object",
        "properties": {
          "fieldsToFormat": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select which fields should be renamed by this formatting step. Leave unset to apply the style to all fields.\n\nRequired.",
            "items": {
              "type": "string",
              "description": "Field name from upstream input. Provide one or more field names."
            }
          },
          "style": {
            "description": "Choose the naming style to apply to the selected fields.\n\nRequired.\n\nValid values: `titleCase`, `sentenceCase`, `lowerCaseSpaced`, `lowercaseUnspaced`, `snakeCase`, `kebabCase`, `dotCase`, `pathCase`, `camelCase`, `pascalCase`, `upperCaseSpaced`, `uppercaseUnspaced`, `upperSnakeCase`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "titleCase",
                  "sentenceCase",
                  "lowerCaseSpaced",
                  "lowercaseUnspaced",
                  "snakeCase",
                  "kebabCase",
                  "dotCase",
                  "pathCase",
                  "camelCase",
                  "pascalCase",
                  "upperCaseSpaced",
                  "uppercaseUnspaced",
                  "upperSnakeCase"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "duplicateHandling": {
            "description": "Choose how to resolve duplicate field names created by renaming.\n\nRequired.\n\nValid values: `addNumberWarn`, `fail`, `coalesce`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "addNumberWarn",
                  "fail",
                  "coalesce"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "requireLeadingLetter": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable this to prefix any formatted name that does not start with a letter so it begins with a letter.\n\nRequired."
          },
          "annotateOutputDescription": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Set the output field description to the original field name.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_formatFieldNames",
        "description": "Options for a `formatFieldNames` block."
      },
      "BlockOptions_frequencyTable": {
        "type": "object",
        "properties": {
          "fields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose the fields whose values will be counted to calculate frequencies.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "sortByFrequency": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Sort the output from highest frequency to lowest frequency.\n\nRequired."
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set how the results are partitioned.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_frequencyTable",
        "description": "Options for a `frequencyTable` block."
      },
      "BlockOptions_gAnalytics": {
        "type": "object",
        "properties": {
          "confirmConnection": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm the connection before exposing the available dimensions, metrics, and date range settings.\n\nRequired."
          },
          "dimensions": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose the dimensions to include in the query. Set this after confirming the connection.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired.",
            "items": {
              "type": "string",
              "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
            }
          },
          "metrics": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose the metrics to include in the query. Set this after confirming the connection.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired.",
            "items": {
              "type": "string",
              "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
            }
          },
          "connectionOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure the connection settings for this Google Analytics source.",
            "properties": {
              "credentialsType": {
                "description": "Choose how to authenticate to Google Analytics with service account credentials. Use the automatic option for a detected credentials source, or choose custom location to provide your own credentials file path.\n\nRequired.\n\nValid values: `automatic`, `credentialsFile`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "automatic",
                      "credentialsFile"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "propertyId": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Enter the Google Analytics property identifier to collect data from.\n\nRequired."
              },
              "credentialsFileLocation": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Provide the location of the custom credentials file when using a custom credentials location.\n\nRelevant when `credentialsType` equals `credentialsFile`.\n\nRequired.",
                "properties": {
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "dateRange": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set the date range used for the query. Set this after confirming the connection.\n\nRelevant when `confirmConnection` equals `true`.\n\nRequired.",
            "properties": {
              "rangeType": {
                "description": "Choose how the date range is defined: a single day, a fixed start and end date, or a relative timeframe.\n\nRequired.\n\nValid values: `singleDay`, `fixedRange`, `timeframe`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "singleDay",
                      "fixedRange",
                      "timeframe"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "date": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the single day to include from the beginning through the end of that day.\n\nRelevant when `rangeType` equals `singleDay`.\n\nRequired.",
                "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
              },
              "startDate": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive start date for a fixed date range. The range begins at the start of this day.\n\nRelevant when `rangeType` equals `fixedRange`.\n\nRequired.",
                "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
              },
              "endDate": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive end date for a fixed date range. The range includes this day through the end of the day, and leaves the end open when unset to use today.\n\nRelevant when `rangeType` equals `fixedRange`.",
                "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
              },
              "timeframeAmount": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the numeric size of the relative timeframe, such as 7 days or 3 months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.",
                "maximum": 2147483647,
                "minimum": -2147483648
              },
              "timeframePeriod": {
                "description": "Choose the unit for the relative timeframe, such as seconds, minutes, hours, days, weeks, or months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.\n\nValid values: `second`, `minute`, `hour`, `day`, `week`, `month`, `year`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "second",
                      "minute",
                      "hour",
                      "day",
                      "week",
                      "month",
                      "year"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_gAnalytics",
        "description": "Options for a `gAnalytics` block."
      },
      "BlockOptions_geocode": {
        "type": "object",
        "properties": {
          "geocodingService": {
            "description": "Select which geocoding service to use for the request. Choose the provider that matches the geocoding options you want to configure.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "nominatimFree"
                  },
                  "structuredQuery": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable structured address input and provide separate fields for each address component instead of one free-text address.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "addressField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that contains the full address to geocode.\n\nRelevant when `connected` equals `true`; when `structuredQuery` equals `false`.\n\nRequired.\n\nField name from input 0."
                  },
                  "amenityField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the field that contains the POI name or type for structured geocoding.\n\nRelevant when `connected` equals `true`; when `structuredQuery` equals `true`.\n\nField name from input 0."
                  },
                  "streetField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the field that contains the house number and street name.\n\nRelevant when `connected` equals `true`; when `structuredQuery` equals `true`.\n\nField name from input 0."
                  },
                  "cityField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the field that contains the city.\n\nRelevant when `connected` equals `true`; when `structuredQuery` equals `true`.\n\nField name from input 0."
                  },
                  "countyField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the field that contains the county.\n\nRelevant when `connected` equals `true`; when `structuredQuery` equals `true`.\n\nField name from input 0."
                  },
                  "stateField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the field that contains the state or region.\n\nRelevant when `connected` equals `true`; when `structuredQuery` equals `true`.\n\nField name from input 0."
                  },
                  "countryField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the field that contains the country.\n\nRelevant when `connected` equals `true`; when `structuredQuery` equals `true`.\n\nField name from input 0."
                  },
                  "postalCodeField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the field that contains the postal code.\n\nRelevant when `connected` equals `true`; when `structuredQuery` equals `true`.\n\nField name from input 0."
                  },
                  "restrictCountry": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Limit geocoding to specific countries to improve performance when all addresses are in one country.\n\nRelevant when `connected` equals `true`."
                  },
                  "countryCodes": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose the country or countries to restrict geocoding to.\n\nRelevant when `connected` equals `true`; when `restrictCountry` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "addressFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose which address fields to use when building the geocoding query.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "authOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure authentication for the geocoding service.\n\nRequired.",
                    "properties": {
                      "emailAddress": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Provide the email address Nominatim can use to contact you if your requests exceed the rate limit. Leave unset to use the default behavior.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "maxResultsPerSearch": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the maximum number of geocoding results to return for each address; defaults to 1. There is no value that means \"all\": null means use the default, so it still returns just one. For every candidate match, send a deliberately large number, for example 1000.\n\nRelevant when `connected` equals `true`.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "esriPaidFor"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the authentication connection to use for Esri geocoding.\n\nRequired."
                  },
                  "restrictToCountry": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Limit geocoding to a single country locator when all input locations belong to one country.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "country": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the country locator to use when restricting geocoding to one country.\n\nRelevant when `restrictToCountry` equals `true`.\n\nRequired."
                  },
                  "useAdditionalAddressFields": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable matching with separate address components instead of a single address field.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "neighbourhoodField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that provides neighbourhood values for the search.\n\nRelevant when `useAdditionalAddressFields` equals `true`.\n\nField name from input 0."
                  },
                  "cityField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that provides city values for the search.\n\nRelevant when `useAdditionalAddressFields` equals `true`.\n\nField name from input 0."
                  },
                  "subregionField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that provides subregion values for the search.\n\nRelevant when `useAdditionalAddressFields` equals `true`.\n\nField name from input 0."
                  },
                  "regionField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that provides region values for the search.\n\nRelevant when `useAdditionalAddressFields` equals `true`.\n\nField name from input 0."
                  },
                  "postalCodeField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that provides postal code values for the search.\n\nRelevant when `useAdditionalAddressFields` equals `true`.\n\nField name from input 0."
                  },
                  "countryCodeField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that provides country code values for the search.\n\nRelevant when `useAdditionalAddressFields` equals `true`.\n\nField name from input 0."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose the set of Esri address fields to use for geocoding.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "addressField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that provides the full address to geocode.\n\nRelevant when `connected` equals `true`.\n\nRequired.\n\nField name from input 0."
                  },
                  "category": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nFilter searches to a location category such as Airport.\n\nRelevant when `connected` equals `true`."
                  },
                  "maxResultsPerAddress": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the maximum number of results to return for each address; defaults to 1. There is no value that means \"all\": null means use the default, so it still returns just one. For every candidate match, send a deliberately large number, for example 1000.\n\nRelevant when `connected` equals `true`.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_geocode",
        "description": "Options for a `geocode` block."
      },
      "BlockOptions_googleAnalytics": {
        "type": "object",
        "properties": {
          "connection": {
            "type": [
              "string",
              "null"
            ],
            "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Google Analytics connection credentials and authorization settings.\n\nRequired."
          },
          "profile": {
            "type": [
              "string",
              "null"
            ],
            "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Google Analytics profile to read from.\n\nRelevant when `connected` equals `true`.\n\nRequired."
          },
          "reportType": {
            "description": "Choose the report type to fetch. Use the custom report type when you need to specify dimensions and metrics manually.\n\nRelevant when `connected` equals `true`.\n\nRequired.\n\nValid values: `visitorsGeographical`, `visitorsTimeline`, `visitorsLanguage`, `visitorsBrowser`, `visitorsOperatingSystem`, `trafficKeywords`, `trafficSources`, `topContent`, `adwordsKeywords`, `custom`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "visitorsGeographical",
                  "visitorsTimeline",
                  "visitorsLanguage",
                  "visitorsBrowser",
                  "visitorsOperatingSystem",
                  "trafficKeywords",
                  "trafficSources",
                  "topContent",
                  "adwordsKeywords",
                  "custom"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "dimensions": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the dimensions to include for a custom report type.\n\nRelevant when `reportType` equals `custom`.\n\nRequired.",
            "items": {
              "type": "string",
              "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
            }
          },
          "metrics": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the metrics to include for a custom report type.\n\nRelevant when `reportType` equals `custom`.\n\nRequired.",
            "items": {
              "type": "string",
              "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
            }
          },
          "dateRange": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set the date range for the analytics report.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
            "properties": {
              "rangeType": {
                "description": "Choose how the date range is defined: a single day, a fixed start and end date, or a relative timeframe.\n\nRequired.\n\nValid values: `singleDay`, `fixedRange`, `timeframe`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "singleDay",
                      "fixedRange",
                      "timeframe"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "date": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the single day to include from the beginning through the end of that day.\n\nRelevant when `rangeType` equals `singleDay`.\n\nRequired.",
                "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
              },
              "startDate": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive start date for a fixed date range. The range begins at the start of this day.\n\nRelevant when `rangeType` equals `fixedRange`.\n\nRequired.",
                "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
              },
              "endDate": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive end date for a fixed date range. The range includes this day through the end of the day, and leaves the end open when unset to use today.\n\nRelevant when `rangeType` equals `fixedRange`.",
                "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
              },
              "timeframeAmount": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the numeric size of the relative timeframe, such as 7 days or 3 months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.",
                "maximum": 2147483647,
                "minimum": -2147483648
              },
              "timeframePeriod": {
                "description": "Choose the unit for the relative timeframe, such as seconds, minutes, hours, days, weeks, or months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.\n\nValid values: `second`, `minute`, `hour`, `day`, `week`, `month`, `year`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "second",
                      "minute",
                      "hour",
                      "day",
                      "week",
                      "month",
                      "year"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          "segments": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the segments to apply to the analytics report.\n\nRelevant when `connected` equals `true`.",
            "items": {
              "type": "string",
              "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
            }
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_googleAnalytics",
        "description": "Options for a `googleAnalytics` block."
      },
      "BlockOptions_googleSheets": {
        "type": "object",
        "properties": {
          "connection": {
            "type": [
              "string",
              "null"
            ],
            "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the OAuth connection used to access Google Sheets.\n\nRequired."
          },
          "scope": {
            "description": "Choose whether to use a private spreadsheet or a public spreadsheet key.\n\nRequired.\n\nValid values: `private`, `public`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "private",
                  "public"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "spreadsheetKey": {
            "type": [
              "string",
              "null"
            ],
            "description": "Enter the key from a public Google Sheet URL, taken from the part between `/d/` and the next slash.\n\nRelevant when `scope` equals `public`.\n\nRequired."
          },
          "spreadsheet": {
            "type": [
              "string",
              "null"
            ],
            "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the private spreadsheet to read from.\n\nRelevant when `scope` equals `private`.\n\nRequired."
          },
          "allWorksheets": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Set to true to use every worksheet in the spreadsheet.\n\nRequired."
          },
          "worksheets": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose the worksheets to use when you are not reading all worksheets.\n\nRelevant when `allWorksheets` equals `false`.\n\nRequired.",
            "items": {
              "type": "string",
              "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
            }
          },
          "createWorksheetField": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Set to true to add a worksheet field to the output.\n\nRequired."
          },
          "worksheetFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the name of the field that will contain the worksheet name.\n\nRelevant when `createWorksheetField` equals `true`.\n\nRequired."
          },
          "autoRecogniseNumbers": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable automatic detection of numeric values in sheet cells.\n\nRequired."
          },
          "autoRecogniseDates": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable automatic detection of date values in sheet cells.\n\nRequired."
          },
          "tableDataOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how table data is read and mapped from the sheet.",
            "properties": {
              "hasHeader": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
              },
              "firstHeaderRow": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "lastHeaderRow": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "headerSeparator": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
              },
              "missingFieldPrefix": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
              },
              "autoCorrectFieldNameCase": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
              },
              "firstDataRow": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "lastDataRow": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "skipEmptyDataRows": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
              },
              "convertPlaceholdersToNulls": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
              },
              "locale": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_googleSheets",
        "description": "Options for a `googleSheets` block."
      },
      "BlockOptions_hierarchicalTopicModelling": {
        "type": "object",
        "properties": {
          "textFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the document fields that contain the corpus text to analyse for topics.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "stopwordsField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the field that contains stopwords to remove from the text before topic modelling.\n\nField name from input 1."
          },
          "entityRemoval": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose which entities to remove from the documents before modelling, such as URLs, user tags, hashtags, or repeated words.\n\nValid values: `urls`, `usertags`, `hashtags`, `repetitions`.",
            "items": {
              "type": "string",
              "enum": [
                "urls",
                "usertags",
                "hashtags",
                "repetitions"
              ]
            }
          },
          "minimumWordLength": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the minimum character length a word must have to be kept for topic modelling.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "termLimit": {
            "description": "Choose how many terms the discovered topics should contain overall. Higher settings take longer to compute.\n\nRequired.\n\nValid values: `normal`, `detailed`, `high`, `extreme`, `custom`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "normal",
                  "detailed",
                  "high",
                  "extreme",
                  "custom"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "customTermLimit": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the exact number of terms to use when the term limit is set to Custom.\n\nRelevant when `termLimit` equals `custom`.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "nGrams": {
            "description": "Choose whether to include 2-word or 3-word combinations in addition to single words when discovering topics.\n\nRequired.\n\nValid values: `one`, `twoGrams`, `threeGrams`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "one",
                  "twoGrams",
                  "threeGrams"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "topicsPerDocument": {
            "description": "Choose whether each document is assigned one dominant topic or multiple matching topics in the categorised documents output.\n\nRequired.\n\nValid values: `one`, `many`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "one",
                  "many"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "topicOverlap": {
            "description": "Choose whether topics may share terms or whether each term may appear only once across topics. Use Multiple times when defining preseeded topics that should overlap.\n\nRequired.\n\nValid values: `once`, `multiple`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "once",
                  "multiple"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "minimumTermCount": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the minimum number of terms that each topic must contain.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "preseededTopics": {
            "type": [
              "array",
              "null"
            ],
            "description": "Add predefined topics to guide topic discovery when overlapping topics are enabled.\n\nRelevant when `topicOverlap` equals `multiple`.",
            "items": {
              "type": "string"
            }
          },
          "includeTopicHierarchies": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include parent-child relationships between broader and more detailed topics in the output.\n\nRequired."
          },
          "specificity": {
            "description": "Choose whether to use automatic specificity selection or set the topic specificity manually.\n\nRequired.\n\nValid values: `auto`, `custom`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "auto",
                  "custom"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "topicSpecificity": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the specificity level from 0 to 1. Lower values produce fewer, broader topics; higher values produce more, more specific topics.\n\nRelevant when `specificity` equals `custom`.\n\nRequired."
          },
          "includeUncategorisedDocuments": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include documents that do not match any discovered topic in the categorised documents output without assigning them a category.\n\nRequired."
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure partitioning for hierarchical topic modelling when topic hierarchies are not included.\n\nRelevant when `includeTopicHierarchies` equals `false`.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_hierarchicalTopicModelling",
        "description": "Options for a `hierarchicalTopicModelling` block."
      },
      "BlockOptions_ifthensplit": {
        "type": "object",
        "properties": {
          "formula": {
            "type": [
              "string",
              "null"
            ],
            "description": "Enter a boolean formula that controls the split. Send data to the output named True when the formula evaluates to true; otherwise route it to the other output. If both inputs are connected, evaluate the formula on the first input and route data from the second.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_ifthensplit",
        "description": "Options for a `ifthensplit` block."
      },
      "BlockOptions_inputSwitch": {
        "type": "object",
        "properties": {
          "inputId": {
            "type": [
              "number",
              "null"
            ],
            "description": "Select which input dataset to use for this switch option. Use 1 for the first input, 2 for the second, and so on.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": -2147483648
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_inputSwitch",
        "description": "Options for a `inputSwitch` block."
      },
      "BlockOptions_inputrouter": {
        "type": "object",
        "properties": {
          "formula": {
            "type": [
              "string",
              "null"
            ],
            "description": "Enter an expression that returns the 1-based input number to route data from. For preview data, the first input is used.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_inputrouter",
        "description": "Options for a `inputrouter` block."
      },
      "BlockOptions_join": {
        "type": "object",
        "properties": {
          "criteria": {
            "type": [
              "array",
              "null"
            ],
            "description": "Join by matching records from both inputs, where a given field in input 1 matches another field in input 2.\nIf needed, you can specify additional join criteria, to match multiple pairs of fields.\n\nDefine the join criteria as a list of matching rules.",
            "items": {
              "type": "object",
              "properties": {
                "firstInputField": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Choose the field from the first input to use in the join criterion.\n\nRequired.\n\nField name from input 0."
                },
                "secondInputField": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Choose the field from the second input to use in the join criterion.\n\nRequired.\n\nField name from input 1."
                },
                "accentSensitive": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Compare text values with accent sensitivity enabled or disabled.\n\nRequired."
                },
                "caseSensitive": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Compare text values with case sensitivity enabled or disabled.\n\nRelevant when `accentSensitive` equals `true`.\n\nRequired."
                }
              },
              "additionalProperties": false
            }
          },
          "includeFirstInputMismatches": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include rows from input 1 that do not match any row in the other input. Leaving this off silently DROPS them - no error, no warning, just fewer rows out than in. Enriching a table with a lookup or dimension normally wants this on, so every original row survives whether or not it matched.\n\nRequired."
          },
          "includeJoinMatches": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include rows where the join criteria match between the two inputs.\n\nRequired."
          },
          "includeSecondInputMismatches": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include rows from input 2 that do not match any row in the other input.\n\nRequired."
          },
          "allowManyToMany": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Allow the join to produce many-to-many matches when the criteria match multiple rows on both sides.\n\nRequired."
          },
          "includeAllFieldsFromFirstInput": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include every field from input 1 in the joined output.\n\nRequired."
          },
          "firstInputFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose which fields from input 1 to include in the joined output.\n\nRelevant when `includeAllFieldsFromFirstInput` equals `false`.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "includeAllFieldsFromSecondInput": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include every field from input 2 in the joined output.\n\nRequired."
          },
          "secondInputFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose which fields from input 2 to include in the joined output.\n\nRelevant when `includeAllFieldsFromSecondInput` equals `false`.\n\nField name from input 1.",
            "items": {
              "type": "string"
            }
          },
          "conflictingFieldChoice": {
            "description": "Choose how to handle non-criteria fields that have the same name in both inputs.\n\nRequired.\n\nValid values: `addNewFields`, `keepValuesFromSecondInput`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "addNewFields",
                  "keepValuesFromSecondInput"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "createSourceField": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Create an extra field that records which dataset each output row came from.\n\nRequired."
          },
          "sourceFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the name of the source field to create when you enable source tracking.\n\nRelevant when `createSourceField` equals `true`.\n\nRequired."
          },
          "includeOutputNameInSource": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include the output name in the source field value.\n\nRelevant when `createSourceField` equals `true`.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_join",
        "description": "Options for a `join` block."
      },
      "BlockOptions_lookupData": {
        "type": "object",
        "properties": {
          "dataset": {
            "type": [
              "string",
              "null"
            ],
            "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the dataset to look up data from.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_lookupData",
        "description": "Options for a `lookupData` block."
      },
      "BlockOptions_macro": {
        "type": "object",
        "properties": {
          "projectLocation": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set the project location used by the macro. Configure the target file or folder path for where the macro should run or save its results.\n\nRequired.\n\nAllowed file types: .iox. To browse for a matching file, call `list_files({ forBlock: \"<this block>\", forOption: \"projectLocation\" })` (use forType instead of forBlock for a not-yet-added block) - the listing is then auto-restricted to these types, so you do not need to pass the extensions yourself.",
            "properties": {
              "path": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Set the file path to the local file in Omniscope.\n\nRequired."
              }
            },
            "additionalProperties": false
          },
          "macroOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "The block's own options: `customOptions` declares them (name, type, title), `values` sets them - an object keyed by option name. A name in `values` must match one declared in `customOptions`.\n\nSet the macro-specific options for this block. Use this to provide any additional configuration supported by the macro.\n\nRequired.",
            "properties": {
              "customOptions": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Define the list of custom option items to include in this block.",
                "items": {
                  "type": "object",
                  "properties": {
                    "optionType": {
                      "description": "Select the kind of custom option to configure. Choose the variant that matches the input the block should accept.\n\nRequired.",
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "text"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required so users must provide a value.\n\nRequired."
                            },
                            "multiline": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Allow the text value to span multiple lines instead of a single line.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title in the Options tab."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the options UI."
                            },
                            "optionWidth": {
                              "description": "Choose the rendered width of the option field in the UI.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "password"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required in the Options tab.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the display width of the option in the form.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "choice"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required before the user can continue.\n\nRequired."
                            },
                            "dropdown": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Enable a dropdown-style choice control for this option.\n\nRequired."
                            },
                            "layout": {
                              "description": "Choose how the available choices are laid out in the UI.\n\nRequired.\n\nValid values: `auto`, `list`, `compact`, `multiColumn`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "auto",
                                    "list",
                                    "compact",
                                    "multiColumn"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Show this text as a tooltip next to the option title."
                            },
                            "choices": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Define the list of selectable choices for this option.\n\nRequired.",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "value": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the option value shown to users and used internally for this choice.\n\nRequired."
                                  },
                                  "title": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the display title for this choice.\n\nRequired."
                                  },
                                  "description": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the descriptive text for this choice."
                                  },
                                  "tooltip": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the tooltip text shown for this choice."
                                  },
                                  "special": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Mark this choice as special so it can be treated differently by the picker or UI.\n\nRequired."
                                  },
                                  "groupTitle": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Set the group heading used to cluster this choice with related options."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the UI."
                            },
                            "optionWidth": {
                              "description": "Choose how wide the option should appear in the form.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "integer"
                            },
                            "minimumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the minimum allowed value for this integer option."
                            },
                            "maximumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the maximum allowed value for this integer option."
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Require the option to be filled in.\n\nRequired."
                            },
                            "showAsSlider": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Show this integer option as a slider in the UI. Set it when you want users to pick a value by dragging within the configured range.\n\nRelevant when `minimumValue` is non-empty; when `maximumValue` is non-empty.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the display title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group heading used to organize related options."
                            },
                            "optionWidth": {
                              "description": "Choose the option width used when rendering this field. Select one of Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "decimal"
                            },
                            "minimumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the minimum allowed decimal value for this option. Leave unset to allow any lower bound."
                            },
                            "maximumValue": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Set the maximum allowed decimal value for this option. Leave unset to allow any upper bound."
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Require a value for this option. Turn it on when the option must always be filled in.\n\nRequired."
                            },
                            "showAsSlider": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Display the option as a slider instead of a plain numeric input. Set this only when both minimum and maximum values are defined.\n\nRelevant when `minimumValue` is non-empty; when `maximumValue` is non-empty.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Show this text as the option tooltip next to the title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group."
                            },
                            "optionWidth": {
                              "description": "Choose how wide the option appears in the UI.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "boolean"
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title shown for this option in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the option group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the displayed width for the option. Select from Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "field"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required.\n\nRequired."
                            },
                            "inputIndex": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Select which connected input block this option reads fields from, starting at 1 for the first input.\n\nRequired.",
                              "maximum": 2147483647,
                              "minimum": 0
                            },
                            "fieldTypes": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Choose which field types this option accepts: Integer, Decimal, Text, or Date.\n\nValid values: `integer`, `decimal`, `text`, `date`.",
                              "items": {
                                "type": "string",
                                "enum": [
                                  "integer",
                                  "decimal",
                                  "text",
                                  "date"
                                ]
                              }
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title for the group that contains this option."
                            },
                            "optionWidth": {
                              "description": "Choose the width used to display the option in the editor.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "fields"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required in the block's options panel.\n\nRequired."
                            },
                            "inputIndex": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Choose which connected input block supplies the selectable fields. Use 1 for the first input, 2 for the second, and so on.\n\nRequired.",
                              "maximum": 2147483647,
                              "minimum": 0
                            },
                            "fieldTypes": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Select which field types are allowed to be chosen for this option: Integer, Decimal, Text, or Date.\n\nValid values: `integer`, `decimal`, `text`, `date`.",
                              "items": {
                                "type": "string",
                                "enum": [
                                  "integer",
                                  "decimal",
                                  "text",
                                  "date"
                                ]
                              }
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the group title used to organize this option in the UI."
                            },
                            "width": {
                              "description": "Set the display width for this option: Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "@type": {
                              "type": "string",
                              "const": "file"
                            },
                            "mandatory": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Mark this option as required so users must provide a value.\n\nRequired."
                            },
                            "readOnly": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Make this option read only in the Docker execution environment so users cannot edit it.\n\nRelevant when `server-options:/customBlockExecutionEnvironment` equals `DOCKER`.\n\nRequired."
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the tooltip text shown next to the option title."
                            },
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option name the script reads this value by, as in omniscope_api.get_option(\"my_option\") in Python or get.option(omni.api, \"my_option\") in R.\n\nRequired."
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the option title shown in the Options tab."
                            },
                            "groupTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Set the title of the group this option appears under."
                            },
                            "optionWidth": {
                              "description": "Choose the display width of the option in the editor: Shrink, Half, One, One and a half, Two, or Three.\n\nValid values: `shrink`, `half`, `one`, `oneAndHalf`, `two`, `three`.",
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "shrink",
                                    "half",
                                    "one",
                                    "oneAndHalf",
                                    "two",
                                    "three"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "@type"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "additionalProperties": false
                }
              },
              "values": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Values by option name, e.g. {\"threshold\": 0.5, \"label\": \"hello\"}. Each name must be declared in `customOptions`.",
                "additionalProperties": true
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_macro",
        "description": "Options for a `macro` block."
      },
      "BlockOptions_macroInput": {
        "type": "object",
        "properties": {
          "number": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the macro input number. Use this as the numeric value for the option.",
            "maximum": 2147483647,
            "minimum": 1
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the macro input title."
          },
          "label": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the macro input label shown to users."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the macro input description shown to users."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_macroInput",
        "description": "Options for a `macroInput` block."
      },
      "BlockOptions_macroOutput": {
        "type": "object",
        "properties": {
          "number": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the output number for this macro option entry.",
            "maximum": 2147483647,
            "minimum": 1
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the title text for this macro output option."
          },
          "label": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the label text shown for this macro output option."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the description text for this macro output option."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_macroOutput",
        "description": "Options for a `macroOutput` block."
      },
      "BlockOptions_microsoft365": {
        "type": "object",
        "properties": {
          "connectionConfirmed": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm that the Microsoft 365 connection is available before showing dependent service settings.\n\nRequired."
          },
          "service": {
            "description": "Choose which Microsoft 365 service to configure. Mail is the only available option currently.\n\nRelevant when `connectionConfirmed` equals `true`.\n\nRequired.\n\nValid values: `mail`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "mail"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "connectionOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure the Microsoft 365 connection details used to connect to the service.",
            "properties": {
              "tenantId": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Copy the Entra tenant (directory) ID for the app registration. Use the directory ID from the app overview.\n\nRequired."
              },
              "clientId": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Copy the Entra application (client) ID for the app registration. Use the application ID from the app overview.\n\nRequired."
              },
              "clientSecret": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nPaste the client secret value created in Entra. Use the secret value shown at creation time, not the secret ID.\n\nRequired.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "mailOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure Mail-specific Microsoft 365 settings.\n\nRelevant when `connectionConfirmed` equals `true`; when `service` equals `mail`.\n\nRequired.",
            "properties": {
              "mailboxUserEmailAddress": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Enter the mailbox user's email address or user principal name to read mail from that mailbox.\n\nRequired."
              },
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Select which mail fields to include in the output. Selecting body and attachment-related fields will be slower.\n\nRequired.\n\nValid values: `folder`, `id`, `internetMessageId`, `fromAddress`, `toRecipients`, `ccRecipients`, `bccRecipients`, `sentDate`, `receivedDate`, `subject`, `bodyPreview`, `bodyText`, `bodyHtml`, `hasAttachments`, `attachmentNames`, `attachmentCount`, `downloadedAttachmentNames`, `importance`, `isRead`, `categories`, `webLink`, `createdDate`, `lastModifiedDate`.",
                "items": {
                  "type": "string",
                  "enum": [
                    "folder",
                    "id",
                    "internetMessageId",
                    "fromAddress",
                    "toRecipients",
                    "ccRecipients",
                    "bccRecipients",
                    "sentDate",
                    "receivedDate",
                    "subject",
                    "bodyPreview",
                    "bodyText",
                    "bodyHtml",
                    "hasAttachments",
                    "attachmentNames",
                    "attachmentCount",
                    "downloadedAttachmentNames",
                    "importance",
                    "isRead",
                    "categories",
                    "webLink",
                    "createdDate",
                    "lastModifiedDate"
                  ]
                }
              },
              "folders": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Select the folders to read mail from.\n\nRequired.",
                "items": {
                  "type": "string",
                  "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                }
              },
              "maxMessages": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Limit the number of messages to download; defaults to 10000. There is no value that means \"all\": null means use the default, so it still caps at 10000. To download everything, send a deliberately large number, for example 1000000.",
                "maximum": 2147483647,
                "minimum": -2147483648
              },
              "filterOptions": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Configure additional mail filters for which messages are downloaded.",
                "properties": {
                  "fromAddressFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Filter messages by sender address. Use a partial match unless exact match is enabled."
                  },
                  "fromAddressExactMatch": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Require the sender address filter to match the address exactly instead of using partial matching.\n\nRequired."
                  },
                  "subjectContainsFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Filter messages by subject text, matching case-insensitively."
                  },
                  "specifyDateFilter": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable date filtering and show the date filter options.\n\nRequired."
                  },
                  "dateFilterOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the date range criteria used when date filtering is enabled.\n\nRelevant when `specifyDateFilter` equals `true`.\n\nRequired.",
                    "properties": {
                      "rangeType": {
                        "description": "Choose how the date range is defined: a single day, a fixed start and end date, or a relative timeframe.\n\nRequired.\n\nValid values: `singleDay`, `fixedRange`, `timeframe`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "singleDay",
                              "fixedRange",
                              "timeframe"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "date": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the single day to include from the beginning through the end of that day.\n\nRelevant when `rangeType` equals `singleDay`.\n\nRequired.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "startDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive start date for a fixed date range. The range begins at the start of this day.\n\nRelevant when `rangeType` equals `fixedRange`.\n\nRequired.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "endDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive end date for a fixed date range. The range includes this day through the end of the day, and leaves the end open when unset to use today.\n\nRelevant when `rangeType` equals `fixedRange`.",
                        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                      },
                      "timeframeAmount": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the numeric size of the relative timeframe, such as 7 days or 3 months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.",
                        "maximum": 2147483647,
                        "minimum": -2147483648
                      },
                      "timeframePeriod": {
                        "description": "Choose the unit for the relative timeframe, such as seconds, minutes, hours, days, weeks, or months.\n\nRelevant when `rangeType` equals `timeframe`.\n\nRequired.\n\nValid values: `second`, `minute`, `hour`, `day`, `week`, `month`, `year`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "second",
                              "minute",
                              "hour",
                              "day",
                              "week",
                              "month",
                              "year"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false
              },
              "attachmentOptions": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Configure how message attachments are included in the downloaded mail data.",
                "properties": {
                  "downloadAttachments": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Download the email attachments to the selected folder. Set this to enable attachment download options.\n\nRequired."
                  },
                  "attachmentFilenameFilter": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Filter which attachments are downloaded by wildcard filename pattern, such as *.xlsx. The match is case-insensitive.\n\nRelevant when `downloadAttachments` equals `true`.\n\nRequired."
                  },
                  "overwriteExistingFiles": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Overwrite files in the destination folder when an attachment has the same name as an existing file.\n\nRelevant when `downloadAttachments` equals `true`.\n\nRequired."
                  },
                  "attachmentFolder": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Choose the folder where downloaded attachments are saved.\n\nRelevant when `downloadAttachments` equals `true`.\n\nRequired.",
                    "properties": {
                      "path": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_microsoft365",
        "description": "Options for a `microsoft365` block."
      },
      "BlockOptions_networkanalysis": {
        "type": "object",
        "properties": {
          "linkFrom": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the node field that marks where each link starts. Use the source side of the relationship, such as the person replying in a Twitter-style network.\n\nRequired.\n\nField name from input 0."
          },
          "linkTo": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the node field that marks where each link ends. Use the target side of the relationship, such as the person being replied to in a Twitter-style network.\n\nRequired.\n\nField name from input 0."
          },
          "linkWeight": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the field that supplies link strength or weight. Leave unset to treat all links as equally strong.\n\nField name from input 0."
          },
          "softClusters": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Allow nodes to belong to more than one cluster. Leave unset to assign each node to exactly one cluster.\n\nRequired."
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the network is partitioned into clusters.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_networkanalysis",
        "description": "Options for a `networkanalysis` block."
      },
      "BlockOptions_normalise": {
        "type": "object",
        "properties": {
          "allFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Normalise all numeric fields in the data set.\n\nRequired."
          },
          "fields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the numeric fields to normalise when you are not applying normalisation to all numeric fields.\n\nRelevant when `allFields` equals `false`.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "overwriteData": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Set whether to overwrite the existing data or create new fields containing the normalised values.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_normalise",
        "description": "Options for a `normalise` block."
      },
      "BlockOptions_normalisecase": {
        "type": "object",
        "properties": {
          "caseStyle": {
            "description": "Select the case style to apply to the chosen text fields.\n\nRequired.\n\nValid values: `titleCase`, `sentenceCase`, `upperCase`, `lowerCase`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "titleCase",
                  "sentenceCase",
                  "upperCase",
                  "lowerCase"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "fields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the text fields to normalise.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_normalisecase",
        "description": "Options for a `normalisecase` block."
      },
      "BlockOptions_oneWayANOVA": {
        "type": "object",
        "properties": {
          "targetField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the numeric outcome field whose values will be compared across groups.\n\nRequired.\n\nField name from input 0."
          },
          "groupField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the categorical field that defines the groups or treatment conditions for each observation.\n\nRequired.\n\nField name from input 0."
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the data is partitioned before running the analysis.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_oneWayANOVA",
        "description": "Options for a `oneWayANOVA` block."
      },
      "BlockOptions_outputrouter": {
        "type": "object",
        "properties": {
          "formula": {
            "type": [
              "string",
              "null"
            ],
            "description": "Enter a formula that returns a number for the selected output. Output numbering starts at 1, and all other outputs are halted.\n\nRequired."
          },
          "blockOutputs": {
            "type": [
              "array",
              "null"
            ],
            "description": "Define the set of block outputs to route to. Add one output configuration for each output you want this block to expose.",
            "items": {
              "type": "object",
              "properties": {
                "label": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the label shown on the block connector.\n\nRequired."
                },
                "description": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Set the text shown in the connector tooltip and in the preview table. Leave unset if no explanation is necessary."
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_outputrouter",
        "description": "Options for a `outputrouter` block."
      },
      "BlockOptions_oversample": {
        "type": "object",
        "properties": {
          "field": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the field whose values should be oversampled.\n\nRequired.\n\nField name from input 0."
          },
          "value": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the value in the selected field that should be oversampled.\n\nRequired."
          },
          "newProportion": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the target percentage of the output that should contain this value.\n\nRequired.",
            "maximum": 100,
            "minimum": 0
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the output is partitioned before oversampling.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_oversample",
        "description": "Options for a `oversample` block."
      },
      "BlockOptions_parsetext": {
        "type": "object",
        "properties": {
          "inputField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the field that contains the JSON or XML text to parse.\n\nField name from input 0."
          },
          "includeOtherInputFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include the other input fields in the parsed output."
          },
          "parseAllFieldsAsText": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Treat all fields as text when parsing to avoid issues with mixed field types.\n\nRelevant when `inputField` is non-empty.\n\nRequired."
          },
          "fileType": {
            "description": "Choose the input format to parse, such as XML or JSON.\n\nRelevant when `inputField` is non-empty.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "xmlDataXmlFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify the XML nodes that make up each output record. Paths are slash-delimited element names and `*` matches any single element at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List the XML nodes to extract as fields within each record, one path per field, in the same slash-and-wildcard form as recordPath - and prefix an ATTRIBUTE with `@`: `root/a@id` is the `id` attribute of each `a`, `person/info@name` the `name` attribute of `info`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the name of the field to read or write in the XML path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the XML path used to locate the field value in the record.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set optional preset parsing options for XML input.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "jsonDataJsonFile"
                  },
                  "recordPath": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be treated as records in the output. Paths are slash-delimited key names and `*` matches any single node at that level: `root/*` is every child of root, `root/a/*` every child of each `a`. Start from `*` (every top-level element) and narrow.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Identify which JSON nodes should be extracted as fields in the output, one path per field, relative to the whole document in the same slash-and-wildcard form as recordPath - e.g. `person/*/name`, `person/*/address/*/city`.\n\nRequired.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "fieldName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the field name to use for this JSON path mapping.\n\nRequired."
                        },
                        "fieldPath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the JSON path for the field value to read or write.\n\nRequired."
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "presetOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set preset JSON reader options when you want to use a predefined configuration.",
                    "properties": {
                      "autoConfigure": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the preset that auto-configures the file reader behavior for the selected file type or format."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_parsetext",
        "description": "Options for a `parsetext` block."
      },
      "BlockOptions_pivot": {
        "type": "object",
        "properties": {
          "headerField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Choose the field whose unique values become new output field names.\n\nRequired."
          },
          "valueFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose the field or fields whose values are spread across the new pivoted output fields. Pick a single numeric field for the usual case.\n\nRequired.",
            "items": {
              "type": "string",
              "description": "Field name from upstream input. Provide one or more field names."
            }
          },
          "valueFieldNameFormat": {
            "description": "Set how to combine the header value and value field name when there are multiple value fields. Use the option that matches the desired output field naming order.\n\nRequired.\n\nValid values: `headerCellSlashValueField`, `headerCellDashValueField`, `valueFieldSlashHeaderCell`, `valueFieldDashHeaderCell`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "headerCellSlashValueField",
                  "headerCellDashValueField",
                  "valueFieldSlashHeaderCell",
                  "valueFieldDashHeaderCell"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "applyFieldLimit": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable the default field limit of 1000 output fields for the pivot. Turn this on when the pivot could create very wide output.\n\nRequired."
          },
          "valueFieldNamePrefix": {
            "type": [
              "string",
              "null"
            ],
            "description": "Add a prefix to generated value field names so they are easier to distinguish downstream."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_pivot",
        "description": "Options for a `pivot` block."
      },
      "BlockOptions_prediction": {
        "type": "object",
        "properties": {
          "targetField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Choose the field whose values you want to predict.\n\nRequired.\n\nField name from input 0."
          },
          "fieldsToUse": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the fields to use as predictors.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "provideLikelihoods": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable this to add a likelihood field for each target value, giving the probability for each record.\n\nRequired."
          },
          "maximumNumberOfCategories": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the maximum number of categories allowed per field when building the prediction model.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": 2
          },
          "maximumNumberOfTargetClasses": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the maximum number of target values the model will predict.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": 2
          },
          "useSyntheticFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable this to predict from combinations of fields as well as individual fields.\n\nRequired."
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the data is partitioned for prediction. Leave unset to use the default partitioning.\n\nRelevant when `provideLikelihoods` equals `false`.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_prediction",
        "description": "Options for a `prediction` block."
      },
      "BlockOptions_projectMeta": {
        "type": "object",
        "properties": {
          "locationType": {
            "description": "Choose the type of location used by this project metadata. Set it to the file, URL, or HDFS location details that match where the project data is stored.\n\nRequired.\n\nAllowed file types: .iox. To browse for a matching file, call `list_files({ forBlock: \"<this block>\", forOption: \"locationType\" })` (use forType instead of forBlock for a not-yet-added block) - the listing is then auto-restricted to these types, so you do not need to pass the extensions yourself.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "fileInOmniscope"
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the file path to the local file in Omniscope.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "urlHttpFtp"
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the URL to fetch or connect to, using an HTTP or FTP address.\n\nRequired."
                  },
                  "authentication": {
                    "description": "Choose the authentication method to use when accessing the URL. Leave unset to use no authentication.",
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "none"
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "basic"
                          },
                          "passwordConnectionOptions": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Configure the password connection options used for basic HTTP authentication. Set this to provide the credentials or related connection settings needed by the request.",
                            "properties": {
                              "username": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Enter the username to use for this connection."
                              },
                              "password": {
                                "type": [
                                  "object",
                                  "null"
                                ],
                                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the password to use for this connection.",
                                "properties": {
                                  "secretUpdate": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "The new secret. null leaves the stored one alone."
                                  }
                                },
                                "additionalProperties": false
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "bearerToken"
                          },
                          "bearerToken": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the bearer token to send with authenticated requests. Leave unset to use the default authentication behavior.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "@type": {
                            "type": "string",
                            "const": "oauth2ClientFlow"
                          },
                          "tokenEndpointUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the URL where the OAuth token request is sent to obtain an access token.\n\nRequired."
                          },
                          "clientId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Set the client identifier assigned to your application by the authorization server.\n\nRequired."
                          },
                          "clientSecret": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nSet the client secret used to authenticate your application with the authorization server.\n\nRequired.",
                            "properties": {
                              "secretUpdate": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "The new secret. null leaves the stored one alone."
                              }
                            },
                            "additionalProperties": false
                          },
                          "useStandardFlow": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Enable the standard client credentials grant type for providers that use the usual OAuth client flow. Leave unset for provider-specific grant types such as account credentials.\n\nRequired."
                          },
                          "addBasicAuthHeader": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add an Authorization Basic header with the client ID and client secret encoded as base64 for OAuth requests.\n\nRequired."
                          },
                          "addClientCredentialParams": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Add client ID and client secret parameters to the request body when the provider requires them.\n\nRequired."
                          },
                          "requestHeaders": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom headers to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          },
                          "requestParams": {
                            "type": [
                              "array",
                              "null"
                            ],
                            "description": "Add custom parameters to the token request.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "name": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter name to send with the OAuth 2.0 HTTP request. Use the exact name expected by the target endpoint or request template.\n\nRequired."
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the parameter value to send with the OAuth 2.0 HTTP request. Use the value expected by the target endpoint or request template."
                                }
                              },
                              "additionalProperties": false
                            }
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "@type"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "hadoopHdfsFile"
                  },
                  "host": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS name node host.\n\nRequired."
                  },
                  "port": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the WebHDFS service port number.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": 0
                  },
                  "user": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the user name used to access files and directories.\n\nRequired."
                  },
                  "path": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Set the HDFS file path to read or write. Leave unset until the host and user are provided.\n\nRelevant when `host` is non-empty; when `user` is non-empty.\n\nRequired."
                  },
                  "readBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal read buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "writeBufferMb": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the size of the internal write buffer in megabytes.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_projectMeta",
        "description": "Options for a `projectMeta` block."
      },
      "BlockOptions_projectPaths": {
        "type": "object",
        "properties": {
          "includeSubFolders": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Determines which projects to look at.\n\nInclude sub-folders when scanning the selected project folder.\n\nRequired."
          },
          "fileInputBlocks": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Determines which blocks to look at, within the projects found.\n\nLook for File blocks that represent files the workflow consumes.\n\nRequired."
          },
          "fileOutputBlocks": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Determines which blocks to look at, within the projects found.\n\nLook for File output blocks that represent files the workflow produces.\n\nRequired."
          },
          "appendBlocks": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Determines which blocks to look at, within the projects found.\n\nLook for Batch append and Append files blocks that combine contents from series of input files the workflow consumes.\n\nRequired."
          },
          "pathMode": {
            "description": "Determines whether and how to perform path replacements in the configurations of the blocks found.\n\nChoose whether to scan project paths only, run a simulation, or remap paths in project configurations.\n\nRequired.\n\nValid values: `scanOnly`, `simulation`, `reMap`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "scanOnly",
                  "simulation",
                  "reMap"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "oldPath": {
            "type": [
              "string",
              "null"
            ],
            "description": "Determines whether and how to perform path replacements in the configurations of the blocks found.\n\nSelect the field containing the path to find and replace exactly.\n\nRelevant when `pathMode` does not equal `scanOnly`.\n\nRequired.\n\nField name from input 0."
          },
          "newPath": {
            "type": [
              "string",
              "null"
            ],
            "description": "Determines whether and how to perform path replacements in the configurations of the blocks found.\n\nSelect the field containing the replacement path to write when the old path is matched exactly.\n\nRelevant when `pathMode` does not equal `scanOnly`.\n\nRequired.\n\nField name from input 0."
          },
          "caseSensitivePathMatch": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Determines whether and how to perform path replacements in the configurations of the blocks found.\n\nMatch paths using case sensitivity. Leave enabled for case-sensitive file systems; disable only when project paths may differ only by letter case on a case-insensitive file system.\n\nRelevant when `pathMode` does not equal `scanOnly`.\n\nRequired."
          },
          "confirmRemapping": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Determines whether and how to perform path replacements in the configurations of the blocks found.\n\nConfirm the remapping operation before applying irreversible changes to projects.\n\nRelevant when `pathMode` equals `reMap`.\n\nRequired."
          },
          "projectFolder": {
            "type": [
              "object",
              "null"
            ],
            "description": "Select a single project or a folder of projects to scan within the server files folder.\n\nRequired.\n\nAllowed file types: .iox. To browse for a matching file, call `list_files({ forBlock: \"<this block>\", forOption: \"projectFolder\" })` (use forType instead of forBlock for a not-yet-added block) - the listing is then auto-restricted to these types, so you do not need to pass the extensions yourself.",
            "properties": {
              "path": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Set the file path to the local file in Omniscope.\n\nRequired."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_projectPaths",
        "description": "Options for a `projectPaths` block."
      },
      "BlockOptions_randomSample": {
        "type": "object",
        "properties": {
          "samplingMethod": {
            "description": "Choose how to sample the input data: by fixed number of records or by percentage.\n\nRequired.\n\nValid values: `fixedNumber`, `percentage`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "fixedNumber",
                  "percentage"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "percentToRetain": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the percentage of records to keep when sampling by percentage.\n\nRelevant when `samplingMethod` equals `percentage`.\n\nRequired.",
            "maximum": 100,
            "minimum": 0
          },
          "fixedNumberOfRecords": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the exact number of records to keep when sampling by fixed number.\n\nRelevant when `samplingMethod` equals `fixedNumber`.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "allowFewerRecords": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Allow the block to return all available records if the input contains fewer records than the fixed number requested.\n\nRelevant when `samplingMethod` equals `fixedNumber`.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_randomSample",
        "description": "Options for a `randomSample` block."
      },
      "BlockOptions_recordFilter": {
        "type": "object",
        "properties": {
          "ifRuleMatches": {
            "description": "Choose whether matching rules are accepted or rejected. Set this to Accept or Reject only when you are using the Rules list.\n\nRelevant when `rules` is non-empty.\n\nRequired.\n\nValid values: `accept`, `reject`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "accept",
                  "reject"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "matchRulesBy": {
            "description": "Choose whether all rules must match or any one rule may match.\n\nRelevant when `rules` has multiple entries.\n\nRequired.\n\nValid values: `all`, `any`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "all",
                  "any"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "rules": {
            "type": [
              "array",
              "null"
            ],
            "description": "Add the filter rules to evaluate in order. Each item defines one rule used by the matching mode and accept or reject action.",
            "items": {
              "type": "object",
              "properties": {
                "filterType": {
                  "description": "Choose whether the rule filters by record number or by a field.\n\nRequired.\n\nValid values: `recordNumber`, `field`.",
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "recordNumber",
                        "field"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "field": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Select the field to evaluate when the filter type is set to Field.\n\nRelevant when `filterType` equals `field`.\n\nRequired.\n\nField name from input 0."
                },
                "filter": {
                  "description": "Choose the comparison or matching rule to apply to the selected record number or field value.\n\nRequired.",
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "hasAnyValue"
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "hasNoValue"
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "equals"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to compare against. Use this as the match text for the equals filter."
                        },
                        "accentSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable accent-sensitive matching so accented and unaccented characters are treated as different.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching so uppercase and lowercase letters are treated as different.\n\nRelevant when `accentSensitive` equals `true`.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the value: exact text, wildcard patterns, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "notEqual"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to compare against. The filter matches items that are not equal to this text."
                        },
                        "accentSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable accent-sensitive comparison so accented and unaccented characters are treated as different.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive comparison so uppercase and lowercase characters are treated as different.\n\nRelevant when `accentSensitive` equals `true`.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the value: as plain text, wildcard text using * and ?, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "greaterThan"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the comparison value to test against. Use the text you want this filter to match as greater than.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching when comparing the value. Leave unset to use the default case-insensitive behavior.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "greaterThanOrEqual"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the comparison value to test against. Provide the threshold or exact text to match, depending on the data type.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching when comparing text values.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "lessThan"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the value to compare against with the less-than filter.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching when the value is text; leave unset to use the default comparison behavior.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "lessThanOrEqual"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the comparison value to test against with the less-than-or-equal condition.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Set whether text comparisons should treat uppercase and lowercase letters as different.\n\nRequired."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "contains"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text or pattern to search for with the contains filter.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Set whether the contains match should respect letter case.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the value: as plain text, wildcards, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "doesNotContain"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the value to test against. The filter keeps items that do not contain this text.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Match uppercase and lowercase characters exactly when checking whether the value contains the text.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the search text: plain text, wildcards, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "startsWith"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Set the text to match at the start of each input value.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching when checking whether values start with the given text.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the match text: normal, wildcard patterns, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "endsWith"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text to match at the end of the field value.\n\nRequired."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Match text using exact letter case when enabled.\n\nRequired."
                        },
                        "searchMode": {
                          "description": "Choose how to interpret the match text: normal text, wildcards using * and ?, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "normal",
                                "wildcards",
                                "regularExpression"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "fuzzyMatchSoundex"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text to fuzzy-match using Soundex."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "string",
                          "const": "fuzzyMatchLevenshtein"
                        },
                        "value": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Enter the text to match against. The filter keeps items whose text matches this value with Levenshtein fuzzy matching."
                        },
                        "caseSensitive": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Enable case-sensitive matching for the fuzzy comparison.\n\nRequired."
                        },
                        "closeness": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Set how many edits are allowed between the input text and a match. Higher values make the fuzzy match broader.\n\nRequired.",
                          "maximum": 2147483647,
                          "minimum": -2147483648
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "@type"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_recordFilter",
        "description": "Options for a `recordFilter` block."
      },
      "BlockOptions_reddit": {
        "type": "object",
        "properties": {
          "connection": {
            "type": [
              "string",
              "null"
            ],
            "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Reddit connection credentials and authorization details used by this block.\n\nRequired."
          },
          "reportType": {
            "description": "Choose which kind of report to generate or process for the connected Reddit data.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "subredditArticles"
                  },
                  "queryString": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Filter articles by a search query. Leave unset to retrieve articles from all subreddits without a query filter."
                  },
                  "searchTimeframe": {
                    "description": "Limit query-based retrieval to articles from the selected timeframe. Use this only when a search query is set.\n\nRelevant when `queryString` is non-empty.\n\nRequired.\n\nValid values: `hour`, `day`, `week`, `month`, `year`, `all`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "hour",
                          "day",
                          "week",
                          "month",
                          "year",
                          "all"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "searchSort": {
                    "description": "Choose how to sort retrieved articles: hot, top, or new.\n\nRequired.\n\nValid values: `hot`, `top`, `new`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "hot",
                          "top",
                          "new"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "maxCount": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the maximum number of articles to retrieve per subreddit; defaults to 1000. There is no value that means \"all\": null means use the default, so it still caps at 1000. To retrieve everything, send a deliberately large number, for example 1000000.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "articleFieldsOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure which article fields are included in the output.",
                    "properties": {
                      "articleFields": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Select which article fields to include from Reddit articles.\n\nRequired.",
                        "items": {
                          "type": "string",
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                        }
                      }
                    },
                    "additionalProperties": false
                  },
                  "queryOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure additional query options for article retrieval.",
                    "properties": {
                      "sourceOfListForSearch": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Choose whether the subreddit list comes from manual entries or from an upstream block.\n\nRequired.\n\n`true` = Use upstream block; `false` = Use manual list."
                      },
                      "subredditNames": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "List the subreddit names to search, such as bigdata for www.reddit.com/r/bigdata.\n\nRelevant when `sourceOfListForSearch` equals `false`.",
                        "items": {
                          "type": "string"
                        }
                      },
                      "subredditNameField": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Select the upstream field that contains subreddit names when the list comes from another block.\n\nRelevant when `sourceOfListForSearch` equals `true`.\n\nRequired.\n\nField name from input 0."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "articleComments"
                  },
                  "commentFields": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure which comment fields to include in the output.",
                    "properties": {
                      "commentFields": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Select which Reddit comment fields to include in the output.\n\nRequired.",
                        "items": {
                          "type": "string",
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                        }
                      }
                    },
                    "additionalProperties": false
                  },
                  "queryOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the query filters and search criteria used to select Reddit comments.",
                    "properties": {
                      "sourceOfListForSearch": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Choose whether the subreddit and article IDs come from a manual list or from an upstream block.\n\nRequired.\n\n`true` = Use upstream block; `false` = Use manual list."
                      },
                      "subredditAndArticleIds": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Provide the subreddit names and article IDs to search comments for. Each item should identify one subreddit and one article.\n\nRelevant when `sourceOfListForSearch` equals `false`.",
                        "items": {
                          "type": "object",
                          "properties": {
                            "subredditName": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Enter the subreddit name to scope the comment query. Use the exact community name without the r/ prefix."
                            },
                            "articleId": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Enter the article ID to fetch comments for that post."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "subredditNameField": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Select the field that supplies the subreddit name when the list comes from an upstream block.\n\nRelevant when `sourceOfListForSearch` equals `true`.\n\nRequired.\n\nField name from input 0."
                      },
                      "articleIdField": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Select the field that supplies the article ID when the list comes from an upstream block.\n\nRelevant when `sourceOfListForSearch` equals `true`.\n\nRequired.\n\nField name from input 0."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_reddit",
        "description": "Options for a `reddit` block."
      },
      "BlockOptions_regressionAnalysis": {
        "type": "object",
        "properties": {
          "response": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the response field, also called the dependent variable or regressand, that the regression should predict.\n\nRequired.\n\nField name from input 0."
          },
          "predictorFields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the predictor fields, also called the independent variables or regressors, to use in the regression.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "regressionType": {
            "description": "Choose the regression family to fit: standard regression or adaptive spline regression (MARS).\n\nRequired.\n\nValid values: `regression`, `mars`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "regression",
                  "mars"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "modelsToUse": {
            "type": [
              "array",
              "null"
            ],
            "description": "Choose which regression model family to use when fitting a non-MARS regression.\n\nRelevant when `regressionType` does not equal `mars`.\n\nRequired.\n\nValid values: `linear`, `logistic`, `poisson`.",
            "items": {
              "type": "string",
              "enum": [
                "linear",
                "logistic",
                "poisson"
              ]
            }
          },
          "splineType": {
            "description": "Choose the spline shape for MARS: Linear for straight segments or Cubic for a smoother curved fit.\n\nRelevant when `regressionType` equals `mars`.\n\nRequired.\n\nValid values: `linear`, `cubic`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "linear",
                  "cubic"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "noInterceptTerm": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Disable the intercept term so the fitted line passes through the origin.\n\nRequired."
          },
          "robustEstimation": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable robust estimation to reduce the influence of outliers.\n\nRequired."
          },
          "stepwiseRegression": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable stepwise regression to remove predictor fields that do not contribute significant information about the response.\n\nRelevant when `regressionType` does not equal `mars`.\n\nRequired."
          },
          "interactions": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable interaction terms in MARS and allow the model to search for variable interactions.\n\nRelevant when `regressionType` equals `mars`.\n\nRequired."
          },
          "confidenceLevel": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the confidence level used for confidence intervals and prediction intervals.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "missingValueBehaviour": {
            "description": "Choose how to handle missing values in the input data: ignore them or remove rows containing them.\n\nRequired.\n\nValid values: `ignore`, `remove`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "ignore",
                  "remove"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the data is partitioned for this regression.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_regressionAnalysis",
        "description": "Options for a `regressionAnalysis` block."
      },
      "BlockOptions_report": {
        "type": "object",
        "properties": {},
        "additionalProperties": false,
        "title": "BlockOptions_report",
        "description": "Options for a `report` block."
      },
      "BlockOptions_reportGenerator": {
        "type": "object",
        "properties": {
          "templateReport": {
            "type": [
              "string",
              "null"
            ],
            "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nThis block will generate a new Report block, starting from an existing template report, adding a new tab from the template report for each row of the input data configuration. To get started:\n1. Choose your template report, which should contain 1 or more tabs to be used as templates;\n2. Add a \"Report Generator config\" block from the Add Block menu, and connect as input to this block;\n3. Edit the data in the input block, to define which tabs to replicate and with which additional filters applied;\n4. Choose the name of the report to generate; if it already exists, it will be deleted and replaced;\n5. Execute this block.\n\nSee the \"Instructions\" tab for more information.\n\nSelect the report block in this project to use as the template for generation.\n\nRequired."
          },
          "generatedReport": {
            "type": [
              "string",
              "null"
            ],
            "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nThis block will generate a new Report block, starting from an existing template report, adding a new tab from the template report for each row of the input data configuration. To get started:\n1. Choose your template report, which should contain 1 or more tabs to be used as templates;\n2. Add a \"Report Generator config\" block from the Add Block menu, and connect as input to this block;\n3. Edit the data in the input block, to define which tabs to replicate and with which additional filters applied;\n4. Choose the name of the report to generate; if it already exists, it will be deleted and replaced;\n5. Execute this block.\n\nSee the \"Instructions\" tab for more information.\n\nSelect the report block to generate or replace in this project, or provide a new report name to create it.\n\nRequired."
          },
          "freezeFilters": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "This block will generate a new Report block, starting from an existing template report, adding a new tab from the template report for each row of the input data configuration. To get started:\n1. Choose your template report, which should contain 1 or more tabs to be used as templates;\n2. Add a \"Report Generator config\" block from the Add Block menu, and connect as input to this block;\n3. Edit the data in the input block, to define which tabs to replicate and with which additional filters applied;\n4. Choose the name of the report to generate; if it already exists, it will be deleted and replaced;\n5. Execute this block.\n\nSee the \"Instructions\" tab for more information.\n\nFreeze the applied filters so they are not affected by the Reset button.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_reportGenerator",
        "description": "Options for a `reportGenerator` block."
      },
      "BlockOptions_report_blankReport": {
        "type": "object",
        "properties": {},
        "additionalProperties": false,
        "title": "BlockOptions_report_blankReport",
        "description": "Options for a `report:blankReport` block."
      },
      "BlockOptions_report_dataDiscoveryTemplate": {
        "type": "object",
        "properties": {},
        "additionalProperties": false,
        "title": "BlockOptions_report_dataDiscoveryTemplate",
        "description": "Options for a `report:dataDiscoveryTemplate` block."
      },
      "BlockOptions_report_freeFormDashboardTemplate": {
        "type": "object",
        "properties": {},
        "additionalProperties": false,
        "title": "BlockOptions_report_freeFormDashboardTemplate",
        "description": "Options for a `report:freeFormDashboardTemplate` block."
      },
      "BlockOptions_report_insightExplorer": {
        "type": "object",
        "properties": {
          "layoutMode": {
            "description": "Choose the report layout. CHAT_AND_ANSWER shows the chat panel beside the result - prefer this so the user can follow up and keep exploring (the usual case). ANSWER_ONLY hides the chat panel - use only when a fixed, single-answer tile is wanted.\n\nRequired.\n\nValid values: `CHAT_AND_ANSWER`, `ANSWER_ONLY`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "CHAT_AND_ANSWER",
                  "ANSWER_ONLY"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "customPrompt": {
            "type": [
              "string",
              "null"
            ],
            "description": "Append extra instructions to the assistant system prompt for this report, such as tone, domain context, answer format, or suggested questions.\n\nRequired."
          },
          "initialMessageBehaviour": {
            "description": "Choose what happens when a new chat opens: show a hidden system prompt, show an assistant greeting, or auto-ask a user question.\n\nRequired.\n\nValid values: `systemMessage`, `assistantMessage`, `userMessage`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "systemMessage",
                  "assistantMessage",
                  "userMessage"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "initialSystemMessage": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the hidden system message used when the initial message behaviour is `systemMessage`.\n\nRequired."
          },
          "initialAssistantMessage": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the assistant greeting used when the initial message behaviour is `assistantMessage`.\n\nRequired."
          },
          "initialUserMessage": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the user question that is automatically sent when the initial message behaviour is `userMessage`.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_report_insightExplorer",
        "description": "Options for a `report:insightExplorer` block."
      },
      "BlockOptions_report_instantDashboard": {
        "type": "object",
        "properties": {
          "initialMessage": {
            "type": [
              "string",
              "null"
            ],
            "description": "The instruction the AI acts on when this Instant Dashboard first opens, e.g. \"Build a sales overview grouped by region with a trend chart\". Set this to make the preset build a SPECIFIC report rather than the automatic default one. Omit to leave the default.\n\nRequired."
          },
          "customPrompt": {
            "type": [
              "string",
              "null"
            ],
            "description": "Extra text appended to the assistant's system prompt for this report - tone, domain context, answer-format conventions. Applies to every exchange, not just the first message.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_report_instantDashboard",
        "description": "Options for a `report:instantDashboard` block."
      },
      "BlockOptions_report_multiPageDocumentTemplate": {
        "type": "object",
        "properties": {},
        "additionalProperties": false,
        "title": "BlockOptions_report_multiPageDocumentTemplate",
        "description": "Options for a `report:multiPageDocumentTemplate` block."
      },
      "BlockOptions_report_report": {
        "type": "object",
        "properties": {},
        "additionalProperties": false,
        "title": "BlockOptions_report_report",
        "description": "Options for a `report:report` block."
      },
      "BlockOptions_report_topicModellingReport": {
        "type": "object",
        "properties": {},
        "additionalProperties": false,
        "title": "BlockOptions_report_topicModellingReport",
        "description": "Options for a `report:topicModellingReport` block."
      },
      "BlockOptions_reversegeocode": {
        "type": "object",
        "properties": {
          "service": {
            "description": "Choose the reverse geocoding service to use for this block.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "nominatimFree"
                  },
                  "latitudeField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that contains latitude values for the reverse geocode lookup.\n\nRelevant when `connected` equals `true`.\n\nRequired.\n\nField name from input 0."
                  },
                  "longitudeField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that contains longitude values for the reverse geocode lookup.\n\nRelevant when `connected` equals `true`.\n\nRequired.\n\nField name from input 0."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose which address fields to return from the reverse geocode result.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "authOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure the authentication settings used to call the Nominatim service.\n\nRequired.",
                    "properties": {
                      "emailAddress": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Provide the email address Nominatim can use to contact you if your requests exceed the rate limit. Leave unset to use the default behavior.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "geonamesFree"
                  },
                  "latitudeField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that contains latitude values for the reverse geocode lookup. Set it to the field with decimal latitude coordinates.\n\nRelevant when `connected` equals `true`.\n\nRequired.\n\nField name from input 0."
                  },
                  "longitudeField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that contains longitude values for the reverse geocode lookup. Set it to the field with decimal longitude coordinates.\n\nRelevant when `connected` equals `true`.\n\nRequired.\n\nField name from input 0."
                  },
                  "lookupData": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose which Geonames lookup data set to use for reverse geocoding. Use country-specific files only when the account provides access to them.\n\nRequired.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "majorCitiesOnly": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Limit lookup results to major cities only. Enable this to reduce execution time.\n\nRequired."
                  },
                  "authOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Provide Geonames authentication settings for lookup data that require an account name.\n\nRequired.",
                    "properties": {
                      "geonamesUsername": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter your Geonames username to enable additional lookup files. Create a free account at geonames.org/manageaccount if you need access to those files."
                      }
                    },
                    "additionalProperties": false
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose which address fields to populate from the reverse geocode lookup.\n\nRequired.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "esriPaidFor"
                  },
                  "connection": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the OAuth connection used to access Esri. Set the credentials and connection details required to authenticate against the service.\n\nRequired."
                  },
                  "latitudeField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that contains latitude values used for the reverse geocode search.\n\nRelevant when `connected` equals `true`.\n\nRequired.\n\nField name from input 0."
                  },
                  "longitudeField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that contains longitude values used for the reverse geocode search.\n\nRelevant when `connected` equals `true`.\n\nRequired.\n\nField name from input 0."
                  },
                  "addressLanguage": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the language for returned addresses.\n\nRelevant when `connected` equals `true`.\n\nRequired."
                  },
                  "fields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose which fields to include in the reverse geocode result output.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_reversegeocode",
        "description": "Options for a `reversegeocode` block."
      },
      "BlockOptions_rowId": {
        "type": "object",
        "properties": {
          "rowIdFieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the name of the field that will contain each row's ID.\n\nRequired."
          },
          "startId": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the ID assigned to the first row.\n\nRequired."
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how IDs are partitioned when assigning row IDs.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_rowId",
        "description": "Options for a `rowId` block."
      },
      "BlockOptions_salesforce": {
        "type": "object",
        "properties": {
          "connectionOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure the Salesforce connection settings used by this source. Set the nested connection details before choosing a table or writing SOQL.",
            "properties": {
              "connectionMethod": {
                "description": "Choose how to connect to Salesforce. OAuth uses client credentials with a Salesforce External Client App; legacy uses your Salesforce username, password and optional security token. Defaults to OAuth REST.\n\nRequired.\n\nValid values: `oauthRest`, `legacy`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "oauthRest",
                      "legacy"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "oauthDomainUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Enter the current My Domain URL for your Salesforce environment, using the HTTPS address without a path or query. Use the sandbox My Domain URL for a sandbox.\n\nRelevant when `connectionMethod` equals `oauthRest`.\n\nRequired."
              },
              "oauthClientId": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Enter the Consumer Key from your Salesforce External Client App. The app must have the Manage user data via APIs scope, Client Credentials Flow enabled, and a Run As user configured.\n\nRelevant when `connectionMethod` equals `oauthRest`.\n\nRequired."
              },
              "oauthClientSecret": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Consumer Secret from the same Salesforce External Client App as the Client ID. Confirm the connection after entering the URL, key and secret to load the available tables.\n\nRelevant when `connectionMethod` equals `oauthRest`.\n\nRequired.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              },
              "emailAddress": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Enter the Salesforce login email address for this connection.\n\nRelevant when `connectionMethod` equals `legacy`.\n\nRequired."
              },
              "password": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Salesforce password for this connection.\n\nRelevant when `connectionMethod` equals `legacy`.\n\nRequired.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              },
              "securityToken": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter your Salesforce security token and append it to the password when logging in from outside your trusted networks.\n\nRelevant when `connectionMethod` equals `legacy`.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              },
              "server": {
                "description": "Choose the Salesforce environment to connect to: Production or Test. Defaults to Production.\n\nRelevant when `connectionMethod` equals `legacy`.\n\nRequired.\n\nValid values: `production`, `test`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "production",
                      "test"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          "confirmed": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nConfirm that the Salesforce connection and object list are ready so the table and query fields become available.\n\nRequired."
          },
          "table": {
            "type": [
              "string",
              "null"
            ],
            "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Salesforce table to read from. Available tables are populated after the connection is confirmed.\n\nRelevant when `confirmed` equals `true`.\n\nRequired."
          },
          "useCustomSOQL": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable a custom SOQL query instead of reading from a selected table.\n\nRelevant when `confirmed` equals `true`.\n\nRequired."
          },
          "customSoql": {
            "type": [
              "string",
              "null"
            ],
            "description": "Enter the custom SOQL query to run against Salesforce. Use this only when custom SOQL is enabled.\n\nRelevant when `confirmed` equals `true`; when `useCustomSOQL` equals `true`.\n\nRequired."
          },
          "includeDeletedRecords": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include deleted and archived Salesforce records in query results. This applies only in OAuth/REST mode.\n\nRelevant when `confirmed` equals `true`; when `connectionOptions/connectionMethod` equals `oauthRest`.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_salesforce",
        "description": "Options for a `salesforce` block."
      },
      "BlockOptions_salesforceOutput": {
        "type": "object",
        "properties": {
          "connectionOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure the Salesforce connection details used by this publisher. Set the nested connection fields before choosing a table to publish to.\n\nRequired.",
            "properties": {
              "connectionMethod": {
                "description": "Choose how to connect to Salesforce. OAuth uses client credentials with a Salesforce External Client App; legacy uses your Salesforce username, password and optional security token. Defaults to OAuth REST.\n\nRequired.\n\nValid values: `oauthRest`, `legacy`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "oauthRest",
                      "legacy"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "oauthDomainUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Enter the current My Domain URL for your Salesforce environment, using the HTTPS address without a path or query. Use the sandbox My Domain URL for a sandbox.\n\nRelevant when `connectionMethod` equals `oauthRest`.\n\nRequired."
              },
              "oauthClientId": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Enter the Consumer Key from your Salesforce External Client App. The app must have the Manage user data via APIs scope, Client Credentials Flow enabled, and a Run As user configured.\n\nRelevant when `connectionMethod` equals `oauthRest`.\n\nRequired."
              },
              "oauthClientSecret": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Consumer Secret from the same Salesforce External Client App as the Client ID. Confirm the connection after entering the URL, key and secret to load the available tables.\n\nRelevant when `connectionMethod` equals `oauthRest`.\n\nRequired.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              },
              "emailAddress": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Enter the Salesforce login email address for this connection.\n\nRelevant when `connectionMethod` equals `legacy`.\n\nRequired."
              },
              "password": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter the Salesforce password for this connection.\n\nRelevant when `connectionMethod` equals `legacy`.\n\nRequired.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              },
              "securityToken": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nEnter your Salesforce security token and append it to the password when logging in from outside your trusted networks.\n\nRelevant when `connectionMethod` equals `legacy`.",
                "properties": {
                  "secretUpdate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The new secret. null leaves the stored one alone."
                  }
                },
                "additionalProperties": false
              },
              "server": {
                "description": "Choose the Salesforce environment to connect to: Production or Test. Defaults to Production.\n\nRelevant when `connectionMethod` equals `legacy`.\n\nRequired.\n\nValid values: `production`, `test`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "production",
                      "test"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          "confirmed": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Confirmation gate. Do NOT set this by writing a value (a value sent here on a configure_<type> call is ignored); flip it with the `confirm` tool, passing this option's dot-path. Its current true/false shows whether the gate is already satisfied. Resets to false when `connectionOptions` changes. Validated by connecting; only accepted if the connection succeeds, otherwise the connection error is returned.\n\nAcknowledge the publishing warning before the table and publish settings are shown. Set this to true to continue.\n\nRequired."
          },
          "table": {
            "type": [
              "string",
              "null"
            ],
            "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the Salesforce table to publish data to.\n\nRelevant when `confirmed` equals `true`.\n\nRequired."
          },
          "publishMethod": {
            "description": "Choose how to write the incoming data to Salesforce: append new rows, update existing rows, or replace the table contents.\n\nRelevant when `confirmed` equals `true`.\n\nRequired.\n\nValid values: `append`, `update`, `replace`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "append",
                  "update",
                  "replace"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "overwriteRemoteValuesWithNulls": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Set whether null values from the source should overwrite existing Salesforce values. Leave unset to preserve existing target values when the source is null.\n\nRelevant when `confirmed` equals `true`.\n\nRequired."
          },
          "publishWarningAcknowledged": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Acknowledge the Salesforce publishing warning before continuing. This confirms you understand linked fields may be affected and that replacing data can remove dependent rows.\n\nRelevant when `confirmed` equals `true`.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_salesforceOutput",
        "description": "Options for a `salesforceOutput` block."
      },
      "BlockOptions_savepoint": {
        "type": "object",
        "properties": {
          "retention": {
            "description": "Set it to Persistent to keep the data available after the workflow finishes, or Temporary to keep it only for the workflow run. Choose how data passing through this block is retained during and after workflow execution.\n\nRequired.\n\nValid values: `persistent`, `temporary`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "persistent",
                  "temporary"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_savepoint",
        "description": "Options for a `savepoint` block."
      },
      "BlockOptions_scramble": {
        "type": "object",
        "properties": {
          "allTextFields": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Set to include all text fields in the scramble operation.\n\nRequired."
          },
          "fields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the specific fields to scramble. Leave unset when all text fields are included.\n\nRelevant when `allTextFields` equals `false`.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_scramble",
        "description": "Options for a `scramble` block."
      },
      "BlockOptions_searchReplace": {
        "type": "object",
        "properties": {
          "searches": {
            "type": [
              "array",
              "null"
            ],
            "description": "Provide the list of searches to run in sequence. Each search can use the results of earlier replacements, so order the list in the same order you want them applied.",
            "items": {
              "type": "object",
              "properties": {
                "searchFor": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Enter the text or pattern to search for in the selected fields."
                },
                "replaceWith": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Enter the replacement text to use when matches are found."
                },
                "fields": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "description": "Choose which fields to search within.\n\nRequired.",
                  "items": {
                    "type": "string",
                    "description": "Field name from upstream input. Provide one or more field names."
                  }
                },
                "searchMode": {
                  "description": "Choose whether to search normally, with wildcards, or with a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcard`, `regex`.",
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "normal",
                        "wildcard",
                        "regex"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "matchEntireCell": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Match only when the whole cell value fits the search text or pattern.\n\nRequired."
                },
                "caseSensitive": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Treat uppercase and lowercase letters as distinct when searching.\n\nRequired."
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_searchReplace",
        "description": "Options for a `searchReplace` block."
      },
      "BlockOptions_sentimentAnalysis": {
        "type": "object",
        "properties": {
          "fieldsToUse": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the fields whose values should be included in the sentiment analysis.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "perSentence": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Set this to produce polarity scores for each sentence instead of one score per record.\n\nRequired."
          },
          "zeroIfNonComputable": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Set this to write 0 when a sentiment score cannot be calculated, instead of leaving the sentiment empty.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_sentimentAnalysis",
        "description": "Options for a `sentimentAnalysis` block."
      },
      "BlockOptions_sort": {
        "type": "object",
        "properties": {
          "sortCriteria": {
            "type": [
              "array",
              "null"
            ],
            "description": "Define the ordered list of sort criteria to apply. Add one item per level of sorting, in the order they should be used.",
            "items": {
              "type": "object",
              "properties": {
                "fieldName": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Choose the field to sort by.\n\nRequired.\n\nField name from input 0."
                },
                "ascending": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Set whether the sort order is ascending.\n\nRequired."
                },
                "caseSensitive": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Set whether string sorting should distinguish uppercase and lowercase letters. Leave unset to use the default case-insensitive behavior.\n\nRequired."
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_sort",
        "description": "Options for a `sort` block."
      },
      "BlockOptions_splitData": {
        "type": "object",
        "properties": {
          "splitMode": {
            "description": "Choose how the data block is split. Select the proportional split option or the kneedle-based split option.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "proportional"
                  },
                  "firstOutputPercent": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the percentage of records to send to the first output. The remainder is sent to the other output.\n\nRequired."
                  },
                  "deterministic": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Make the split consistent across runs for the same input.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "intelligentCutOff"
                  },
                  "valueField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Choose the field whose values the intelligent cut-off is based on.\n\nRequired.\n\nField name from input 0."
                  },
                  "leniency": {
                    "description": "Set how aggressively the block searches for split points. Use Strict to split earlier, Normal for a balanced approach, Lenient to include more records, or Very lenient to search most broadly.\n\nRequired.\n\nValid values: `strict`, `normal`, `lenient`, `veryLenient`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "strict",
                          "normal",
                          "lenient",
                          "veryLenient"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "partitioning": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure how the input is partitioned before the cut-off is calculated.\n\nRequired.",
                    "properties": {
                      "fields": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_splitData",
        "description": "Options for a `splitData` block."
      },
      "BlockOptions_splitValues": {
        "type": "object",
        "properties": {
          "field": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the field whose values should be split.\n\nRequired.\n\nField name from input 0."
          },
          "splitBy": {
            "description": "Choose whether to split the field by a separator or by fixed widths.\n\nRequired.\n\nValid values: `separator`, `fixedWidth`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "separator",
                  "fixedWidth"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "separator": {
            "type": [
              "string",
              "null"
            ],
            "description": "Enter the separator string used to split values. Use \\n for a newline, \\r for a carriage return, \\f for a form feed, and \\t for a tab.\n\nRelevant when `splitBy` equals `separator`.\n\nRequired."
          },
          "expandEmptyValues": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Expand consecutive separators into empty split values when splitting by a separator.\n\nRelevant when `splitBy` equals `separator`.\n\nRequired."
          },
          "breakpoints": {
            "type": [
              "array",
              "null"
            ],
            "description": "Provide the character positions where fixed-width values should be split.\n\nRelevant when `splitBy` equals `fixedWidth`.\n\nRequired.",
            "items": {
              "type": "string"
            }
          },
          "fieldNamingStyle": {
            "description": "Choose how to name the resulting split fields, using either numbered names like Field 2 or parenthesized names like Field (1).\n\nRequired.\n\nValid values: `standardised`, `legacy`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "standardised",
                  "legacy"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "autoDetectDataTypes": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Automatically detect whether each split field should be treated as a number or date.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_splitValues",
        "description": "Options for a `splitValues` block."
      },
      "BlockOptions_textAnalysis": {
        "type": "object",
        "properties": {
          "fields": {
            "type": [
              "array",
              "null"
            ],
            "description": "Select the text fields to analyze.\n\nRequired.\n\nField name from input 0.",
            "items": {
              "type": "string"
            }
          },
          "showWordCount": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include the total word count in the analysis output.\n\nRequired."
          },
          "showUniqueWordCount": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include the count of unique words in the analysis output.\n\nRequired."
          },
          "showTopWords": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include the most frequently occurring words in the analysis output.\n\nRequired."
          },
          "topWordsOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the top words list is generated and displayed.\n\nRelevant when `showTopWords` equals `true`.\n\nRequired.",
            "properties": {
              "minimumWordLength": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the minimum number of characters a word must have to be included in the top-words extraction.\n\nRequired.",
                "maximum": 2147483647,
                "minimum": -2147483648
              },
              "maximumWords": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum number of words to extract.\n\nRequired.",
                "maximum": 2147483647,
                "minimum": -2147483648
              },
              "ignoreCommonWords": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Exclude common words from the results using the selected language's stop-word list.\n\nRequired."
              },
              "commonWordsLanguage": {
                "description": "Choose the language whose common-word list is used when ignoring common words.\n\nRequired.\n\nValid values: `arabic`, `catalan`, `croatian`, `dutch`, `danish`, `english`, `esperanto`, `farsi`, `finnish`, `french`, `german`, `greek`, `hebrew`, `hindi`, `hungarian`, `italian`, `latin`, `norwegian`, `polish`, `portugese`, `romanian`, `russian`, `slovak`, `slovenian`, `spanish`, `swedish`, `turkish`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "arabic",
                      "catalan",
                      "croatian",
                      "dutch",
                      "danish",
                      "english",
                      "esperanto",
                      "farsi",
                      "finnish",
                      "french",
                      "german",
                      "greek",
                      "hebrew",
                      "hindi",
                      "hungarian",
                      "italian",
                      "latin",
                      "norwegian",
                      "polish",
                      "portugese",
                      "romanian",
                      "russian",
                      "slovak",
                      "slovenian",
                      "spanish",
                      "swedish",
                      "turkish"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "customWordsToIgnore": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Provide a custom list of words to exclude from the extracted results.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          },
          "detectLanguage": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Detect the language of the text and include it in the analysis output.\n\nRequired."
          },
          "showReadability": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Calculate and include a readability score for the text.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_textAnalysis",
        "description": "Options for a `textAnalysis` block."
      },
      "BlockOptions_textInput": {
        "type": "object",
        "properties": {
          "fillFromInput": {
            "type": [
              "string",
              "null"
            ],
            "description": "(This setting cannot be set through the API - a write here is ignored.)\n\nReplace all fields and records with the first complete records that fit within a 10,000-cell limit. Live sources are queried on click; other inputs must have been fully executed. Values are copied as text.\n\nRequired."
          },
          "autoDetectDataTypes": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Automatically detect the data type for each field. Leave unset to treat all fields as text.\n\nRequired."
          },
          "dataTableOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "The table's content, as a header plus rows: {\"fields\":[\"Code\",\"Label\"],\"rows\":[[\"A\",\"Alpha\"],[\"B\",null]]}. Every row must have exactly as many cells as `fields`. Sending this REPLACES the whole table - to change one cell, read the current table with describe_block and send it back with that cell changed. Limits for one write through this API: 1000 rows and 50000 cells. Types are detected when the table runs unless autoDetectDataTypes is off, in which case every column stays text.\n\nConfigure options for the data table input.\n\nRequired.",
            "properties": {
              "fields": {
                "type": "array",
                "description": "Column names, in order. Must be unique.",
                "items": {
                  "type": "string"
                }
              },
              "rows": {
                "type": "array",
                "description": "One array per row, each holding exactly as many cells as `fields`, in the same order. null means an empty cell.",
                "items": {
                  "type": "array",
                  "items": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_textInput",
        "description": "Options for a `textInput` block."
      },
      "BlockOptions_textInput_batchOutputConfigExample": {
        "type": "object",
        "properties": {
          "fillFromInput": {
            "type": [
              "string",
              "null"
            ],
            "description": "(This setting cannot be set through the API - a write here is ignored.)\n\nReplace all fields and records with the first complete records that fit within a 10,000-cell limit. Live sources are queried on click; other inputs must have been fully executed. Values are copied as text.\n\nRequired."
          },
          "autoDetectDataTypes": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Automatically detect the data type for each field. Leave unset to treat all fields as text.\n\nRequired."
          },
          "dataTableOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "The table's content, as a header plus rows: {\"fields\":[\"Code\",\"Label\"],\"rows\":[[\"A\",\"Alpha\"],[\"B\",null]]}. Every row must have exactly as many cells as `fields`. Sending this REPLACES the whole table - to change one cell, read the current table with describe_block and send it back with that cell changed. Limits for one write through this API: 1000 rows and 50000 cells. Types are detected when the table runs unless autoDetectDataTypes is off, in which case every column stays text.\n\nConfigure options for the data table input.\n\nRequired.",
            "properties": {
              "fields": {
                "type": "array",
                "description": "Column names, in order. Must be unique.",
                "items": {
                  "type": "string"
                }
              },
              "rows": {
                "type": "array",
                "description": "One array per row, each holding exactly as many cells as `fields`, in the same order. null means an empty cell.",
                "items": {
                  "type": "array",
                  "items": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_textInput_batchOutputConfigExample",
        "description": "Options for a `textInput:batchOutputConfigExample` block."
      },
      "BlockOptions_textInput_multiTenantConfigExample": {
        "type": "object",
        "properties": {
          "fillFromInput": {
            "type": [
              "string",
              "null"
            ],
            "description": "(This setting cannot be set through the API - a write here is ignored.)\n\nReplace all fields and records with the first complete records that fit within a 10,000-cell limit. Live sources are queried on click; other inputs must have been fully executed. Values are copied as text.\n\nRequired."
          },
          "autoDetectDataTypes": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Automatically detect the data type for each field. Leave unset to treat all fields as text.\n\nRequired."
          },
          "dataTableOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "The table's content, as a header plus rows: {\"fields\":[\"Code\",\"Label\"],\"rows\":[[\"A\",\"Alpha\"],[\"B\",null]]}. Every row must have exactly as many cells as `fields`. Sending this REPLACES the whole table - to change one cell, read the current table with describe_block and send it back with that cell changed. Limits for one write through this API: 1000 rows and 50000 cells. Types are detected when the table runs unless autoDetectDataTypes is off, in which case every column stays text.\n\nConfigure options for the data table input.\n\nRequired.",
            "properties": {
              "fields": {
                "type": "array",
                "description": "Column names, in order. Must be unique.",
                "items": {
                  "type": "string"
                }
              },
              "rows": {
                "type": "array",
                "description": "One array per row, each holding exactly as many cells as `fields`, in the same order. null means an empty cell.",
                "items": {
                  "type": "array",
                  "items": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_textInput_multiTenantConfigExample",
        "description": "Options for a `textInput:multiTenantConfigExample` block."
      },
      "BlockOptions_textInput_reportGeneratorConfig": {
        "type": "object",
        "properties": {
          "fillFromInput": {
            "type": [
              "string",
              "null"
            ],
            "description": "(This setting cannot be set through the API - a write here is ignored.)\n\nReplace all fields and records with the first complete records that fit within a 10,000-cell limit. Live sources are queried on click; other inputs must have been fully executed. Values are copied as text.\n\nRequired."
          },
          "autoDetectDataTypes": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Automatically detect the data type for each field. Leave unset to treat all fields as text.\n\nRequired."
          },
          "dataTableOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "The table's content, as a header plus rows: {\"fields\":[\"Code\",\"Label\"],\"rows\":[[\"A\",\"Alpha\"],[\"B\",null]]}. Every row must have exactly as many cells as `fields`. Sending this REPLACES the whole table - to change one cell, read the current table with describe_block and send it back with that cell changed. Limits for one write through this API: 1000 rows and 50000 cells. Types are detected when the table runs unless autoDetectDataTypes is off, in which case every column stays text.\n\nConfigure options for the data table input.\n\nRequired.",
            "properties": {
              "fields": {
                "type": "array",
                "description": "Column names, in order. Must be unique.",
                "items": {
                  "type": "string"
                }
              },
              "rows": {
                "type": "array",
                "description": "One array per row, each holding exactly as many cells as `fields`, in the same order. null means an empty cell.",
                "items": {
                  "type": "array",
                  "items": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_textInput_reportGeneratorConfig",
        "description": "Options for a `textInput:reportGeneratorConfig` block."
      },
      "BlockOptions_textInput_textInput": {
        "type": "object",
        "properties": {
          "fillFromInput": {
            "type": [
              "string",
              "null"
            ],
            "description": "(This setting cannot be set through the API - a write here is ignored.)\n\nReplace all fields and records with the first complete records that fit within a 10,000-cell limit. Live sources are queried on click; other inputs must have been fully executed. Values are copied as text.\n\nRequired."
          },
          "autoDetectDataTypes": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Automatically detect the data type for each field. Leave unset to treat all fields as text.\n\nRequired."
          },
          "dataTableOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "The table's content, as a header plus rows: {\"fields\":[\"Code\",\"Label\"],\"rows\":[[\"A\",\"Alpha\"],[\"B\",null]]}. Every row must have exactly as many cells as `fields`. Sending this REPLACES the whole table - to change one cell, read the current table with describe_block and send it back with that cell changed. Limits for one write through this API: 1000 rows and 50000 cells. Types are detected when the table runs unless autoDetectDataTypes is off, in which case every column stays text.\n\nConfigure options for the data table input.\n\nRequired.",
            "properties": {
              "fields": {
                "type": "array",
                "description": "Column names, in order. Must be unique.",
                "items": {
                  "type": "string"
                }
              },
              "rows": {
                "type": "array",
                "description": "One array per row, each holding exactly as many cells as `fields`, in the same order. null means an empty cell.",
                "items": {
                  "type": "array",
                  "items": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_textInput_textInput",
        "description": "Options for a `textInput:textInput` block."
      },
      "BlockOptions_timeSeriesForecast": {
        "type": "object",
        "properties": {
          "valueField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the field whose values the forecast should predict.\n\nRequired.\n\nField name from input 0."
          },
          "dateField": {
            "type": [
              "string",
              "null"
            ],
            "description": "Select the field that contains the dates or timestamps for the series. Leave unset to forecast without an explicit date field.\n\nField name from input 0."
          },
          "assumeEquidistant": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Treat observations as evenly spaced in time. Enable this when the interval between dates is constant and you want the forecast to use that spacing directly.\n\nRequired."
          },
          "forecastLength": {
            "description": "Choose how far ahead to forecast, such as a fixed horizon, a target date, or a number of observations ahead.\n\nRequired.\n\nValid values: `week`, `quarter`, `biannual`, `annual`, `specify`, `other`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "week",
                  "quarter",
                  "biannual",
                  "annual",
                  "specify",
                  "other"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "predictToDate": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO date-time, no timezone, e.g. `2025-10-15T13:45:00`.\n\nSet the date and time to forecast up to in the format YYYY-MM-DD HH:MM:SS.\n\nRelevant when `forecastLength` equals `specify`.\n\nRequired.",
            "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(:[0-9]{2}(\\.[0-9]{3})?)?$"
          },
          "predictionLength": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the number of future records to predict.\n\nRelevant when `forecastLength` equals `other`.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "provideTestForecast": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Generate an additional test forecast so the result can be compared with observed data.\n\nRequired."
          },
          "seasonLength": {
            "description": "Choose the seasonal cycle length used to model repeating patterns in the data.\n\nRequired.\n\nValid values: `year`, `biannual`, `quarter`, `month`, `week`, `day`, `hour`, `minute`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "year",
                  "biannual",
                  "quarter",
                  "month",
                  "week",
                  "day",
                  "hour",
                  "minute"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "seasonalityDetection": {
            "description": "Choose whether seasonality is treated as additive, multiplicative, or automatically detected.\n\nRequired.\n\nValid values: `auto`, `additive`, `multiplicative`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "auto",
                  "additive",
                  "multiplicative"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "forecastModel": {
            "description": "Choose the forecasting model to use, or leave automatic to select the model that performs best on a test forecast.\n\nRequired.\n\nValid values: `auto`, `stlm`, `arima`, `holtWinters`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "auto",
                  "stlm",
                  "arima",
                  "holtWinters"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "setFrequencyManually": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable manual control of the seasonal frequency.\n\nRequired."
          },
          "frequency": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the number of observations in each seasonal cycle.\n\nRelevant when `setFrequencyManually` equals `true`.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "setArimaParameters": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable manual ARIMA parameter settings instead of automatic specification.\n\nRequired."
          },
          "interceptTerm": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Include an intercept term in the ARIMA model.\n\nRelevant when `setArimaParameters` equals `true`.\n\nRequired."
          },
          "arOrder": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the autoregressive order, which is the number of lagged values used by the ARIMA model.\n\nRelevant when `setArimaParameters` equals `true`.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "maOrder": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the moving-average order, which is the number of lagged forecast errors used by the ARIMA model.\n\nRelevant when `setArimaParameters` equals `true`.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "differencingOrder": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the non-seasonal differencing order used to make the series stationary.\n\nRelevant when `setArimaParameters` equals `true`.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "seasonalArOrder": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the seasonal autoregressive order, which is the number of seasonal lagged values used by the ARIMA model.\n\nRelevant when `setArimaParameters` equals `true`.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "seasonalMaOrder": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the seasonal moving-average order, which is the number of seasonal lagged errors used by the ARIMA model.\n\nRelevant when `setArimaParameters` equals `true`.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "seasonalDifferencingOrder": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set the seasonal differencing order used to remove repeating seasonal structure from the series.\n\nRelevant when `setArimaParameters` equals `true`.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "trendRigidity": {
            "type": [
              "number",
              "null"
            ],
            "description": "Set how strongly the long-term trend is constrained toward a straight line during decomposition.\n\nRelevant when `setFrequencyManually` equals `true`.\n\nRequired.",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "partitioning": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the data is partitioned for training and testing.\n\nRequired.",
            "properties": {
              "fields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Choose the fields to partition by. The block computes a separate result for each combination of these field values and appends the results. For multiple inputs, use the fields common to the selected inputs.\n\nField name from input 0.",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_timeSeriesForecast",
        "description": "Options for a `timeSeriesForecast` block."
      },
      "BlockOptions_tokenAnalyst": {
        "type": "object",
        "properties": {
          "apiKey": {
            "type": [
              "object",
              "null"
            ],
            "description": "Write-only: the stored value is never returned. null here means no secret is set (and sending null clears it); {\"secretUpdate\": null} means one IS set - send that back unchanged to keep it; {\"secretUpdate\": \"...\"} sets or replaces it.\n\nProvide the API key used to authenticate and authorize access to the data manager.\n\nRequired.",
            "properties": {
              "secretUpdate": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The new secret. null leaves the stored one alone."
              }
            },
            "additionalProperties": false
          },
          "streamOptions": {
            "description": "Choose which data stream to subscribe to, such as confirmed or unconfirmed Bitcoin transactions.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "btcConfirmedExchangeFlows"
                  },
                  "transactionFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which BTC transaction fields to include in the confirmed exchange flow output.\n\nRequired.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "btcUnconfirmedExchangeFlows"
                  },
                  "transactionFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose which BTC unconfirmed transaction fields to include in the stream output.\n\nRequired.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "captureDuration": {
            "type": [
              "object",
              "null"
            ],
            "description": "Set how long the block should run while it captures events from the selected stream.\n\nRequired.",
            "properties": {
              "infinite": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Set capture duration to infinite time.\n\nRequired."
              },
              "duration": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the numeric capture duration. Use this together with timeUnit when infinite is disabled.\n\nRelevant when `infinite` equals `false`.\n\nRequired."
              },
              "timeUnit": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the time unit for the duration value. Use this together with duration when infinite is disabled.\n\nRelevant when `infinite` equals `false`.\n\nRequired."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_tokenAnalyst",
        "description": "Options for a `tokenAnalyst` block."
      },
      "BlockOptions_tokenise": {
        "type": "object",
        "properties": {
          "field": {
            "type": [
              "string",
              "null"
            ],
            "description": "Choose the field whose values should be tokenised. The block splits values from this field into tokens using the separator you provide.\n\nRequired.\n\nField name from input 0."
          },
          "separator": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the separator used to split values into tokens. Use \\n for a newline, \\r for a carriage return, \\f for a form feed, and \\t for a tab.\n\nRequired."
          },
          "caseSensitive": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable this to treat case-only differences in other fields as significant when deciding which records to combine.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_tokenise",
        "description": "Options for a `tokenise` block."
      },
      "BlockOptions_transpose": {
        "type": "object",
        "properties": {
          "tableDataOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure how the transposed table data is read and interpreted. Set the nested options that control row and column handling for the input table.",
            "properties": {
              "hasHeader": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Set whether the input contains header rows with field names. Defaults to true.\n\nRequired."
              },
              "firstHeaderRow": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the first row used to build header names. Row numbering starts at 1 and defaults to 1.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "lastHeaderRow": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the last row used to build header names. Leave unset for a single header row.\n\nRelevant when `hasHeader` equals `true`.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "headerSeparator": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Set the text used to join names from multiple header rows. Defaults to a space.\n\nRelevant when `hasHeader` equals `true`."
              },
              "missingFieldPrefix": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Set the prefix used for unnamed fields; defaults to \"Field\", giving \"Field 1\", \"Field 2\". For no prefix at all, send an explicit empty string \"\" - not null, which means use the default and so keeps \"Field\".\n\nRequired."
              },
              "autoCorrectFieldNameCase": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Set whether all-uppercase header names are made more readable. Defaults to true.\n\nRelevant when `hasHeader` equals `true`.\n\nRequired."
              },
              "firstDataRow": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the first row that contains data cells. Defaults to 2.\n\nRequired.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "lastDataRow": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the last row that contains data cells. Leave unset to read through the final row.",
                "maximum": 2147483647,
                "minimum": 1
              },
              "skipEmptyDataRows": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Set whether empty data rows are skipped. Defaults to true.\n\nRequired."
              },
              "convertPlaceholdersToNulls": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Convert common placeholder values such as n/a, unknown, null, -, and #REF! to null. Defaults to true.\n\nRequired."
              },
              "locale": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSet the locale used for parsing and text handling. Defaults to en_GB."
              }
            },
            "additionalProperties": false
          },
          "autoDetectDataTypes": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Enable automatic detection of data types in each field. Leave unset to treat all fields as text.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_transpose",
        "description": "Options for a `transpose` block."
      },
      "BlockOptions_twitter": {
        "type": "object",
        "properties": {
          "connection": {
            "type": [
              "string",
              "null"
            ],
            "description": "Connect this in the Omniscope UI - an agent cannot complete an OAuth sign-in. Leave it as it is.\n\nConfigure the Twitter connection credentials and authorization settings for this source.\n\nRequired."
          },
          "reportType": {
            "description": "Choose which Twitter report to run. Select the report variant that matches the data you want to extract.\n\nRelevant when `connected` equals `true`.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "latestPopularTweets"
                  },
                  "maxCount": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the maximum number of tweets to retrieve per search; defaults to 1000. There is no value that means \"all\": null means use the default, so it still caps at 1000. To retrieve everything, send a deliberately large number, for example 1000000.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "filterByLocation": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable location-based filtering for the tweet search.\n\nRequired."
                  },
                  "statusFieldsOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure which tweet status fields are returned.",
                    "properties": {
                      "twitterFields": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Select which Twitter fields to include in the output. Choose the set of tweet fields you want returned.\n\nRequired.",
                        "items": {
                          "type": "string",
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                        }
                      }
                    },
                    "additionalProperties": false
                  },
                  "querySelectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure which tweet query terms or selections are used for the search.",
                    "properties": {
                      "textSource": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Choose where the search text comes from: a manual list or the input data from an upstream block.\n\nRequired.\n\n`true` = Use text from upstream block; `false` = Use text from a manual list."
                      },
                      "searchText": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Provide one or more search strings to create separate tweet searches. Each search matches tweets containing all terms in the string.\n\nRelevant when `textSource` equals `false`.",
                        "items": {
                          "type": "string"
                        }
                      },
                      "searchTextField": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Select the input field that contains the search text when using text from an upstream block.\n\nRelevant when `textSource` equals `true`.\n\nField name from input 0."
                      }
                    },
                    "additionalProperties": false
                  },
                  "location": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the latitude, longitude, and radius used to return tweets from users located within the selected area.\n\nRelevant when `filterByLocation` equals `true`.\n\nRequired.",
                    "properties": {
                      "searchLocationType": {
                        "description": "Choose how to define the tweet search area: by location name, by a Twitter place, or by latitude and longitude coordinates.\n\nRequired.\n\nValid values: `name`, `place`, `parameters`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "name",
                              "place",
                              "parameters"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "searchLocation": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Enter the location text used to look up the search area when searching by place.\n\nRelevant when `searchLocationType` equals `place`.\n\nRequired."
                      },
                      "distanceUnit": {
                        "description": "Set the distance unit used for location-name and coordinate-based searches.\n\nRelevant when `searchLocationType` equals `name`; when `searchLocationType` equals `parameters`.\n\nRequired.\n\nValid values: `km`, `mi`.",
                        "anyOf": [
                          {
                            "type": "string",
                            "enum": [
                              "km",
                              "mi"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "location": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nSelect the Twitter-registered place to use as the search location.\n\nRelevant when `searchLocation` is non-empty.\n\nRequired."
                      },
                      "geocodeOptions": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Configure geocoding details used when searching by location name.\n\nRelevant when `searchLocationType` equals `name`.\n\nRequired.",
                        "properties": {
                          "searchLocation": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Enter the location name or search text to geocode. Set this when you want results based on a searched location rather than a fixed point.\n\nRequired."
                          },
                          "location": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the location whose centre defines the search area. Set this with a searched location to return results within the specified radius of that centre.\n\nRelevant when `searchLocation` is non-empty.\n\nRequired."
                          },
                          "radius": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Set the search radius around the chosen location centre.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      },
                      "positionParametersOptions": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Configure geolocation parameters used when searching by latitude and longitude coordinates.\n\nRelevant when `searchLocationType` equals `parameters`.\n\nRequired.",
                        "properties": {
                          "latitude": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Set the latitude coordinate used for the position lookup.\n\nRequired."
                          },
                          "longitude": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Set the longitude coordinate used for the position lookup.\n\nRequired."
                          },
                          "radius": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Set the search radius around the position.\n\nRequired."
                          }
                        },
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "addFilters": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable additional search filters for the tweet search.\n\nRequired."
                  },
                  "includeRetweets": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include retweets in the search results.\n\nRelevant when `addFilters` equals `true`.\n\nRequired."
                  },
                  "searchAllFields": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Search for the term across any tweet field instead of only the primary search field.\n\nRelevant when `addFilters` equals `true`.\n\nRequired."
                  },
                  "language": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nRestrict results to tweets written in the selected language.\n\nRelevant when `addFilters` equals `true`.\n\nRequired."
                  },
                  "untilDate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nReturn tweets created up to and including the end of the given UTC date.\n\nRelevant when `addFilters` equals `true`.",
                    "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "liveTweets"
                  },
                  "twitterFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which Twitter tweet fields to include in the report.\n\nRequired.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "searchPhrases": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "List of phrases used to filter live stream of tweets. Results will include any of the phrases. A phrase may be one or more terms separated by spaces, and a phrase will match if all of the terms in the phrase are present in the Tweet, regardless of order and ignoring case. Phrases with quotes or commas are not supported.\n\nList one or more phrases to match in live tweets. Tweets must contain the search phrases to be captured.",
                    "items": {
                      "type": "string"
                    }
                  },
                  "capturePeriod": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set how long the stream should run while it captures matching tweets.\n\nRequired.",
                    "properties": {
                      "infinite": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Set capture duration to infinite time.\n\nRequired."
                      },
                      "duration": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Set the numeric capture duration. Use this together with timeUnit when infinite is disabled.\n\nRelevant when `infinite` equals `false`.\n\nRequired."
                      },
                      "timeUnit": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected.\n\nChoose the time unit for the duration value. Use this together with duration when infinite is disabled.\n\nRelevant when `infinite` equals `false`.\n\nRequired."
                      }
                    },
                    "additionalProperties": false
                  },
                  "userFilters": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set user-based filters to limit which tweet authors are included in the stream.",
                    "properties": {
                      "userSource": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Choose where the user list comes from for the search. Defaults to the manual list; set it to the upstream block to take users from a previous step.\n\nRequired.\n\n`true` = Use users from upstream block; `false` = Use users from a manual list."
                      },
                      "users": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Enter the users to search for as a list. Use this when the source is set to the manual list.\n\nRelevant when `userSource` equals `false`.",
                        "items": {
                          "type": "string"
                        }
                      },
                      "userField": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Select the user field to read from the upstream block. Use this when the source is set to the upstream block.\n\nRelevant when `userSource` equals `true`.\n\nField name from input 0."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "userTimelines"
                  },
                  "userListSource": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Choose whether the user list comes from a manual list or from an upstream block.\n\nRequired.\n\n`true` = Use users from upstream block; `false` = Use users from a manual list."
                  },
                  "userKeys": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Provide the usernames or user IDs to search for. Set this when using a manual user list.\n\nRelevant when `userListSource` equals `false`.\n\nRequired.",
                    "items": {
                      "type": "string"
                    }
                  },
                  "userKeyField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that contains the usernames or user IDs to search for. Use this when sourcing the user list from an upstream block.\n\nRelevant when `userListSource` equals `true`.\n\nRequired.\n\nField name from input 0."
                  },
                  "sinceTweetIdField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the input field that contains the tweet ID to start from. Results are limited to tweets newer than that ID.\n\nRelevant when `userListSource` equals `true`.\n\nField name from input 0."
                  },
                  "fetchSinceDate": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable this to limit results to tweets created since a date.\n\nRequired."
                  },
                  "sinceDate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ISO date, no timezone, date only (no time), e.g. `2025-10-15`.\n\nSet the inclusive UTC date boundary for returned tweets. Tweets created on or after this date are included.\n\nRelevant when `fetchSinceDate` equals `true`.",
                    "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                  },
                  "includeReplies": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include reply tweets in the results."
                  },
                  "includeRetweets": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Include retweets in the results."
                  },
                  "statusFieldsOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure which tweet status fields to return.",
                    "properties": {
                      "twitterFields": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Select which Twitter fields to include in the output. Choose the set of tweet fields you want returned.\n\nRequired.",
                        "items": {
                          "type": "string",
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                        }
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "retweets"
                  },
                  "tweetIdField": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Select the upstream field whose tweet IDs should be used to look up retweets.\n\nRequired.\n\nField name from input 0."
                  },
                  "statusFieldsOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Configure which tweet status fields to include in the retweets output.",
                    "properties": {
                      "twitterFields": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Select which Twitter fields to include in the output. Choose the set of tweet fields you want returned.\n\nRequired.",
                        "items": {
                          "type": "string",
                          "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                        }
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "userInformation"
                  },
                  "twitterFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Select which Twitter user fields to return in the report. Use this to control the columns included in the output.\n\nRequired.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "userSelectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Set the criteria used to choose which Twitter users are included in the report.",
                    "properties": {
                      "userSource": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Choose where the user list comes from for the search. Defaults to the manual list; set it to the upstream block to take users from a previous step.\n\nRequired.\n\n`true` = Use users from upstream block; `false` = Use users from a manual list."
                      },
                      "users": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Enter the users to search for as a list. Use this when the source is set to the manual list.\n\nRelevant when `userSource` equals `false`.",
                        "items": {
                          "type": "string"
                        }
                      },
                      "userField": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Select the user field to read from the upstream block. Use this when the source is set to the upstream block.\n\nRelevant when `userSource` equals `true`.\n\nField name from input 0."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "friendsAndFollowers"
                  },
                  "downloadType": {
                    "description": "Select whether to download friends or followers. Defaults to Friends.\n\nRequired.\n\nValid values: `friends`, `followers`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "friends",
                          "followers"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "twitterFields": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Choose which Twitter user information fields to retrieve when user information is included.\n\nRelevant when `includeUserInformation` equals `true`.\n\nRequired.",
                    "items": {
                      "type": "string",
                      "description": "**Restricted choice**, look up valid values via list_block_option_choices on this block (option path matches this field). Do not guess; values not in the looked-up list are rejected."
                    }
                  },
                  "maxCountPerAccount": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Limit the number of results retrieved per account; defaults to 1000. There is no value that means \"all\": null means use the default, so it still caps at 1000. To retrieve everything, send a deliberately large number, for example 1000000.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  },
                  "includeUserInformation": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Enable retrieval of user information with the friends or followers list. Defaults to true and increases execution time."
                  },
                  "userSelectionOptions": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Specify which users to process for this report.",
                    "properties": {
                      "userSource": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Choose where the user list comes from for the search. Defaults to the manual list; set it to the upstream block to take users from a previous step.\n\nRequired.\n\n`true` = Use users from upstream block; `false` = Use users from a manual list."
                      },
                      "users": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "Enter the users to search for as a list. Use this when the source is set to the manual list.\n\nRelevant when `userSource` equals `false`.",
                        "items": {
                          "type": "string"
                        }
                      },
                      "userField": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Select the user field to read from the upstream block. Use this when the source is set to the upstream block.\n\nRelevant when `userSource` equals `true`.\n\nField name from input 0."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_twitter",
        "description": "Options for a `twitter` block."
      },
      "BlockOptions_validateData": {
        "type": "object",
        "properties": {
          "emailAction": {
            "description": "Choose when to send an email about this validation run: never, only on error, on warning or error, or always.\n\nRequired.\n\nValid values: `never`, `onError`, `onWarningOrError`, `always`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "never",
                  "onError",
                  "onWarningOrError",
                  "always"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "emailFrom": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the sender email address for the report message.\n\nRelevant when `emailAction` does not equal `never`."
          },
          "emailTo": {
            "type": [
              "string",
              "null"
            ],
            "description": "Enter the primary recipient email addresses, separated by commas.\n\nRelevant when `emailAction` does not equal `never`."
          },
          "emailCc": {
            "type": [
              "string",
              "null"
            ],
            "description": "Enter the CC recipient email addresses, separated by commas.\n\nRelevant when `emailAction` does not equal `never`."
          },
          "emailBcc": {
            "type": [
              "string",
              "null"
            ],
            "description": "Enter the BCC recipient email addresses, separated by commas.\n\nRelevant when `emailAction` does not equal `never`."
          },
          "emailSubject": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the email subject line.\n\nRelevant when `emailAction` does not equal `never`."
          },
          "emailMessage": {
            "type": [
              "string",
              "null"
            ],
            "description": "Add an optional message body to include before the validation summary.\n\nRelevant when `emailAction` does not equal `never`."
          },
          "schemaValidateDataOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure schema validation settings for the data validation step.",
            "properties": {
              "resetToInput": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "(This setting cannot be set through the API - a write here is ignored.)\n\nReset the expected schema to match the fields and types currently present in the input data.\n\nRequired."
              },
              "expectedFields": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Define the fields that should be present in the input and the data type expected for each one.",
                "items": {
                  "type": "object",
                  "properties": {
                    "field": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Select the input field to match by name. Use the field name that this mapping should look up in the incoming data.\n\nRequired.\n\nField name from input 0."
                    },
                    "dataType": {
                      "description": "Choose the data type to output for the mapped field.\n\nRequired.\n\nValid values: `integer`, `decimal`, `text`, `date`.",
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "integer",
                            "decimal",
                            "text",
                            "date"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "additionalProperties": false
                }
              },
              "unexpectedFields": {
                "description": "Choose how to handle fields that appear in the input data but are not listed in the expected schema.\n\nRelevant when `expectedFields` is non-empty.\n\nRequired.\n\nValid values: `error`, `halt`, `warning`, `none`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "error",
                      "halt",
                      "warning",
                      "none"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "missingFields": {
                "description": "Choose how to handle fields that are listed in the expected schema but are missing from the input data.\n\nRelevant when `expectedFields` is non-empty.\n\nRequired.\n\nValid values: `error`, `halt`, `warning`, `none`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "error",
                      "halt",
                      "warning",
                      "none"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "mismatchingFields": {
                "description": "Choose how to handle expected fields whose data type does not match the type found in the input data.\n\nRelevant when `expectedFields` is non-empty.\n\nRequired.\n\nValid values: `error`, `halt`, `warning`, `none`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "error",
                      "halt",
                      "warning",
                      "none"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          "valueValidateDataOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure value validation settings for the data validation step.",
            "properties": {
              "recordFilterOptions": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Configure which records are evaluated by the validation rules. Set the nested filter options to define the record set to check.",
                "properties": {
                  "ifRuleMatches": {
                    "description": "Choose whether matching rules are accepted or rejected. Set this to Accept or Reject only when you are using the Rules list.\n\nRelevant when `rules` is non-empty.\n\nRequired.\n\nValid values: `accept`, `reject`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "accept",
                          "reject"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "matchRulesBy": {
                    "description": "Choose whether all rules must match or any one rule may match.\n\nRelevant when `rules` has multiple entries.\n\nRequired.\n\nValid values: `all`, `any`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "all",
                          "any"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "rules": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Add the filter rules to evaluate in order. Each item defines one rule used by the matching mode and accept or reject action.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "filterType": {
                          "description": "Choose whether the rule filters by record number or by a field.\n\nRequired.\n\nValid values: `recordNumber`, `field`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "recordNumber",
                                "field"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "field": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Select the field to evaluate when the filter type is set to Field.\n\nRelevant when `filterType` equals `field`.\n\nRequired.\n\nField name from input 0."
                        },
                        "filter": {
                          "description": "Choose the comparison or matching rule to apply to the selected record number or field value.\n\nRequired.",
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "hasAnyValue"
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "hasNoValue"
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "equals"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the value to compare against. Use this as the match text for the equals filter."
                                },
                                "accentSensitive": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Enable accent-sensitive matching so accented and unaccented characters are treated as different.\n\nRequired."
                                },
                                "caseSensitive": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Enable case-sensitive matching so uppercase and lowercase letters are treated as different.\n\nRelevant when `accentSensitive` equals `true`.\n\nRequired."
                                },
                                "searchMode": {
                                  "description": "Choose how to interpret the value: exact text, wildcard patterns, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "enum": [
                                        "normal",
                                        "wildcards",
                                        "regularExpression"
                                      ]
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "notEqual"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the value to compare against. The filter matches items that are not equal to this text."
                                },
                                "accentSensitive": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Enable accent-sensitive comparison so accented and unaccented characters are treated as different.\n\nRequired."
                                },
                                "caseSensitive": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Enable case-sensitive comparison so uppercase and lowercase characters are treated as different.\n\nRelevant when `accentSensitive` equals `true`.\n\nRequired."
                                },
                                "searchMode": {
                                  "description": "Choose how to interpret the value: as plain text, wildcard text using * and ?, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "enum": [
                                        "normal",
                                        "wildcards",
                                        "regularExpression"
                                      ]
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "greaterThan"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the comparison value to test against. Use the text you want this filter to match as greater than.\n\nRequired."
                                },
                                "caseSensitive": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Enable case-sensitive matching when comparing the value. Leave unset to use the default case-insensitive behavior.\n\nRequired."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "greaterThanOrEqual"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the comparison value to test against. Provide the threshold or exact text to match, depending on the data type.\n\nRequired."
                                },
                                "caseSensitive": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Enable case-sensitive matching when comparing text values.\n\nRequired."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "lessThan"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the value to compare against with the less-than filter.\n\nRequired."
                                },
                                "caseSensitive": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Enable case-sensitive matching when the value is text; leave unset to use the default comparison behavior.\n\nRequired."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "lessThanOrEqual"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the comparison value to test against with the less-than-or-equal condition.\n\nRequired."
                                },
                                "caseSensitive": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Set whether text comparisons should treat uppercase and lowercase letters as different.\n\nRequired."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "contains"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the text or pattern to search for with the contains filter.\n\nRequired."
                                },
                                "caseSensitive": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Set whether the contains match should respect letter case.\n\nRequired."
                                },
                                "searchMode": {
                                  "description": "Choose how to interpret the value: as plain text, wildcards, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "enum": [
                                        "normal",
                                        "wildcards",
                                        "regularExpression"
                                      ]
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "doesNotContain"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the value to test against. The filter keeps items that do not contain this text.\n\nRequired."
                                },
                                "caseSensitive": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Match uppercase and lowercase characters exactly when checking whether the value contains the text.\n\nRequired."
                                },
                                "searchMode": {
                                  "description": "Choose how to interpret the search text: plain text, wildcards, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "enum": [
                                        "normal",
                                        "wildcards",
                                        "regularExpression"
                                      ]
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "startsWith"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Set the text to match at the start of each input value.\n\nRequired."
                                },
                                "caseSensitive": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Enable case-sensitive matching when checking whether values start with the given text.\n\nRequired."
                                },
                                "searchMode": {
                                  "description": "Choose how to interpret the match text: normal, wildcard patterns, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "enum": [
                                        "normal",
                                        "wildcards",
                                        "regularExpression"
                                      ]
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "endsWith"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the text to match at the end of the field value.\n\nRequired."
                                },
                                "caseSensitive": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Match text using exact letter case when enabled.\n\nRequired."
                                },
                                "searchMode": {
                                  "description": "Choose how to interpret the match text: normal text, wildcards using * and ?, or a regular expression.\n\nRequired.\n\nValid values: `normal`, `wildcards`, `regularExpression`.",
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "enum": [
                                        "normal",
                                        "wildcards",
                                        "regularExpression"
                                      ]
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "fuzzyMatchSoundex"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the text to fuzzy-match using Soundex."
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "@type": {
                                  "type": "string",
                                  "const": "fuzzyMatchLevenshtein"
                                },
                                "value": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Enter the text to match against. The filter keeps items whose text matches this value with Levenshtein fuzzy matching."
                                },
                                "caseSensitive": {
                                  "type": [
                                    "boolean",
                                    "null"
                                  ],
                                  "description": "Enable case-sensitive matching for the fuzzy comparison.\n\nRequired."
                                },
                                "closeness": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Set how many edits are allowed between the input text and a match. Higher values make the fuzzy match broader.\n\nRequired.",
                                  "maximum": 2147483647,
                                  "minimum": -2147483648
                                }
                              },
                              "additionalProperties": false,
                              "required": [
                                "@type"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false
                    }
                  }
                },
                "additionalProperties": false
              },
              "anyRejectedAction": {
                "description": "Choose how to respond when at least one record is rejected by the validation rules.\n\nRelevant when `recordFilterOptions/rules` is non-empty.\n\nRequired.\n\nValid values: `error`, `halt`, `warning`, `none`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "error",
                      "halt",
                      "warning",
                      "none"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "allRejectedAction": {
                "description": "Choose how to respond when every record is rejected by the validation rules.\n\nRelevant when `recordFilterOptions/rules` is non-empty.\n\nRequired.\n\nValid values: `error`, `halt`, `warning`, `none`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "error",
                      "halt",
                      "warning",
                      "none"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "anyAcceptedAction": {
                "description": "Choose how to respond when at least one record is accepted by the validation rules.\n\nRelevant when `recordFilterOptions/rules` is non-empty.\n\nRequired.\n\nValid values: `error`, `halt`, `warning`, `none`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "error",
                      "halt",
                      "warning",
                      "none"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "allAcceptedAction": {
                "description": "Choose how to respond when every record is accepted by the validation rules.\n\nRelevant when `recordFilterOptions/rules` is non-empty.\n\nRequired.\n\nValid values: `error`, `halt`, `warning`, `none`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "error",
                      "halt",
                      "warning",
                      "none"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          "sizeValidateDataOptions": {
            "type": [
              "object",
              "null"
            ],
            "description": "Configure size validation settings for the data validation step.",
            "properties": {
              "minRecords": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the minimum acceptable record count, inclusive. The test fails when the actual record count is below this value.",
                "minimum": 0
              },
              "minRecordsAction": {
                "description": "Choose what to do when the minimum record count is not met.\n\nRequired.\n\nValid values: `error`, `halt`, `warning`, `none`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "error",
                      "halt",
                      "warning",
                      "none"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "maxRecords": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Set the maximum acceptable record count, inclusive. The test fails when the actual record count is above this value.",
                "minimum": 0
              },
              "maxRecordsAction": {
                "description": "Choose what to do when the maximum record count is exceeded.\n\nRequired.\n\nValid values: `error`, `halt`, `warning`, `none`.",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "error",
                      "halt",
                      "warning",
                      "none"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": false
          },
          "streamBehaviour": {
            "description": "Choose whether data streams immediately or only after all data has been checked.\n\nRequired.\n\nValid values: `stream`, `blocking`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "stream",
                  "blocking"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_validateData",
        "description": "Options for a `validateData` block."
      },
      "BlockOptions_valueSequence": {
        "type": "object",
        "properties": {
          "sequenceType": {
            "description": "Choose the type of sequence to generate. Select the number or date sequence options that match the values you want to produce.\n\nRequired.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "number"
                  },
                  "start": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the starting number for the sequence.\n\nRequired."
                  },
                  "end": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the ending number for the sequence.\n\nRequired."
                  },
                  "increment": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set the step size between generated numbers.\n\nRequired."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "string",
                    "const": "date"
                  },
                  "startDate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ISO date-time, no timezone, e.g. `2025-10-15T13:45:00`.\n\nSet the starting date and time for the sequence.\n\nRequired.",
                    "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(:[0-9]{2}(\\.[0-9]{3})?)?$"
                  },
                  "endDate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ISO date-time, no timezone, e.g. `2025-10-15T13:45:00`.\n\nSet the ending date and time for the sequence.\n\nRequired.",
                    "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(:[0-9]{2}(\\.[0-9]{3})?)?$"
                  },
                  "period": {
                    "description": "Choose the calendar unit used between generated dates, such as seconds, minutes, hours, days, weeks, or months.\n\nRequired.\n\nValid values: `second`, `minute`, `hour`, `day`, `week`, `month`, `year`.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "second",
                          "minute",
                          "hour",
                          "day",
                          "week",
                          "month",
                          "year"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "increment": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Set how many periods to add on each step.\n\nRequired.",
                    "maximum": 2147483647,
                    "minimum": -2147483648
                  }
                },
                "additionalProperties": false,
                "required": [
                  "@type"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "fieldName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set the name of the field that will receive the generated sequence values.\n\nRequired."
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_valueSequence",
        "description": "Options for a `valueSequence` block."
      },
      "BlockOptions_viewableStorage": {
        "type": "object",
        "properties": {
          "storageName": {
            "type": [
              "string",
              "null"
            ],
            "description": "**Choice**, look up suggested values via list_block_option_choices on this block (option path matches this field). Custom values are also accepted.\n\nSelect the global storage table to store, query, and visualise data. Pick an existing table or enter a new name to create one.\n\nRequired."
          },
          "snapshotBehaviour": {
            "description": "Choose how workflow runs interact with the stored data: keep the existing snapshot, replace it with incoming data, or append new rows.\n\nRequired.\n\nValid values: `fillOnce`, `refillAlways`, `appendRows`.",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "fillOnce",
                  "refillAlways",
                  "appendRows"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "title": "BlockOptions_viewableStorage",
        "description": "Options for a `viewableStorage` block."
      },
      "ConnectorInfo": {
        "type": "object",
        "properties": {
          "name": {
            "anyOf": [
              {
                "type": "string",
                "description": "Connector name. Use this exact string as `targetInput` / `sourceOutput`."
              },
              {
                "type": "null"
              }
            ]
          },
          "title": {
            "anyOf": [
              {
                "type": "string",
                "description": "Human label/title."
              },
              {
                "type": "null"
              }
            ]
          },
          "description": {
            "anyOf": [
              {
                "type": "string",
                "description": "Human description of what this connector accepts/emits."
              },
              {
                "type": "null"
              }
            ]
          },
          "optional": {
            "anyOf": [
              {
                "type": "boolean",
                "description": "True if the block can run without this input wired (or output left unconsumed)."
              },
              {
                "type": "null"
              }
            ]
          },
          "isVarArg": {
            "anyOf": [
              {
                "type": "boolean",
                "description": "True if this is a variadic connector. On `connect`, passing this name (or omitting `targetInput`) appends a new slot; realized slots are named `<name>`, `<name>2`, `<name>3`... (see `describe_block` for the live slot list)."
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "required": [
          "name",
          "title",
          "description",
          "optional",
          "isVarArg"
        ]
      },
      "ErrorEntry": {
        "type": "object",
        "properties": {
          "blockName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "source": {
            "anyOf": [
              {
                "type": "string",
                "description": "Where the error came from: `configuration` (block setup) or `execution` (running the block)."
              },
              {
                "type": "null"
              }
            ]
          },
          "summary": {
            "anyOf": [
              {
                "type": "string",
                "description": "Short title - present on execution messages (from MessageBean.summary). Absent for plain configuration errors."
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "optionPath": {
            "anyOf": [
              {
                "type": "string",
                "description": "Option field path (e.g. `mappings/2/formula`) when this message attaches to a specific option, else null."
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "required": [
          "blockName",
          "source",
          "summary",
          "message",
          "optionPath"
        ]
      },
      "ErrorResponse": {
        "title": "ErrorResponse",
        "type": "object",
        "description": "Returned with a 4xx/5xx status when a call fails. A tool-logic error (e.g. \"no such block\") carries the tool's own message; a bad request or unexpected failure carries a short explanation. `errorType` says which KIND of failure it was, so a client can branch on it instead of string-matching the prose.",
        "properties": {
          "error": {
            "type": "string",
            "description": "The error message."
          },
          "errorType": {
            "type": "string",
            "enum": [
              "schema",
              "logic",
              "threw",
              "excluded",
              "project_locked"
            ],
            "description": "The kind of failure. `schema` - the arguments did not match this operation's schema; fix them and retry. `logic` - the tool ran and rejected the request (e.g. no such block); the message says what to change. `threw` - an unexpected internal failure, not something the caller can fix. `excluded` - the tool exists but is not offered on this API. `project_locked` - the project is locked or read-only, so a call that would have changed it was refused before it ran and NOTHING was altered; no change of arguments will help, so stop retrying until a person unlocks it."
          }
        },
        "required": [
          "error"
        ]
      },
      "FileEntry": {
        "type": "object",
        "properties": {
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "isFolder": {
            "anyOf": [
              {
                "type": "boolean",
                "description": "True for a folder; false for a file."
              },
              {
                "type": "null"
              }
            ]
          },
          "path": {
            "anyOf": [
              {
                "type": "string",
                "description": "Ready-to-use absolute path for this file - copy it verbatim into a fileSource's `localPath`. Present on files only; for folders use `pathComponents` to navigate."
              },
              {
                "type": "null"
              }
            ]
          },
          "pathComponents": {
            "anyOf": [
              {
                "type": "array",
                "description": "Path components of this entry; pass back as `list_files.pathComponents` to navigate into it.",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "size": {
            "anyOf": [
              {
                "type": "integer",
                "description": "File size in bytes (omitted for folders)."
              },
              {
                "type": "null"
              }
            ]
          },
          "lastModified": {
            "anyOf": [
              {
                "type": "string",
                "description": "Last-modified time, ISO-8601 (omitted when unknown)."
              },
              {
                "type": "null"
              }
            ]
          },
          "mimeType": {
            "anyOf": [
              {
                "type": "string",
                "description": "MIME type when known."
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "required": [
          "name",
          "isFolder",
          "path",
          "pathComponents",
          "size",
          "lastModified",
          "mimeType"
        ]
      },
      "Result_BlockMutation": {
        "type": "object",
        "properties": {
          "result": {
            "type": [
              "string",
              "null"
            ],
            "description": "Short human-facing summary of what changed."
          },
          "block": {
            "type": [
              "object",
              "null"
            ],
            "description": "Full describe of the affected block after the change.",
            "properties": {
              "name": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "type": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "This block's type, always the bare base type - the id `describe_block_type` takes. Never preset-qualified: what it was created from is `createdFromPreset`, which never names a tool. The tool that configures it is given in full as `configureTool` by `describe_block` and `describe_block_type` - do not build a tool name out of this id."
              },
              "configureTool": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The tool that creates and reconfigures blocks of this type - call it by this exact name. It is not a transformation of `type` for you to perform: the type id is camelCase and the tool name is snake_case (`fileSource` gives `configure_file_source`)."
              },
              "createdFromPreset": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The preset this block was created from, as the `preset` argument that would recreate it (e.g. `customPythonScript`). Provenance - it answers why the block has the options it has, and it is NOT part of the tool name. Absent when the block came from no preset, and also when it no longer matches that preset: a report reshaped out of Insight Explorer shape is a plain report, and its Insight Explorer options are no longer live."
              },
              "x": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "y": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "errors": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Errors on this block - configuration (block setup invalid) or execution (running the block failed). Empty/absent when there are no errors.",
                "items": {
                  "$ref": "#/components/schemas/ErrorEntry"
                }
              },
              "warnings": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Warnings on this block - configuration concerns or non-fatal execution issues. Empty/absent when there are no warnings.",
                "items": {
                  "$ref": "#/components/schemas/ErrorEntry"
                }
              },
              "rawPreview": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "fileSource blocks only: the first lines of the raw file before parsing. Compare against `schemaPerOutput` to spot misaligned headers - if the parsed sample's first row looks like column names, or columns are auto-named, the raw lines show where the real header is so you can fix `firstHeaderRow`/`firstDataRow`.",
                "properties": {
                  "lines": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "First lines of the source file as raw text, before any delimiter parsing. lines[0] is file line 1, lines[1] is line 2, etc.",
                    "items": {
                      "type": "string"
                    }
                  },
                  "truncated": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "True if the file continues beyond this sample (line- or byte-capped)."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "lines",
                  "truncated"
                ]
              },
              "outputMeta": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "outputs": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "items": {
                      "type": "object",
                      "properties": {
                        "recordCount": {
                          "type": [
                            "integer",
                            "null"
                          ]
                        },
                        "fieldCount": {
                          "type": [
                            "integer",
                            "null"
                          ]
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "recordCount",
                        "fieldCount"
                      ]
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "outputs"
                ]
              },
              "inputs": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "object",
                  "properties": {
                    "connectorName": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Connector name addressing this slot. Pass this exact string as `targetInput` on connect/disconnect."
                    },
                    "slot": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "0-based slot index, or null when this entry is the trailing variadic placeholder."
                    },
                    "isVarArg": {
                      "type": [
                        "boolean",
                        "null"
                      ],
                      "description": "True if this slot belongs to a variadic connector (more slots can be appended)."
                    },
                    "optional": {
                      "type": [
                        "boolean",
                        "null"
                      ],
                      "description": "True if the block can run without this slot wired."
                    },
                    "description": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Human description of what this input accepts."
                    },
                    "sourceBlock": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Block whose output is wired into this slot, or null if unwired."
                    },
                    "sourceOutput": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Output connector name on the source block. Null implies the source's default output."
                    },
                    "recordCount": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Rows arriving on this slot, on execute_blocks results. Compare against the block's own output `recordCount`: an unexplained change is a defect to fix or report, not a detail - an inner join silently dropping every unmatched row looks exactly like a clean run. Absent when the source has not been executed, so absence is not zero."
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "connectorName",
                    "slot",
                    "isVarArg",
                    "optional",
                    "description",
                    "sourceBlock",
                    "sourceOutput",
                    "recordCount"
                  ]
                }
              },
              "nextVarArgInput": {
                "description": "Present only on variadic-input blocks. Describes the next variadic slot that will be allocated on `connect` (e.g. `input3` when slots 0/1 are already wired as `input`/`input2`). Pass this name as `targetInput` on connect to append a new slot, or omit `targetInput` entirely - both append. To overwrite an existing variadic slot, pass its realized name from `inputs[].connectorName`.",
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/ConnectorInfo"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "outputs": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "$ref": "#/components/schemas/ConnectorInfo"
                }
              },
              "schemaPerOutput": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "object",
                  "properties": {
                    "outputName": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "dataConfidence": {
                      "description": "How much of this output's data is on hand, which governs what you may conclude from it. `execute`: full execution data - schema and row count accurate. `sample`: the execution data has since been degraded to a retained sample - schema is correct and the row count is the true total captured at execution. `preview`: preview-quality - the schema may be partial and the row count is omitted because it cannot be trusted. `none`: no readable data on this output. Execute the block if you have not; if you just did, then the block produced none - the execute is not the missing step. Counts and CONTENTS are not equally trustworthy: whatever the level, any rows you can see here are a truncation (see `sample`), so never conclude anything about the data as a whole from them.",
                      "anyOf": [
                        {
                          "type": "string",
                          "description": "Enum values:\n - \"execute\"\n - \"sample\"\n - \"preview\"\n - \"none\"\n",
                          "enum": [
                            "execute",
                            "sample",
                            "preview",
                            "none"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "recordCount": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "fields": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "type": {
                            "type": [
                              "string",
                              "null"
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "name",
                          "type"
                        ]
                      }
                    },
                    "sample": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "A few rows, for seeing the SHAPE of the data - field names, value formats, obvious mis-parses. Always a truncation, at every `dataConfidence` level, and not a random one: do not generalise from it to the output as a whole. In particular, a column that is empty in these rows is not evidence that it is empty in the data - that inference has deleted a populated column from a 316,834-row table.",
                      "items": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "additionalProperties": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "number"
                            },
                            {
                              "type": "string",
                              "description": "A UTC date in one of these ISO 8601 formats: 1997-07-16, 1997-07-16T19:20:30Z, 1997-07-16T19:20:30.452Z"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "outputName",
                    "dataConfidence",
                    "recordCount",
                    "fields",
                    "sample"
                  ]
                }
              },
              "options": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Reverse-mapped current options object for this block (the block-type-specific options shape, same as this type's `configure_<type>` tool takes). May be null if the block type isn't yet covered by the AI surface (see `optionsPartial` for hints)."
              },
              "optionsPartial": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Field names where the live Omniscope option doesn't fully round-trip into the AI surface. The block has these settings but they're not visible/editable here. Use `configure_<type>` carefully on blocks with partial fields - your replacement will drop them.",
                "items": {
                  "type": "string"
                }
              },
              "optionNotes": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "On `describe_block` only: option guidance for this block's TYPE - what its `options` fields mean, which the `configure_<type>` schema does not carry. Sent at most once per type per conversation, so absent means either that you already have it earlier in this conversation or that the type has no authored guidance - never that you are missing something. Read it before composing `options`, which is a full replace."
              }
            },
            "additionalProperties": false,
            "required": [
              "name",
              "type",
              "configureTool",
              "createdFromPreset",
              "x",
              "y",
              "errors",
              "warnings",
              "rawPreview",
              "outputMeta",
              "inputs",
              "nextVarArgInput",
              "outputs",
              "schemaPerOutput",
              "options",
              "optionsPartial",
              "optionNotes"
            ]
          },
          "optionsStored": {
            "type": [
              "string",
              "null"
            ],
            "description": "What the block's options are now, and how they got that way. \"as sent\" - you sent `options` and the stored state is what you sent, including a field you sent as null that came back as its default, which is the null doing its job; `block.options` is then omitted, because you already have it. Starts \"unchanged\" - you sent no `options`, so nothing was replaced and the block keeps what it had; `block.options` is that PRESERVED state. Starts \"defaults\" - you sent no `options` and the block was just created, so `block.options` is the type's starting state. ABSENT - you sent `options` and something differs: `block.options` carries the true landed state in full, and a note names the paths that differ, so read those."
          },
          "verify": {
            "type": [
              "string",
              "null"
            ],
            "description": "When the auto-execute-and-verify mode is enabled on the integration: the result of automatically executing the affected block right after this change. `block` above carries only a PREVIEW (not conclusive); these fields carry the CONCLUSIVE execute outcome."
          },
          "problems": {
            "type": [
              "array",
              "null"
            ],
            "description": "Errors the block itself reported when the auto-verify execute ran it. If present, fix and re-check before proceeding - do not report success or hand the fix back to the user. Absent when the verify execute found none.",
            "items": {
              "type": "string"
            }
          },
          "notes": {
            "type": [
              "array",
              "null"
            ],
            "description": "Advisories about THIS call: things the server did not do, did differently from what you asked, or wants you to know before your next call. Read them - a note is the only place a deliberately ignored part of your payload is reported, and the call otherwise succeeded.",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false,
        "required": [
          "result",
          "block",
          "optionsStored",
          "verify",
          "problems",
          "notes"
        ],
        "title": "Result_BlockMutation"
      },
      "Result_Execution": {
        "type": "object",
        "properties": {
          "requested": {
            "type": "array",
            "description": "The blocks you named; requesting a block does not guarantee it ran - see `note`.",
            "items": {
              "type": "string"
            }
          },
          "note": {
            "type": [
              "string",
              "null"
            ],
            "description": "How to read this result - always present. States that upstream may have been reused rather than recomputed, and names any blocks summarised instead of detailed."
          },
          "outstanding": {
            "type": [
              "array",
              "null"
            ],
            "description": "Workflow-wide health digest: every block that CURRENTLY carries an error, warning or output problem, whether or not it ran in this call - e.g. \"Biographies Clean: 2 value-conversion warnings\". Because warnings are per-block and are not propagated downstream, this - not a clean `errors`/`warnings` - is what tells you whether the pipeline is healthy. Absent when the whole workflow is clean.",
            "items": {
              "type": "string"
            }
          },
          "errors": {
            "type": "array",
            "description": "Errors raised by the blocks that ran in THIS execution, ROLLED UP into one flat list (so you don't have to scan each block). When `blocks` is present, the same errors also appear on their block in `blocks[].errors` - this is a roll-up of those, not a separate set. Empty when nothing that ran errored - which is not the same as the pipeline being clean; see `outstanding`.",
            "items": {
              "$ref": "#/components/schemas/ErrorEntry"
            }
          },
          "warnings": {
            "type": "array",
            "description": "Warnings raised by the blocks that ran in THIS execution, rolled up (the same warnings also appear in `blocks[].warnings` when `blocks` is present). Empty when none - again, see `outstanding` for warnings still standing elsewhere in the workflow.",
            "items": {
              "$ref": "#/components/schemas/ErrorEntry"
            }
          },
          "blocks": {
            "type": [
              "array",
              "null"
            ],
            "description": "Each requested block's output - fields, row count (EXECUTE-quality, so trustworthy) and a small sample - so you can see the result without a separate get_block_output. Present for small runs; on a larger run `blockSummaries` carries the compact form instead.",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "type": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "This block's type, always the bare base type - the id `describe_block_type` takes. Never preset-qualified: what it was created from is `createdFromPreset`, which never names a tool. The tool that configures it is given in full as `configureTool` by `describe_block` and `describe_block_type` - do not build a tool name out of this id."
                },
                "configureTool": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The tool that creates and reconfigures blocks of this type - call it by this exact name. It is not a transformation of `type` for you to perform: the type id is camelCase and the tool name is snake_case (`fileSource` gives `configure_file_source`)."
                },
                "createdFromPreset": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The preset this block was created from, as the `preset` argument that would recreate it (e.g. `customPythonScript`). Provenance - it answers why the block has the options it has, and it is NOT part of the tool name. Absent when the block came from no preset, and also when it no longer matches that preset: a report reshaped out of Insight Explorer shape is a plain report, and its Insight Explorer options are no longer live."
                },
                "x": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "y": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "errors": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "description": "Errors on this block - configuration (block setup invalid) or execution (running the block failed). Empty/absent when there are no errors.",
                  "items": {
                    "$ref": "#/components/schemas/ErrorEntry"
                  }
                },
                "warnings": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "description": "Warnings on this block - configuration concerns or non-fatal execution issues. Empty/absent when there are no warnings.",
                  "items": {
                    "$ref": "#/components/schemas/ErrorEntry"
                  }
                },
                "rawPreview": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "description": "fileSource blocks only: the first lines of the raw file before parsing. Compare against `schemaPerOutput` to spot misaligned headers - if the parsed sample's first row looks like column names, or columns are auto-named, the raw lines show where the real header is so you can fix `firstHeaderRow`/`firstDataRow`.",
                  "properties": {
                    "lines": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "description": "First lines of the source file as raw text, before any delimiter parsing. lines[0] is file line 1, lines[1] is line 2, etc.",
                      "items": {
                        "type": "string"
                      }
                    },
                    "truncated": {
                      "type": [
                        "boolean",
                        "null"
                      ],
                      "description": "True if the file continues beyond this sample (line- or byte-capped)."
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "lines",
                    "truncated"
                  ]
                },
                "outputMeta": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "properties": {
                    "outputs": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "object",
                        "properties": {
                          "recordCount": {
                            "type": [
                              "integer",
                              "null"
                            ]
                          },
                          "fieldCount": {
                            "type": [
                              "integer",
                              "null"
                            ]
                          }
                        },
                        "additionalProperties": false,
                        "required": [
                          "recordCount",
                          "fieldCount"
                        ]
                      }
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "outputs"
                  ]
                },
                "inputs": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "items": {
                    "type": "object",
                    "properties": {
                      "connectorName": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Connector name addressing this slot. Pass this exact string as `targetInput` on connect/disconnect."
                      },
                      "slot": {
                        "type": [
                          "integer",
                          "null"
                        ],
                        "description": "0-based slot index, or null when this entry is the trailing variadic placeholder."
                      },
                      "isVarArg": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "True if this slot belongs to a variadic connector (more slots can be appended)."
                      },
                      "optional": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "True if the block can run without this slot wired."
                      },
                      "description": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Human description of what this input accepts."
                      },
                      "sourceBlock": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Block whose output is wired into this slot, or null if unwired."
                      },
                      "sourceOutput": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Output connector name on the source block. Null implies the source's default output."
                      },
                      "recordCount": {
                        "type": [
                          "integer",
                          "null"
                        ],
                        "description": "Rows arriving on this slot, on execute_blocks results. Compare against the block's own output `recordCount`: an unexplained change is a defect to fix or report, not a detail - an inner join silently dropping every unmatched row looks exactly like a clean run. Absent when the source has not been executed, so absence is not zero."
                      }
                    },
                    "additionalProperties": false,
                    "required": [
                      "connectorName",
                      "slot",
                      "isVarArg",
                      "optional",
                      "description",
                      "sourceBlock",
                      "sourceOutput",
                      "recordCount"
                    ]
                  }
                },
                "nextVarArgInput": {
                  "description": "Present only on variadic-input blocks. Describes the next variadic slot that will be allocated on `connect` (e.g. `input3` when slots 0/1 are already wired as `input`/`input2`). Pass this name as `targetInput` on connect to append a new slot, or omit `targetInput` entirely - both append. To overwrite an existing variadic slot, pass its realized name from `inputs[].connectorName`.",
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/ConnectorInfo"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "outputs": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "items": {
                    "$ref": "#/components/schemas/ConnectorInfo"
                  }
                },
                "schemaPerOutput": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "items": {
                    "type": "object",
                    "properties": {
                      "outputName": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "dataConfidence": {
                        "description": "How much of this output's data is on hand, which governs what you may conclude from it. `execute`: full execution data - schema and row count accurate. `sample`: the execution data has since been degraded to a retained sample - schema is correct and the row count is the true total captured at execution. `preview`: preview-quality - the schema may be partial and the row count is omitted because it cannot be trusted. `none`: no readable data on this output. Execute the block if you have not; if you just did, then the block produced none - the execute is not the missing step. Counts and CONTENTS are not equally trustworthy: whatever the level, any rows you can see here are a truncation (see `sample`), so never conclude anything about the data as a whole from them.",
                        "anyOf": [
                          {
                            "type": "string",
                            "description": "Enum values:\n - \"execute\"\n - \"sample\"\n - \"preview\"\n - \"none\"\n",
                            "enum": [
                              "execute",
                              "sample",
                              "preview",
                              "none"
                            ]
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "recordCount": {
                        "type": [
                          "integer",
                          "null"
                        ]
                      },
                      "fields": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "items": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ]
                            },
                            "type": {
                              "type": [
                                "string",
                                "null"
                              ]
                            }
                          },
                          "additionalProperties": false,
                          "required": [
                            "name",
                            "type"
                          ]
                        }
                      },
                      "sample": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "description": "A few rows, for seeing the SHAPE of the data - field names, value formats, obvious mis-parses. Always a truncation, at every `dataConfidence` level, and not a random one: do not generalise from it to the output as a whole. In particular, a column that is empty in these rows is not evidence that it is empty in the data - that inference has deleted a populated column from a 316,834-row table.",
                        "items": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "additionalProperties": {
                            "anyOf": [
                              {
                                "type": "string"
                              },
                              {
                                "type": "number"
                              },
                              {
                                "type": "string",
                                "description": "A UTC date in one of these ISO 8601 formats: 1997-07-16, 1997-07-16T19:20:30Z, 1997-07-16T19:20:30.452Z"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        }
                      }
                    },
                    "additionalProperties": false,
                    "required": [
                      "outputName",
                      "dataConfidence",
                      "recordCount",
                      "fields",
                      "sample"
                    ]
                  }
                },
                "options": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "description": "Reverse-mapped current options object for this block (the block-type-specific options shape, same as this type's `configure_<type>` tool takes). May be null if the block type isn't yet covered by the AI surface (see `optionsPartial` for hints)."
                },
                "optionsPartial": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "description": "Field names where the live Omniscope option doesn't fully round-trip into the AI surface. The block has these settings but they're not visible/editable here. Use `configure_<type>` carefully on blocks with partial fields - your replacement will drop them.",
                  "items": {
                    "type": "string"
                  }
                },
                "optionNotes": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "On `describe_block` only: option guidance for this block's TYPE - what its `options` fields mean, which the `configure_<type>` schema does not carry. Sent at most once per type per conversation, so absent means either that you already have it earlier in this conversation or that the type has no authored guidance - never that you are missing something. Read it before composing `options`, which is a full replace."
                }
              },
              "additionalProperties": false,
              "required": [
                "name",
                "type",
                "configureTool",
                "createdFromPreset",
                "x",
                "y",
                "errors",
                "warnings",
                "rawPreview",
                "outputMeta",
                "inputs",
                "nextVarArgInput",
                "outputs",
                "schemaPerOutput",
                "options",
                "optionsPartial",
                "optionNotes"
              ]
            }
          },
          "blockSummaries": {
            "type": [
              "array",
              "null"
            ],
            "description": "Compact stand-in for `blocks` on a run too large to detail: one line per requested block with its row count, field count and error/warning counts. Call get_block_output on any block you need the schema or sample for.",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false,
        "required": [
          "requested",
          "note",
          "outstanding",
          "errors",
          "warnings",
          "blocks",
          "blockSummaries"
        ],
        "title": "Result_Execution"
      },
      "WorkflowDocument": {
        "title": "WorkflowDocument",
        "type": "object",
        "description": "A whole Omniscope workflow as JSON. Produced by export_workflow and consumed by set_workflow. connections may be the keyed map form (shown) or a flat list of edges.",
        "properties": {
          "blocks": {
            "type": "array",
            "description": "The blocks in the workflow.",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Unique name; connections refer to blocks by this name."
                },
                "type": {
                  "type": "string",
                  "description": "A block-type id from describe_block_type, e.g. fileSource or report:insightExplorer."
                },
                "position": {
                  "type": "array",
                  "items": {
                    "type": "number"
                  },
                  "description": "[x, y] on the canvas; omit to auto-layout."
                },
                "options": {
                  "$ref": "#/components/schemas/BlockOptions"
                }
              },
              "required": [
                "name",
                "type"
              ]
            }
          },
          "connections": {
            "type": "object",
            "description": "Wiring, keyed by the source (upstream) block name. Each value is an array of the downstream block names that source block's output feeds into, e.g. `{\"Sales\": [\"Report\", \"Summary\"]}`. (Richer input forms - naming a specific input, multi-output blocks, or a flat edge list - are described in the overview's \"Connections\" section.)",
            "additionalProperties": {
              "type": "array",
              "description": "The downstream block names this source block feeds into.",
              "items": {
                "type": "string",
                "description": "A target (downstream) block name."
              }
            }
          },
          "shapes": {
            "type": "array",
            "description": "Decorative canvas annotations (notes, labels, arrows, ...), when present. Purely cosmetic - they never affect execution.",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "description": "A decorative canvas shape. Which geometry fields apply depends on `type`: width/height for boxes (rectangle/note/ellipse/text/bubble), endX/endY for arrow/line, pointsAtX/pointsAtY for a bubble.",
              "properties": {
                "type": {
                  "type": "string",
                  "enum": [
                    "rectangle",
                    "note",
                    "ellipse",
                    "text",
                    "arrow",
                    "line",
                    "bubble"
                  ],
                  "description": "The kind of shape; determines which other fields apply."
                },
                "text": {
                  "type": "string",
                  "description": "Text shown on/in the shape. Null for none."
                },
                "colour": {
                  "type": "string",
                  "description": "Optional CSS colour (e.g. #fff8c4). Null for the default."
                },
                "group": {
                  "type": "string",
                  "description": "Optional block-group name this shape belongs to. Null if none."
                },
                "x": {
                  "type": "number",
                  "description": "Optional x (left) canvas coordinate of the anchor. Null to auto-place."
                },
                "y": {
                  "type": "number",
                  "description": "Optional y (top) canvas coordinate of the anchor. Null to auto-place."
                },
                "width": {
                  "type": "number",
                  "description": "Width, for rectangle/note/ellipse/text/bubble. Null for default."
                },
                "height": {
                  "type": "number",
                  "description": "Height, for rectangle/note/ellipse/text/bubble. Null for default."
                },
                "endX": {
                  "type": "number",
                  "description": "x of the tip/end, for arrow/line. Null for a default length."
                },
                "endY": {
                  "type": "number",
                  "description": "y of the tip/end, for arrow/line. Null for a default length."
                },
                "arrowhead": {
                  "type": "boolean",
                  "description": "Draw an arrowhead on a line's end (line only). Null/false = plain line."
                },
                "pointsAtX": {
                  "type": "number",
                  "description": "x the speech-bubble tail points at (bubble only). Null for default."
                },
                "pointsAtY": {
                  "type": "number",
                  "description": "y the speech-bubble tail points at (bubble only). Null for default."
                }
              },
              "required": [
                "type"
              ]
            }
          },
          "groups": {
            "type": "array",
            "description": "Block groups (named groupings of blocks on the canvas), when present.",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "description": "A named group of blocks.",
              "properties": {
                "name": {
                  "type": "string",
                  "description": "The group's unique name."
                },
                "notes": {
                  "type": "string",
                  "description": "Optional notes describing the group. Null if none."
                },
                "members": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Names of the blocks in this group."
                }
              },
              "required": [
                "name"
              ]
            }
          }
        },
        "required": [
          "blocks"
        ]
      }
    }
  }
}