{
  "elementsLearnedData": [],
  "elementsTestData": [],
  "flow": {
    "id": "945E859F-8669-44C0-B852-0065DA01E460",
    "name": "Product Docs - Extract and Review"
  },
  "flowVersion": {
    "clientMetadata": {
      "viewport": {
        "x": 489.875,
        "y": 574.5,
        "zoom": 0.5
      },
      "autoSave": true,
      "descriptions": {
        "flow": "",
        "initialData": "",
        "initialDataFields": {}
      }
    },
    "description": "",
    "elements": [
      {
        "clientMetadata": {
          "notes": "Monitors Google Drive for new files and triggers AI workflows when content is added, uploaded, or moved. Perfect for automated processing of incoming documents, immediate analysis of uploaded files, or triggering workflows when users add new content to specific folders. Supports recursive scanning of subfolders with separate trigger calls for each new file/folder. Polling interval can be customized (minimum 30 seconds).",
          "elementId": "EXTENSION:::SHARED:::default:::google-drive-api:::onNewFile",
          "isFirstElement": false,
          "dynamicOptionLabels": {
            "sharedDriveId": {
              "MY_GOOGLE_DRIVE": "My Google Drive"
            },
            "folderId": {}
          },
          "blockDefinitionId": "EXTENSION:::SHARED:::default:::google-drive-api:::onNewFile",
          "newElementId": "EXTENSION:::SHARED:::default:::google-drive-api:::onNewFile",
          "legacyElementId": "JS###v1###GoogleDrive###onNewFile",
          "methodName": "onNewFile",
          "position": {
            "x": 171.5,
            "y": 163
          }
        },
        "flowElementId": "AA03658A-5588-4A5A-AC3A-21DD152A4A80",
        "groupId": "80C2C2BE-6DFA-4C08-B7C6-D927539D561E",
        "id": "4C8C832E-E67F-4BE2-9525-4A4B8B0D0779",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "condition": null,
          "connectionId": null,
          "dynamicData": [],
          "eventName": "onNewFile",
          "frequency": {
            "repeat": {
              "every": 30
            },
            "schedule": "custom"
          },
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": null
          },
          "onFailElemId": null,
          "packageId": "default",
          "resultAlias": "newFile",
          "serviceId": "google-drive-api",
          "slaConditions": [],
          "staticData": {
            "processRecursively": false,
            "triggerConfiguration": "files_only",
            "sharedDriveId": "MY_GOOGLE_DRIVE",
            "folderId": ""
          },
          "storeResult": true,
          "subtype": "POLLING",
          "type": "CUSTOM"
        },
        "name": "File added",
        "nextElementIds": [],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "TRIGGER"
      },
      {
        "clientMetadata": {
          "elementId": "data-bucket",
          "isFirstElement": false,
          "blockDefinitionId": "data-bucket",
          "fieldKeys": {
            "pdf": "0618dd9d-ada6-4f8f-bfa5-104bd6958d2e",
            "extraction": "2eb2eff3-6991-4d42-a27f-5855c90e3a65",
            "lastError": "7381528d-0d13-465c-a75b-53caf2b73013"
          },
          "position": {
            "x": 513,
            "y": 567
          }
        },
        "flowElementId": "90035432-C429-40CC-B4B4-0361D4FEEBB6",
        "groupId": null,
        "id": "8EE56168-20D5-4BE6-A43E-BA5F1A43B670",
        "metaInfo": {
          "bucketName": "Default",
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "fields": [
            {
              "name": "pdf",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "EMPTY_OBJECT",
                    "label": null,
                    "type": "KEYWORD",
                    "value": "general.createObject()"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "extraction",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "EMPTY_OBJECT",
                    "label": null,
                    "type": "KEYWORD",
                    "value": "general.createObject()"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "lastError",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "EMPTY_OBJECT",
                    "label": null,
                    "type": "KEYWORD",
                    "value": "general.createObject()"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "run",
          "storeResult": true
        },
        "name": "Run",
        "nextElementIds": [
          "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
        ],
        "nextGroupIds": [],
        "type": "DATA_BUCKET"
      },
      {
        "clientMetadata": {
          "notes": "Triggers when a file is modified within the selected folder. Polling interval can be customized (minimum 30 seconds). Subfolders are not monitored.",
          "elementId": "EXTENSION:::SHARED:::default:::google-drive-api:::onFileUpdated",
          "isFirstElement": false,
          "dynamicOptionLabels": {
            "sharedDriveId": {
              "MY_GOOGLE_DRIVE": "My Google Drive"
            },
            "folderId": {}
          },
          "blockDefinitionId": "EXTENSION:::SHARED:::default:::google-drive-api:::onFileUpdated",
          "newElementId": "EXTENSION:::SHARED:::default:::google-drive-api:::onFileUpdated",
          "legacyElementId": "JS###v1###GoogleDrive###onFileUpdated",
          "methodName": "onFileUpdated",
          "position": {
            "x": 171.5,
            "y": 263
          }
        },
        "flowElementId": "8EAE05D4-9526-4338-84FF-F0BCB9BC64D0",
        "groupId": "80C2C2BE-6DFA-4C08-B7C6-D927539D561E",
        "id": "3D920215-71C3-4BEC-AD72-49690BAEA9E1",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "condition": null,
          "connectionId": null,
          "dynamicData": [],
          "eventName": "onFileUpdated",
          "frequency": {
            "repeat": {
              "every": 30
            },
            "schedule": "custom"
          },
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": null
          },
          "onFailElemId": null,
          "packageId": "default",
          "resultAlias": "updFile",
          "serviceId": "google-drive-api",
          "slaConditions": [],
          "staticData": {
            "sharedDriveId": "MY_GOOGLE_DRIVE",
            "folderId": ""
          },
          "storeResult": true,
          "subtype": "POLLING",
          "type": "CUSTOM"
        },
        "name": "File updated",
        "nextElementIds": [],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "TRIGGER"
      },
      {
        "clientMetadata": {
          "elementId": "custom-cloud-code",
          "isFirstElement": false,
          "blockDefinitionId": "custom-cloud-code",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Check file type and duplicates Result"
          },
          "position": {
            "x": 1382,
            "y": 567
          }
        },
        "flowElementId": "60A0400D-3C81-4F32-8807-9217C596D03C",
        "groupId": null,
        "id": "86DCBBFB-E13C-4654-8149-898B60C18EA2",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "codeArguments": [
            {
              "name": "processed",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "seenRead",
                    "subPathSegments": null,
                    "type": "ELEMENT_LINK",
                    "value": "FAE2F77F-D724-471F-8E47-37A399A0C47D"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "fileId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "id",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "modifiedTime",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "modifiedTime",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "mimeType",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "mimeType",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "codeBody": {
            "expression": [
              {
                "id": "TEXT",
                "label": null,
                "type": "INPUT",
                "value": "let map = processed;\nif (typeof map === 'string') { try { map = JSON.parse(map); } catch (e) { map = {}; } }\nif (!map || typeof map !== 'object' || Array.isArray(map)) map = {};\nif (mimeType !== 'application/pdf') return { action: 'not_pdf', updatedMap: map };\nif (map[fileId] === modifiedTime) return { action: 'duplicate', updatedMap: map };\nconst updatedMap = Object.assign({}, map);\nupdatedMap[fileId] = modifiedTime;\nreturn { action: 'process', updatedMap };"
              }
            ],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          },
          "enabled": true,
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "onFailElemId": null,
          "resultAlias": "dedup",
          "retryPolicy": null,
          "saveToVariable": null,
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "type": "CUSTOM_CLOUD_CODE"
        },
        "name": "Check file type and duplicates",
        "nextElementIds": [
          "F8DC3D5F-1D1C-4837-B4AF-7C26BFA27F8F"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "router",
          "isFirstElement": false,
          "blockDefinitionId": "router",
          "casesViewMode": {
            "179d20c5-955f-467e-a40a-37869ad74b49": "SIMPLE",
            "be49d48d-1d40-4642-bbf2-4b022d0bce3d": "SIMPLE"
          },
          "position": {
            "x": 1747,
            "y": 567
          }
        },
        "flowElementId": "6E8645C1-AA1B-4435-B231-5F49CAF21CF5",
        "groupId": null,
        "id": "F8DC3D5F-1D1C-4837-B4AF-7C26BFA27F8F",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "route1",
          "storeResult": true,
          "switchCases": [
            {
              "defaultCase": false,
              "id": "179d20c5-955f-467e-a40a-37869ad74b49",
              "label": "Process",
              "nextComponents": [
                {
                  "componentId": "20CE3BAA-19FE-403F-A94E-5A329137FE32",
                  "componentType": "ELEMENT"
                }
              ],
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "process"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "defaultCase": false,
              "id": "be49d48d-1d40-4642-bbf2-4b022d0bce3d",
              "label": "Not a PDF",
              "nextComponents": [
                {
                  "componentId": "8911A865-7EEB-466C-ABF1-F82DF7EED6EB",
                  "componentType": "ELEMENT"
                }
              ],
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "not_pdf"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "defaultCase": true,
              "id": "3110dcf7-7317-4e57-9f4e-8b5e6bcdbbf5",
              "label": "Everything Else",
              "nextComponents": [],
              "type": "SIMPLE",
              "value": null
            }
          ],
          "switchExpression": {
            "expression": [
              {
                "id": "ELEMENT_RESULT",
                "label": "dedup",
                "subPathSegments": [
                  {
                    "key": "action",
                    "optional": false
                  }
                ],
                "type": "ELEMENT_LINK",
                "value": "86DCBBFB-E13C-4654-8149-898B60C18EA2"
              }
            ],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          }
        },
        "name": "Process, skip duplicate, or flag non-PDF",
        "nextElementIds": [
          "8911A865-7EEB-466C-ABF1-F82DF7EED6EB",
          "20CE3BAA-19FE-403F-A94E-5A329137FE32"
        ],
        "nextGroupIds": [],
        "type": "VALUE_ROUTER"
      },
      {
        "clientMetadata": {
          "notes": "Downloads a file from Google Drive and saves it to the Files.",
          "elementId": "EXTENSION:::SHARED:::default:::google-drive-api:::downloadFile",
          "isFirstElement": false,
          "blockDefinitionId": "api-service-method",
          "setResultToVariable": true,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "pdf"
          },
          "newElementId": "EXTENSION:::SHARED:::default:::google-drive-api:::downloadFile",
          "legacyElementId": "JS###v1###GoogleDrive###downloadFile",
          "methodName": "downloadFile",
          "position": {
            "x": 3037,
            "y": 727
          }
        },
        "flowElementId": "D1BE3789-2DE6-480B-8660-68C79396FB88",
        "groupId": null,
        "id": "96802BEA-BED0-4F91-B43D-D95DCB5531DD",
        "metaInfo": {
          "bodyParams": [
            {
              "name": "fileId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "id",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "targetDirectory",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "/product-docs"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "connectionId": null,
          "enabled": true,
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "methodName": "downloadFile",
          "onFailElemId": "1B56E7A8-E0CB-4C74-8F21-4E4AD0D450DB",
          "packageId": "default",
          "resultAlias": "dl2",
          "retryPolicy": null,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "pdf"
          },
          "serviceId": "google-drive-api",
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "API_SERVICE",
          "type": "EXTENSION"
        },
        "name": "Download PDF (attempt 2)",
        "nextElementIds": [
          "E952AF5C-5697-44C6-920E-15E9AD659FBF"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "notes": "Sends messages to Slack channels with optional Block Kit rich layouts. Supports plain text with Slack formatting, or advanced Block Kit JSON for buttons, menus, and interactive elements. Returns the message timestamp and channel ID for later updates or tracking.",
          "elementId": "EXTENSION:::SHARED:::default:::slack:::sendMessageToChannel",
          "isFirstElement": false,
          "dynamicOptionLabels": {
            "channelId": {}
          },
          "blockDefinitionId": "api-service-method",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Slack: file is not a PDF Result"
          },
          "newElementId": "EXTENSION:::SHARED:::default:::slack:::sendMessageToChannel",
          "legacyElementId": "JS###v1###slack###sendMessageToChannel",
          "methodName": "sendMessageToChannel",
          "position": {
            "x": 2126.5,
            "y": 650.5
          }
        },
        "flowElementId": "5BB18951-B18C-4B3E-BAFF-B2170FCB8F4E",
        "groupId": null,
        "id": "8911A865-7EEB-466C-ABF1-F82DF7EED6EB",
        "metaInfo": {
          "bodyParams": [
            {
              "name": "channelId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": ""
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "messageText",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": ":information_source: Skipped *"
                  },
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "name",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  },
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "* in Product Documents: it is not a PDF ("
                  },
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "mimeType",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  },
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "). Nothing was extracted. "
                  },
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "webViewLink",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "threadId",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "sendAsBot",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "K_FALSE",
                    "label": null,
                    "type": "KEYWORD",
                    "value": false
                  }
                ],
                "mode": "BASIC",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "botName",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "botIcon",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "replyBroadcast",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "K_FALSE",
                    "label": null,
                    "type": "KEYWORD",
                    "value": false
                  }
                ],
                "mode": "BASIC",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "imageURL",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "blocks",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "connectionId": null,
          "enabled": true,
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "methodName": "sendMessageToChannel",
          "onFailElemId": null,
          "packageId": "default",
          "resultAlias": "slackNotPdf",
          "retryPolicy": null,
          "saveToVariable": null,
          "serviceId": "slack",
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "API_SERVICE",
          "type": "EXTENSION"
        },
        "name": "Slack: file is not a PDF",
        "nextElementIds": [],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "shared-memory-put",
          "isFirstElement": false,
          "blockDefinitionId": "shared-memory-put",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default"
          },
          "position": {
            "x": 2126.5,
            "y": 483.5
          }
        },
        "flowElementId": "1D93B678-7B51-42CC-A4BD-DE5BDBACC75B",
        "groupId": null,
        "id": "20CE3BAA-19FE-403F-A94E-5A329137FE32",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "data": [
            {
              "name": "product_docs_processed",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "dedup",
                    "subPathSegments": [
                      {
                        "key": "updatedMap",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "86DCBBFB-E13C-4654-8149-898B60C18EA2"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "enabled": true,
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "onFailElemId": null,
          "override": true,
          "resultAlias": "markSeen",
          "retryPolicy": null,
          "saveToVariable": null,
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "PUT",
          "type": "SHARED_MEMORY"
        },
        "name": "Mark this file version as processed",
        "nextElementIds": [
          "81A37515-0500-478A-AC45-79B2C899AD33"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "error-handler",
          "isFirstElement": false,
          "blockDefinitionId": "error-handler",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Download failed (1) Result"
          },
          "position": {
            "x": 2748,
            "y": 727
          }
        },
        "flowElementId": "2C002360-7B5C-4030-A939-04EED6A8FDB9",
        "groupId": null,
        "id": "82B161E5-610F-4D67-8EB1-6893BA409E9A",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "ehDl1",
          "saveToVariable": null,
          "storeResult": true
        },
        "name": "Download failed (1)",
        "nextElementIds": [
          "96802BEA-BED0-4F91-B43D-D95DCB5531DD"
        ],
        "nextGroupIds": [],
        "type": "ERROR_HANDLER"
      },
      {
        "clientMetadata": {
          "elementId": "shared-memory-read",
          "isFirstElement": false,
          "blockDefinitionId": "shared-memory-read",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Read processed versions Result"
          },
          "position": {
            "x": 1067,
            "y": 567
          }
        },
        "flowElementId": "B35AB529-DE53-4447-B070-9920643F32A5",
        "groupId": null,
        "id": "FAE2F77F-D724-471F-8E47-37A399A0C47D",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "defaultValue": {
            "expression": [
              {
                "id": "EMPTY_OBJECT",
                "label": null,
                "type": "KEYWORD",
                "value": "general.createObject()"
              }
            ],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          },
          "enabled": true,
          "key": "product_docs_processed",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "onFailElemId": null,
          "resultAlias": "seenRead",
          "retryPolicy": null,
          "saveToVariable": null,
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "READ",
          "type": "SHARED_MEMORY"
        },
        "name": "Read processed versions",
        "nextElementIds": [
          "86DCBBFB-E13C-4654-8149-898B60C18EA2"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "error-handler",
          "isFirstElement": false,
          "blockDefinitionId": "error-handler",
          "setResultToVariable": true,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "position": {
            "x": 8200,
            "y": 895.5
          }
        },
        "flowElementId": "10CEB9C1-C856-439C-93A0-92E5079C342F",
        "groupId": null,
        "id": "CF439A8A-0F40-4B90-A931-F4418E36A2CB",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "ehDl3",
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "storeResult": true
        },
        "name": "Download failed (3)",
        "nextElementIds": [
          "092BEE99-4F57-47CC-9031-5CB4FF41471D"
        ],
        "nextGroupIds": [],
        "type": "ERROR_HANDLER"
      },
      {
        "clientMetadata": {
          "notes": "Retrieves file metadata for AI agents to analyze file properties, check modification dates, get sharing links, or gather file information for processing workflows. Essential for file management automation and content organization.",
          "elementId": "EXTENSION:::SHARED:::default:::google-drive-api:::getFileData",
          "isFirstElement": false,
          "blockDefinitionId": "api-service-method",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Get file details Result"
          },
          "newElementId": "EXTENSION:::SHARED:::default:::google-drive-api:::getFileData",
          "legacyElementId": "JS###v1###GoogleDrive###getFileData",
          "methodName": "getFileData",
          "position": {
            "x": 783,
            "y": 567
          }
        },
        "flowElementId": "B5B80512-1A9D-483E-A3EB-2C176661A258",
        "groupId": null,
        "id": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B",
        "metaInfo": {
          "bodyParams": [
            {
              "name": "fileId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "trig",
                    "subPathSegments": [
                      {
                        "key": "data",
                        "optional": false
                      },
                      {
                        "key": "id",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "80C2C2BE-6DFA-4C08-B7C6-D927539D561E"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "connectionId": null,
          "enabled": true,
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "methodName": "getFileData",
          "onFailElemId": null,
          "packageId": "default",
          "resultAlias": "meta",
          "retryPolicy": null,
          "saveToVariable": null,
          "serviceId": "google-drive-api",
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "API_SERVICE",
          "type": "EXTENSION"
        },
        "name": "Get file details",
        "nextElementIds": [
          "FAE2F77F-D724-471F-8E47-37A399A0C47D"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "notes": "Downloads a file from Google Drive and saves it to the Files.",
          "elementId": "EXTENSION:::SHARED:::default:::google-drive-api:::downloadFile",
          "isFirstElement": false,
          "blockDefinitionId": "api-service-method",
          "setResultToVariable": true,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "pdf"
          },
          "newElementId": "EXTENSION:::SHARED:::default:::google-drive-api:::downloadFile",
          "legacyElementId": "JS###v1###GoogleDrive###downloadFile",
          "methodName": "downloadFile",
          "position": {
            "x": 3615,
            "y": 845.5
          }
        },
        "flowElementId": "C83D07E5-2037-49C1-9233-0BF9D824352B",
        "groupId": null,
        "id": "B67308BF-3E65-4DF8-BB42-83A7D7BDC64E",
        "metaInfo": {
          "bodyParams": [
            {
              "name": "fileId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "id",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "targetDirectory",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "/product-docs"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "connectionId": null,
          "enabled": true,
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "methodName": "downloadFile",
          "onFailElemId": "CF439A8A-0F40-4B90-A931-F4418E36A2CB",
          "packageId": "default",
          "resultAlias": "dl3",
          "retryPolicy": null,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "pdf"
          },
          "serviceId": "google-drive-api",
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "API_SERVICE",
          "type": "EXTENSION"
        },
        "name": "Download PDF (attempt 3)",
        "nextElementIds": [
          "E952AF5C-5697-44C6-920E-15E9AD659FBF"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "error-handler",
          "isFirstElement": false,
          "blockDefinitionId": "error-handler",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Download failed (2) Result"
          },
          "position": {
            "x": 3326,
            "y": 845.5
          }
        },
        "flowElementId": "B722B36F-CAD5-42AA-BCEE-C26236C36FDD",
        "groupId": null,
        "id": "1B56E7A8-E0CB-4C74-8F21-4E4AD0D450DB",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "ehDl2",
          "saveToVariable": null,
          "storeResult": true
        },
        "name": "Download failed (2)",
        "nextElementIds": [
          "B67308BF-3E65-4DF8-BB42-83A7D7BDC64E"
        ],
        "nextGroupIds": [],
        "type": "ERROR_HANDLER"
      },
      {
        "clientMetadata": {
          "notes": "Downloads a file from Google Drive and saves it to the Files.",
          "elementId": "EXTENSION:::SHARED:::default:::google-drive-api:::downloadFile",
          "isFirstElement": false,
          "blockDefinitionId": "api-service-method",
          "setResultToVariable": true,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "pdf"
          },
          "newElementId": "EXTENSION:::SHARED:::default:::google-drive-api:::downloadFile",
          "legacyElementId": "JS###v1###GoogleDrive###downloadFile",
          "methodName": "downloadFile",
          "position": {
            "x": 2460,
            "y": 483.5
          }
        },
        "flowElementId": "AA7984FC-437D-484C-9FB9-C37B2B4E1997",
        "groupId": null,
        "id": "81A37515-0500-478A-AC45-79B2C899AD33",
        "metaInfo": {
          "bodyParams": [
            {
              "name": "fileId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "id",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "targetDirectory",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "/product-docs"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "connectionId": null,
          "enabled": true,
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "methodName": "downloadFile",
          "onFailElemId": "82B161E5-610F-4D67-8EB1-6893BA409E9A",
          "packageId": "default",
          "resultAlias": "dl1",
          "retryPolicy": null,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "pdf"
          },
          "serviceId": "google-drive-api",
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "API_SERVICE",
          "type": "EXTENSION"
        },
        "name": "Download PDF (attempt 1)",
        "nextElementIds": [
          "E952AF5C-5697-44C6-920E-15E9AD659FBF"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "ai-agent",
          "isFirstElement": false,
          "blockDefinitionId": "ai-agent",
          "setResultToVariable": true,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "extraction"
          },
          "tools": {},
          "position": {
            "x": 3954,
            "y": 452.5
          }
        },
        "flowElementId": "80505949-29C1-47A1-A3CF-1937A8102FE1",
        "groupId": null,
        "id": "E952AF5C-5697-44C6-920E-15E9AD659FBF",
        "metaInfo": {
          "aiApiKey": null,
          "aiModel": "claude-opus-5",
          "aiProvider": "ANTHROPIC",
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "dynamicAiApiKey": null,
          "enabled": true,
          "files": [
            {
              "mimeType": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "application/pdf"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": "STRING"
              },
              "url": {
                "expression": [
                  {
                    "id": "EXECUTION_CONTEXT_DATA_BUCKET_VARIABLE",
                    "label": "Default - pdf",
                    "subPathSegments": [
                      {
                        "key": "url",
                        "optional": false
                      }
                    ],
                    "type": "EXECUTION_CONTEXT_PATH",
                    "value": "executionContext.dataBuckets.Default.pdf",
                    "valueSegments": [
                      {
                        "key": "executionContext",
                        "optional": false
                      },
                      {
                        "key": "dataBuckets",
                        "optional": false
                      },
                      {
                        "key": "Default",
                        "optional": false
                      },
                      {
                        "key": "pdf",
                        "optional": false
                      }
                    ]
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": "STRING"
              }
            }
          ],
          "forceParsedOutput": false,
          "langSmithSettings": {
            "enabled": false,
            "apiKey": null,
            "projectName": null,
            "label": "FlowRunner AI-Agent",
            "accountCluster": "US"
          },
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "messagesHistoryEnabled": false,
          "messagesHistoryLimit": 15,
          "onFailElemId": "A843496F-CE46-464D-A6D1-73790E1C1F1F",
          "resultAlias": "ai1",
          "retryPolicy": null,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "extraction"
          },
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "systemPrompt": {
            "expression": [
              {
                "id": "TEXT",
                "label": null,
                "type": "INPUT",
                "value": "You extract product data from one PDF: a product datasheet or a price list.\n\nRESPONSE FORMAT: your entire response is one JSON object. The first character is { and the last character is }. No prose before or after it, no markdown, no code fences, no comments. Strings use double quotes; escape any double quote or backslash inside a value.\n\nOutput shape (compact, single line, no extra whitespace):\n{\"document_type\":\"datasheet\"|\"price_list\"|\"other\",\"products\":[{\"fields\":{ ...only the fields this document states... }}]}\n\nField keys: product_code, product_name, specifications, price, availability, packaging, application_notes, safety_data, compliance.\n\nEach included field is:\n{\"as_written\": string, \"normalized\": string|object, \"confidence\": number, \"page\": integer, \"note\": string}\n- \"note\" only when confidence is below 0.9; omit it otherwise.\n\nKEEP THE OUTPUT SHORT: a document can list dozens of products and your response has a hard length limit.\n- OMIT any field the document does not state for that product. Never output null or empty placeholder fields.\n- Exception: always include product_code; if no code is printed, use {\"present\": false, \"confidence\": <how sure you are none is printed>}.\n- If you are unsure whether a field is stated for a product, include it as {\"present\": false, \"confidence\": <below 0.9>, \"note\": \"why\"}.\n- Keep as_written to the exact printed text for that field only, not surrounding sentences.\n\nRules\n- One entry per distinct product code. If a table lists variants with different codes, each code is its own product. Never merge two codes, never invent a code.\n- Extract only what the document states. Do not infer, look up, or fill in values from general knowledge. If a field is not in the document for that product, leave it out entirely.\n- normalized:\n  - Units converted to metric/SI (mm, m, kg, g, L, mL, degC, kPa, N, W, etc.). Keep significant figures sensible; do not round away precision that was printed.\n  - specifications: a single string of \"key: value unit\" pairs separated by \"; \", keys lowercase snake_case, sorted alphabetically by key, all values in metric. Example: \"density: 1.05 g/cm3; max_temperature: 120 degC; width: 25.4 mm\".\n  - price: an object {\"amount\": number, \"currency\": ISO 4217 code as printed (do NOT convert currency), \"per\": unit basis in metric or \"each\", \"min_qty\": number|null}. If several price breaks exist, use the single-unit / lowest-quantity price and put the others in note.\n  - packaging: metric quantities, e.g. \"25 kg bag\", \"box of 100\".\n  - availability, application_notes, safety_data, compliance: concise plain text; for compliance list standards/certifications separated by \"; \", sorted alphabetically.\n- confidence calibration:\n  - 0.95-1.0: value printed explicitly, unambiguous, clearly tied to this product code.\n  - 0.80-0.94: printed but needed interpretation (shared table header, footnote, unit conversion with an assumption).\n  - below 0.80: ambiguous, partly illegible, conflicting within the document, or you are unsure which product it belongs to. Say why in note.\n- If the same field has different values in different places of the document, use the most specific one, set confidence below 0.8, and describe the conflict in note.\n- product_code confidence below 0.9 is allowed but must be explained in note.\n\nIf the document contains no products, return {\"document_type\": \"other\", \"products\": []}."
              }
            ],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          },
          "tools": [],
          "type": "AI_AGENT",
          "userPrompt": {
            "expression": [
              {
                "id": "TEXT",
                "label": null,
                "type": "INPUT",
                "value": "Extract every product from the attached PDF \""
              },
              {
                "id": "ELEMENT_RESULT",
                "label": "meta",
                "subPathSegments": [
                  {
                    "key": "name",
                    "optional": false
                  }
                ],
                "type": "ELEMENT_LINK",
                "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
              },
              {
                "id": "TEXT",
                "label": null,
                "type": "INPUT",
                "value": "\" following the rules. Return only the JSON object."
              }
            ],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          }
        },
        "name": "Extract products with AI (attempt 1)",
        "nextElementIds": [
          "421B4482-D28A-4C95-9140-A50871C04191"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "error-handler",
          "isFirstElement": false,
          "blockDefinitionId": "error-handler",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "AI extraction failed (2) Result"
          },
          "position": {
            "x": 4928,
            "y": 689.5
          }
        },
        "flowElementId": "6EB08BFE-87ED-43B0-8D72-61766E602F51",
        "groupId": null,
        "id": "CE30692B-298F-486F-8754-6A6EBF0DCA12",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "ehAi2",
          "saveToVariable": null,
          "storeResult": true
        },
        "name": "AI extraction failed (2)",
        "nextElementIds": [
          "C688533D-F315-427A-8423-62F9B6578E2E"
        ],
        "nextGroupIds": [],
        "type": "ERROR_HANDLER"
      },
      {
        "clientMetadata": {
          "elementId": "ai-agent",
          "isFirstElement": false,
          "blockDefinitionId": "ai-agent",
          "setResultToVariable": true,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "extraction"
          },
          "tools": {},
          "position": {
            "x": 4602.5,
            "y": 549
          }
        },
        "flowElementId": "22262C08-0986-44FC-B29E-051D4E9C0E8D",
        "groupId": null,
        "id": "4DAF924E-F297-407E-AB43-D3DA6731C94E",
        "metaInfo": {
          "aiApiKey": null,
          "aiModel": "claude-opus-5",
          "aiProvider": "ANTHROPIC",
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "dynamicAiApiKey": null,
          "enabled": true,
          "files": [
            {
              "mimeType": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "application/pdf"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": "STRING"
              },
              "url": {
                "expression": [
                  {
                    "id": "EXECUTION_CONTEXT_DATA_BUCKET_VARIABLE",
                    "label": "Default - pdf",
                    "subPathSegments": [
                      {
                        "key": "url",
                        "optional": false
                      }
                    ],
                    "type": "EXECUTION_CONTEXT_PATH",
                    "value": "executionContext.dataBuckets.Default.pdf",
                    "valueSegments": [
                      {
                        "key": "executionContext",
                        "optional": false
                      },
                      {
                        "key": "dataBuckets",
                        "optional": false
                      },
                      {
                        "key": "Default",
                        "optional": false
                      },
                      {
                        "key": "pdf",
                        "optional": false
                      }
                    ]
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": "STRING"
              }
            }
          ],
          "forceParsedOutput": false,
          "langSmithSettings": {
            "enabled": false,
            "apiKey": null,
            "projectName": null,
            "label": "FlowRunner AI-Agent",
            "accountCluster": "US"
          },
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "messagesHistoryEnabled": false,
          "messagesHistoryLimit": 15,
          "onFailElemId": "CE30692B-298F-486F-8754-6A6EBF0DCA12",
          "resultAlias": "ai2",
          "retryPolicy": null,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "extraction"
          },
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "systemPrompt": {
            "expression": [
              {
                "id": "TEXT",
                "label": null,
                "type": "INPUT",
                "value": "You extract product data from one PDF: a product datasheet or a price list.\n\nRESPONSE FORMAT: your entire response is one JSON object. The first character is { and the last character is }. No prose before or after it, no markdown, no code fences, no comments. Strings use double quotes; escape any double quote or backslash inside a value.\n\nOutput shape (compact, single line, no extra whitespace):\n{\"document_type\":\"datasheet\"|\"price_list\"|\"other\",\"products\":[{\"fields\":{ ...only the fields this document states... }}]}\n\nField keys: product_code, product_name, specifications, price, availability, packaging, application_notes, safety_data, compliance.\n\nEach included field is:\n{\"as_written\": string, \"normalized\": string|object, \"confidence\": number, \"page\": integer, \"note\": string}\n- \"note\" only when confidence is below 0.9; omit it otherwise.\n\nKEEP THE OUTPUT SHORT: a document can list dozens of products and your response has a hard length limit.\n- OMIT any field the document does not state for that product. Never output null or empty placeholder fields.\n- Exception: always include product_code; if no code is printed, use {\"present\": false, \"confidence\": <how sure you are none is printed>}.\n- If you are unsure whether a field is stated for a product, include it as {\"present\": false, \"confidence\": <below 0.9>, \"note\": \"why\"}.\n- Keep as_written to the exact printed text for that field only, not surrounding sentences.\n\nRules\n- One entry per distinct product code. If a table lists variants with different codes, each code is its own product. Never merge two codes, never invent a code.\n- Extract only what the document states. Do not infer, look up, or fill in values from general knowledge. If a field is not in the document for that product, leave it out entirely.\n- normalized:\n  - Units converted to metric/SI (mm, m, kg, g, L, mL, degC, kPa, N, W, etc.). Keep significant figures sensible; do not round away precision that was printed.\n  - specifications: a single string of \"key: value unit\" pairs separated by \"; \", keys lowercase snake_case, sorted alphabetically by key, all values in metric. Example: \"density: 1.05 g/cm3; max_temperature: 120 degC; width: 25.4 mm\".\n  - price: an object {\"amount\": number, \"currency\": ISO 4217 code as printed (do NOT convert currency), \"per\": unit basis in metric or \"each\", \"min_qty\": number|null}. If several price breaks exist, use the single-unit / lowest-quantity price and put the others in note.\n  - packaging: metric quantities, e.g. \"25 kg bag\", \"box of 100\".\n  - availability, application_notes, safety_data, compliance: concise plain text; for compliance list standards/certifications separated by \"; \", sorted alphabetically.\n- confidence calibration:\n  - 0.95-1.0: value printed explicitly, unambiguous, clearly tied to this product code.\n  - 0.80-0.94: printed but needed interpretation (shared table header, footnote, unit conversion with an assumption).\n  - below 0.80: ambiguous, partly illegible, conflicting within the document, or you are unsure which product it belongs to. Say why in note.\n- If the same field has different values in different places of the document, use the most specific one, set confidence below 0.8, and describe the conflict in note.\n- product_code confidence below 0.9 is allowed but must be explained in note.\n\nIf the document contains no products, return {\"document_type\": \"other\", \"products\": []}."
              }
            ],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          },
          "tools": [],
          "type": "AI_AGENT",
          "userPrompt": {
            "expression": [
              {
                "id": "TEXT",
                "label": null,
                "type": "INPUT",
                "value": "Extract every product from the attached PDF \""
              },
              {
                "id": "ELEMENT_RESULT",
                "label": "meta",
                "subPathSegments": [
                  {
                    "key": "name",
                    "optional": false
                  }
                ],
                "type": "ELEMENT_LINK",
                "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
              },
              {
                "id": "TEXT",
                "label": null,
                "type": "INPUT",
                "value": "\" following the rules. Return only the JSON object."
              }
            ],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          }
        },
        "name": "Extract products with AI (attempt 2)",
        "nextElementIds": [
          "421B4482-D28A-4C95-9140-A50871C04191"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "error-handler",
          "isFirstElement": false,
          "blockDefinitionId": "error-handler",
          "setResultToVariable": true,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "position": {
            "x": 8200,
            "y": 739.5
          }
        },
        "flowElementId": "B7012E9B-5370-46BB-A5E7-0B5E1A04AC2D",
        "groupId": null,
        "id": "2DC30B2C-B84E-4F28-BED8-A8CC1A15A55E",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "ehAi3",
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "storeResult": true
        },
        "name": "AI extraction failed (3)",
        "nextElementIds": [
          "092BEE99-4F57-47CC-9031-5CB4FF41471D"
        ],
        "nextGroupIds": [],
        "type": "ERROR_HANDLER"
      },
      {
        "clientMetadata": {
          "elementId": "ai-agent",
          "isFirstElement": false,
          "blockDefinitionId": "ai-agent",
          "setResultToVariable": true,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "extraction"
          },
          "tools": {},
          "position": {
            "x": 5253.5,
            "y": 689.5
          }
        },
        "flowElementId": "D158E5A6-1692-4A7D-BFC8-5FDB862B3C94",
        "groupId": null,
        "id": "C688533D-F315-427A-8423-62F9B6578E2E",
        "metaInfo": {
          "aiApiKey": null,
          "aiModel": "claude-opus-5",
          "aiProvider": "ANTHROPIC",
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "dynamicAiApiKey": null,
          "enabled": true,
          "files": [
            {
              "mimeType": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "application/pdf"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": "STRING"
              },
              "url": {
                "expression": [
                  {
                    "id": "EXECUTION_CONTEXT_DATA_BUCKET_VARIABLE",
                    "label": "Default - pdf",
                    "subPathSegments": [
                      {
                        "key": "url",
                        "optional": false
                      }
                    ],
                    "type": "EXECUTION_CONTEXT_PATH",
                    "value": "executionContext.dataBuckets.Default.pdf",
                    "valueSegments": [
                      {
                        "key": "executionContext",
                        "optional": false
                      },
                      {
                        "key": "dataBuckets",
                        "optional": false
                      },
                      {
                        "key": "Default",
                        "optional": false
                      },
                      {
                        "key": "pdf",
                        "optional": false
                      }
                    ]
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": "STRING"
              }
            }
          ],
          "forceParsedOutput": false,
          "langSmithSettings": {
            "enabled": false,
            "apiKey": null,
            "projectName": null,
            "label": "FlowRunner AI-Agent",
            "accountCluster": "US"
          },
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "messagesHistoryEnabled": false,
          "messagesHistoryLimit": 15,
          "onFailElemId": "2DC30B2C-B84E-4F28-BED8-A8CC1A15A55E",
          "resultAlias": "ai3",
          "retryPolicy": null,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "extraction"
          },
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "systemPrompt": {
            "expression": [
              {
                "id": "TEXT",
                "label": null,
                "type": "INPUT",
                "value": "You extract product data from one PDF: a product datasheet or a price list.\n\nRESPONSE FORMAT: your entire response is one JSON object. The first character is { and the last character is }. No prose before or after it, no markdown, no code fences, no comments. Strings use double quotes; escape any double quote or backslash inside a value.\n\nOutput shape (compact, single line, no extra whitespace):\n{\"document_type\":\"datasheet\"|\"price_list\"|\"other\",\"products\":[{\"fields\":{ ...only the fields this document states... }}]}\n\nField keys: product_code, product_name, specifications, price, availability, packaging, application_notes, safety_data, compliance.\n\nEach included field is:\n{\"as_written\": string, \"normalized\": string|object, \"confidence\": number, \"page\": integer, \"note\": string}\n- \"note\" only when confidence is below 0.9; omit it otherwise.\n\nKEEP THE OUTPUT SHORT: a document can list dozens of products and your response has a hard length limit.\n- OMIT any field the document does not state for that product. Never output null or empty placeholder fields.\n- Exception: always include product_code; if no code is printed, use {\"present\": false, \"confidence\": <how sure you are none is printed>}.\n- If you are unsure whether a field is stated for a product, include it as {\"present\": false, \"confidence\": <below 0.9>, \"note\": \"why\"}.\n- Keep as_written to the exact printed text for that field only, not surrounding sentences.\n\nRules\n- One entry per distinct product code. If a table lists variants with different codes, each code is its own product. Never merge two codes, never invent a code.\n- Extract only what the document states. Do not infer, look up, or fill in values from general knowledge. If a field is not in the document for that product, leave it out entirely.\n- normalized:\n  - Units converted to metric/SI (mm, m, kg, g, L, mL, degC, kPa, N, W, etc.). Keep significant figures sensible; do not round away precision that was printed.\n  - specifications: a single string of \"key: value unit\" pairs separated by \"; \", keys lowercase snake_case, sorted alphabetically by key, all values in metric. Example: \"density: 1.05 g/cm3; max_temperature: 120 degC; width: 25.4 mm\".\n  - price: an object {\"amount\": number, \"currency\": ISO 4217 code as printed (do NOT convert currency), \"per\": unit basis in metric or \"each\", \"min_qty\": number|null}. If several price breaks exist, use the single-unit / lowest-quantity price and put the others in note.\n  - packaging: metric quantities, e.g. \"25 kg bag\", \"box of 100\".\n  - availability, application_notes, safety_data, compliance: concise plain text; for compliance list standards/certifications separated by \"; \", sorted alphabetically.\n- confidence calibration:\n  - 0.95-1.0: value printed explicitly, unambiguous, clearly tied to this product code.\n  - 0.80-0.94: printed but needed interpretation (shared table header, footnote, unit conversion with an assumption).\n  - below 0.80: ambiguous, partly illegible, conflicting within the document, or you are unsure which product it belongs to. Say why in note.\n- If the same field has different values in different places of the document, use the most specific one, set confidence below 0.8, and describe the conflict in note.\n- product_code confidence below 0.9 is allowed but must be explained in note.\n\nIf the document contains no products, return {\"document_type\": \"other\", \"products\": []}."
              }
            ],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          },
          "tools": [],
          "type": "AI_AGENT",
          "userPrompt": {
            "expression": [
              {
                "id": "TEXT",
                "label": null,
                "type": "INPUT",
                "value": "Extract every product from the attached PDF \""
              },
              {
                "id": "ELEMENT_RESULT",
                "label": "meta",
                "subPathSegments": [
                  {
                    "key": "name",
                    "optional": false
                  }
                ],
                "type": "ELEMENT_LINK",
                "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
              },
              {
                "id": "TEXT",
                "label": null,
                "type": "INPUT",
                "value": "\" following the rules. Return only the JSON object."
              }
            ],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          }
        },
        "name": "Extract products with AI (attempt 3)",
        "nextElementIds": [
          "421B4482-D28A-4C95-9140-A50871C04191"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "error-handler",
          "isFirstElement": false,
          "blockDefinitionId": "error-handler",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "AI extraction failed (1) Result"
          },
          "position": {
            "x": 4278,
            "y": 549
          }
        },
        "flowElementId": "1D8472EB-2B4F-445B-94EA-F19E97C49746",
        "groupId": null,
        "id": "A843496F-CE46-464D-A6D1-73790E1C1F1F",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "ehAi1",
          "saveToVariable": null,
          "storeResult": true
        },
        "name": "AI extraction failed (1)",
        "nextElementIds": [
          "4DAF924E-F297-407E-AB43-D3DA6731C94E"
        ],
        "nextGroupIds": [],
        "type": "ERROR_HANDLER"
      },
      {
        "clientMetadata": {
          "elementId": "http-request",
          "isFirstElement": false,
          "blockDefinitionId": "http-request",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Get USD exchange rates Result"
          },
          "position": {
            "x": 5586,
            "y": 371
          }
        },
        "flowElementId": "7ED570EC-42C5-4056-96AA-15A9C341C174",
        "groupId": null,
        "id": "421B4482-D28A-4C95-9140-A50871C04191",
        "metaInfo": {
          "body": {
            "expression": [],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          },
          "bodyParams": [],
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "enabled": true,
          "headers": [],
          "httpMethod": "GET",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "onFailElemId": "601DDE14-EF64-4B00-939E-4F7D31EA7C2A",
          "query": {
            "expression": [],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          },
          "responseType": null,
          "resultAlias": "fx",
          "retryPolicy": {
            "backoffMultiplier": null,
            "condition": {
              "retryOnTransportError": true,
              "statusClasses": [
                "C5XX"
              ],
              "statusCodes": [],
              "type": "HTTP"
            },
            "delaySeconds": 5,
            "enabled": true,
            "initialDelaySeconds": null,
            "maxAttempts": 3,
            "strategy": "FIXED"
          },
          "saveToVariable": null,
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "type": "HTTP",
          "uriParams": [],
          "url": {
            "expression": [
              {
                "id": "TEXT",
                "label": null,
                "type": "INPUT",
                "value": "https://open.er-api.com/v6/latest/USD"
              }
            ],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          }
        },
        "name": "Get USD exchange rates",
        "nextElementIds": [
          "7B45CE3A-3387-426C-A400-E646B37A53AE"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "notes": "Sends messages to Slack channels with optional Block Kit rich layouts. Supports plain text with Slack formatting, or advanced Block Kit JSON for buttons, menus, and interactive elements. Returns the message timestamp and channel ID for later updates or tracking.",
          "elementId": "EXTENSION:::SHARED:::default:::slack:::sendMessageToChannel",
          "isFirstElement": false,
          "dynamicOptionLabels": {
            "channelId": {}
          },
          "blockDefinitionId": "api-service-method",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Slack: processing failed Result"
          },
          "newElementId": "EXTENSION:::SHARED:::default:::slack:::sendMessageToChannel",
          "legacyElementId": "JS###v1###slack###sendMessageToChannel",
          "methodName": "sendMessageToChannel",
          "position": {
            "x": 8489,
            "y": 527
          }
        },
        "flowElementId": "29D6486A-9BB3-41B1-A4CA-539DD845A394",
        "groupId": null,
        "id": "092BEE99-4F57-47CC-9031-5CB4FF41471D",
        "metaInfo": {
          "bodyParams": [
            {
              "name": "channelId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": ""
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "messageText",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": ":rotating_light: *Product document processing failed* (download and AI steps are retried twice before this)\n*File:* "
                  },
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "trig",
                    "subPathSegments": [
                      {
                        "key": "data",
                        "optional": false
                      },
                      {
                        "key": "name",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "80C2C2BE-6DFA-4C08-B7C6-D927539D561E"
                  },
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": " ("
                  },
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "trig",
                    "subPathSegments": [
                      {
                        "key": "data",
                        "optional": false
                      },
                      {
                        "key": "id",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "80C2C2BE-6DFA-4C08-B7C6-D927539D561E"
                  },
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": ")\n*Step:* "
                  },
                  {
                    "id": "EXECUTION_CONTEXT_DATA_BUCKET_VARIABLE",
                    "label": "Default - lastError",
                    "subPathSegments": [
                      {
                        "key": "source",
                        "optional": false
                      }
                    ],
                    "type": "EXECUTION_CONTEXT_PATH",
                    "value": "executionContext.dataBuckets.Default.lastError",
                    "valueSegments": [
                      {
                        "key": "executionContext",
                        "optional": false
                      },
                      {
                        "key": "dataBuckets",
                        "optional": false
                      },
                      {
                        "key": "Default",
                        "optional": false
                      },
                      {
                        "key": "lastError",
                        "optional": false
                      }
                    ]
                  },
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "\n*Error:* "
                  },
                  {
                    "id": "EXECUTION_CONTEXT_DATA_BUCKET_VARIABLE",
                    "label": "Default - lastError",
                    "subPathSegments": [
                      {
                        "key": "message",
                        "optional": false
                      }
                    ],
                    "type": "EXECUTION_CONTEXT_PATH",
                    "value": "executionContext.dataBuckets.Default.lastError",
                    "valueSegments": [
                      {
                        "key": "executionContext",
                        "optional": false
                      },
                      {
                        "key": "dataBuckets",
                        "optional": false
                      },
                      {
                        "key": "Default",
                        "optional": false
                      },
                      {
                        "key": "lastError",
                        "optional": false
                      }
                    ]
                  },
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "\nFix the cause, then re-save the file in Product Documents to reprocess it."
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "threadId",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "sendAsBot",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "K_FALSE",
                    "label": null,
                    "type": "KEYWORD",
                    "value": false
                  }
                ],
                "mode": "BASIC",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "botName",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "botIcon",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "replyBroadcast",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "K_FALSE",
                    "label": null,
                    "type": "KEYWORD",
                    "value": false
                  }
                ],
                "mode": "BASIC",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "imageURL",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "blocks",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "connectionId": null,
          "enabled": true,
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "methodName": "sendMessageToChannel",
          "onFailElemId": null,
          "packageId": "default",
          "resultAlias": "slackErr",
          "retryPolicy": null,
          "saveToVariable": null,
          "serviceId": "slack",
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "API_SERVICE",
          "type": "EXTENSION"
        },
        "name": "Slack: processing failed",
        "nextElementIds": [],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "error-handler",
          "isFirstElement": false,
          "blockDefinitionId": "error-handler",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "FX rates unavailable (continue; non-USD prices go to review) Result"
          },
          "position": {
            "x": 5949.5,
            "y": 597
          }
        },
        "flowElementId": "E596D719-ECC1-4A26-8E94-434B81750ADA",
        "groupId": null,
        "id": "601DDE14-EF64-4B00-939E-4F7D31EA7C2A",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "ehFx",
          "saveToVariable": null,
          "storeResult": true
        },
        "name": "FX rates unavailable (continue; non-USD prices go to review)",
        "nextElementIds": [
          "7B45CE3A-3387-426C-A400-E646B37A53AE"
        ],
        "nextGroupIds": [],
        "type": "ERROR_HANDLER"
      },
      {
        "clientMetadata": {
          "notes": "Finds a specific row in a specified sheet within a spreadsheet based on a column and value.",
          "elementId": "EXTENSION:::SHARED:::default:::google-sheets:::findSheetRow",
          "isFirstElement": true,
          "dynamicOptionLabels": {
            "column": {
              "Product Code": "Product Code"
            },
            "documentId": {},
            "sheetId": {
              "649813233": "Products"
            }
          },
          "blockDefinitionId": "api-service-method",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Find this product in Products Result"
          },
          "newElementId": "EXTENSION:::SHARED:::default:::google-sheets:::findSheetRow",
          "legacyElementId": "JS###v1###GoogleSheets###findSheetRow",
          "methodName": "findSheetRow",
          "position": {
            "x": 0,
            "y": 410
          }
        },
        "flowElementId": "AFCBDEA8-815B-451C-AA20-6F83C7A9B976",
        "groupId": "9C10598B-31F1-4E00-A0E1-00EA692433FF",
        "id": "DB8E75A6-AEA7-4401-9D3C-0C5FE1CC310A",
        "metaInfo": {
          "bodyParams": [
            {
              "name": "documentId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": ""
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "sheetId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "NUMBER",
                    "label": null,
                    "type": "INPUT",
                    "value": 649813233
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "column",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "Product Code"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "value",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "LIST_ITERATOR_CURRENT_ELEMENT",
                    "label": null,
                    "subPathSegments": [
                      {
                        "key": "lookup",
                        "optional": false
                      }
                    ],
                    "type": "LIST_ITERATOR_CURRENT_ELEMENT",
                    "value": "9C10598B-31F1-4E00-A0E1-00EA692433FF"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "connectionId": null,
          "enabled": true,
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "methodName": "findSheetRow",
          "onFailElemId": "C5697CDD-32E6-4F5E-AB47-A233EAA6F88C",
          "packageId": "default",
          "resultAlias": "findP",
          "retryPolicy": null,
          "saveToVariable": null,
          "serviceId": "google-sheets",
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "API_SERVICE",
          "type": "EXTENSION"
        },
        "name": "Find this product in Products",
        "nextElementIds": [
          "F41B3611-EE3D-442B-9D16-8AC9F42A48ED"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "custom-cloud-code",
          "isFirstElement": false,
          "blockDefinitionId": "custom-cloud-code",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Parse AI output into a product list Result"
          },
          "position": {
            "x": 8749,
            "y": 461
          }
        },
        "flowElementId": "59C61F9C-B787-4C12-B838-6AD8B616C8F4",
        "groupId": null,
        "id": "7B45CE3A-3387-426C-A400-E646B37A53AE",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "codeArguments": [
            {
              "name": "extraction",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "EXECUTION_CONTEXT_DATA_BUCKET_VARIABLE",
                    "label": "Default - extraction",
                    "subPathSegments": null,
                    "type": "EXECUTION_CONTEXT_PATH",
                    "value": "executionContext.dataBuckets.Default.extraction",
                    "valueSegments": [
                      {
                        "key": "executionContext",
                        "optional": false
                      },
                      {
                        "key": "dataBuckets",
                        "optional": false
                      },
                      {
                        "key": "Default",
                        "optional": false
                      },
                      {
                        "key": "extraction",
                        "optional": false
                      }
                    ]
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "fx",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "fx",
                    "subPathSegments": null,
                    "type": "ELEMENT_LINK",
                    "value": "421B4482-D28A-4C95-9140-A50871C04191"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "fileName",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "name",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "fileLink",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "webViewLink",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "modifiedTime",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "modifiedTime",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "codeBody": {
            "expression": [
              {
                "id": "TEXT",
                "label": null,
                "type": "INPUT",
                "value": "// Step 1 of evaluation: parse the AI output into a product list for the per-product loop.\n// Inputs: extraction, fx, fileName, fileLink, modifiedTime\nconst now = new Date().toISOString();\n\n// ---- parse AI output ----\n// The AI block may hand back a parsed object, a string, { output }, or a raw content array\n// ([{type:'thinking'}, {type:'text', text:'AI_PROMPT_COMMAND:PARSE_JSON-->{...}'}]). Accept all of them.\nfunction aiText(v) {\n  if (v === null || v === undefined) return '';\n  if (typeof v === 'string') return v;\n  if (Array.isArray(v)) return v.map((b) => (b && b.type === 'thinking') ? '' : (b && typeof b.text === 'string' ? b.text : aiText(b))).join('\\n');\n  if (typeof v === 'object') {\n    if (Array.isArray(v.products)) return v;\n    if ('output' in v) return aiText(v.output);\n    if (typeof v.text === 'string') return v.text;\n    if ('content' in v) return aiText(v.content);\n  }\n  return '';\n}\n// Pull every complete product object out of a truncated response (the AI hit its output limit mid-product).\nfunction salvage(t) {\n  const start = t.indexOf('\"products\"');\n  if (start === -1) return null;\n  let i = t.indexOf('[', start);\n  if (i === -1) return null;\n  const items = [];\n  let depth = 0, inStr = false, esc = false, objStart = -1;\n  for (i = i + 1; i < t.length; i++) {\n    const ch = t[i];\n    if (inStr) { if (esc) esc = false; else if (ch === '\\\\') esc = true; else if (ch === '\"') inStr = false; continue; }\n    if (ch === '\"') { inStr = true; continue; }\n    if (ch === '{') { if (depth === 0) objStart = i; depth++; }\n    else if (ch === '}') { depth--; if (depth === 0 && objStart !== -1) { try { items.push(JSON.parse(t.slice(objStart, i + 1))); } catch (e) {} objStart = -1; } }\n    else if (ch === ']' && depth === 0) break;\n  }\n  const dt = (t.match(/\"document_type\"\\s*:\\s*\"([^\"]*)\"/) || [])[1] || 'other';\n  return { document_type: dt, products: items, truncated: true };\n}\nfunction parseMaybe(v) {\n  let t = aiText(v);\n  if (t && typeof t === 'object') return t;\n  t = String(t);\n  const marker = t.lastIndexOf('-->');\n  if (t.indexOf('AI_PROMPT_COMMAND') !== -1 && marker !== -1) t = t.slice(marker + 3);\n  t = t.replace(/```(?:json)?/gi, '');\n  const a = t.indexOf('{'), b = t.lastIndexOf('}');\n  if (a === -1) throw new Error('AI output contained no JSON object');\n  try { return JSON.parse(t.slice(a, b + 1)); }\n  catch (e) {\n    const s = salvage(t.slice(a));\n    if (s && s.products.length) return s;\n    throw new Error('AI output is not valid JSON and no complete product could be recovered: ' + e.message);\n  }\n}\nconst ex = parseMaybe(extraction);\nif (!ex || !Array.isArray(ex.products)) throw new Error('AI output has no products array');\nif (ex.products.length === 0) throw new Error('AI found no products in \"' + fileName + '\"');\n\n// ---- FX: rates are units of currency per 1 USD ----\nlet rates = null;\ntry {\n  let f = fx;\n  if (typeof f === 'string') f = JSON.parse(f);\n  let body = f && (f.body !== undefined ? f.body : f);\n  if (typeof body === 'string') body = JSON.parse(body);\n  rates = body && body.rates ? body.rates : null;\n} catch (e) { rates = null; }\n\n\nconst cut = (s, n) => { s = String(s === null || s === undefined ? '' : s); return s.length > n ? s.slice(0, n - 1) + '…' : s; };\nconst seen = {};\nconst items = ex.products.map((p, i) => {\n  const fields = (p && p.fields) || {};\n  const cf = fields.product_code || {};\n  const code = String(cf.as_written || cf.normalized || '').trim();\n  const key = code.toUpperCase();\n  const dupCode = !!(key && seen[key]);\n  if (key) seen[key] = true;\n  return { index: i + 1, fields, code, lookup: code || '__no_code__', dupCode };\n});\nlet warningBlocks = '', warningText = '', truncAudit = null;\nif (ex.truncated) {\n  warningText = 'AI output cut off for ' + fileName;\n  const msg = ':warning: *AI output was cut off* for <' + fileLink + '|' + fileName + '>: ' + items.length + ' product(s) were extracted and processed, but the document lists more. The rest were NOT processed. Split the PDF into smaller files and drop them into Product Documents.';\n  warningBlocks = JSON.stringify([{ type: 'section', text: { type: 'mrkdwn', text: cut(msg, 2900) } }]);\n  truncAudit = { 'Timestamp': now, 'Document Name': fileName, 'Document Modified': modifiedTime, 'Product Code': '(document)', 'Review ID': '', 'Change': 'AI output truncated after ' + items.length + ' products - remaining products not processed', 'Human Reviewed': 'no', 'Approved By': '', 'Decided At': '' };\n}\nreturn { items, count: items.length, truncated: !!ex.truncated, rates: rates || {}, warningText, warningBlocks, truncAudit };\n"
              }
            ],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          },
          "enabled": true,
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "onFailElemId": "6DF351C0-9BD3-4DC3-8925-AECE8CD89337",
          "resultAlias": "parse",
          "retryPolicy": null,
          "saveToVariable": null,
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "type": "CUSTOM_CLOUD_CODE"
        },
        "name": "Parse AI output into a product list",
        "nextElementIds": [],
        "nextGroupIds": [
          "9C10598B-31F1-4E00-A0E1-00EA692433FF"
        ],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "error-handler",
          "isFirstElement": false,
          "blockDefinitionId": "error-handler",
          "setResultToVariable": true,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "position": {
            "x": 2030,
            "y": 50
          }
        },
        "flowElementId": "700C48AA-B18E-40E0-B73F-F6B80F3C9416",
        "groupId": "9C10598B-31F1-4E00-A0E1-00EA692433FF",
        "id": "52A13878-8CF4-4CF6-8BFC-02231B31E9D7",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "eh_slkRev",
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "storeResult": true
        },
        "name": "Slack review post failed",
        "nextElementIds": [
          "AFD73CD5-2EA7-4752-B416-3169273A25B4"
        ],
        "nextGroupIds": [],
        "type": "ERROR_HANDLER"
      },
      {
        "clientMetadata": {
          "elementId": "condition",
          "isFirstElement": false,
          "blockDefinitionId": "condition",
          "position": {
            "x": 9329,
            "y": 551
          }
        },
        "flowElementId": "3E312A8F-3848-4C8D-B71F-32B45B3D4EB5",
        "groupId": null,
        "id": "DA16DC79-FCE7-4877-8142-BE8B5D247B54",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "condition": {
            "conditionParts": [
              {
                "id": "31eb3cfb-3c12-4970-ab75-63a2869d5dfd",
                "nestedOperation": null,
                "operation": "isTrue",
                "property": {
                  "expression": [
                    {
                      "id": "ELEMENT_RESULT",
                      "label": "parse",
                      "subPathSegments": [
                        {
                          "key": "truncated",
                          "optional": false
                        }
                      ],
                      "type": "ELEMENT_LINK",
                      "value": "7B45CE3A-3387-426C-A400-E646B37A53AE"
                    }
                  ],
                  "mode": "EXPRESSION",
                  "parseJsonString": false,
                  "resultType": null
                },
                "propertyType": "BOOLEAN",
                "values": []
              }
            ],
            "grouping": [
              "31eb3cfb-3c12-4970-ab75-63a2869d5dfd"
            ]
          },
          "elseComponent": null,
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "cTrunc",
          "storeResult": false,
          "thenComponent": {
            "componentId": "97081E08-A9E3-4813-9BB2-35C0EC65188B",
            "componentType": "ELEMENT"
          }
        },
        "name": "Was the AI output cut off?",
        "nextElementIds": [
          "97081E08-A9E3-4813-9BB2-35C0EC65188B"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "preferredDateFormats": []
        },
        "type": "CONDITION"
      },
      {
        "clientMetadata": {
          "notes": "Adds new data rows to Google Sheets for AI agents to store processed results, log user interactions, or collect data from automated workflows. Perfect for building databases, tracking metrics, saving form submissions, or creating data collection pipelines.",
          "elementId": "EXTENSION:::SHARED:::default:::google-sheets:::addRow",
          "isFirstElement": false,
          "dynamicOptionLabels": {
            "documentId": {},
            "sheetId": {
              "1944998269": "Audit log"
            }
          },
          "blockDefinitionId": "api-service-method",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Add row to Audit log Result"
          },
          "newElementId": "EXTENSION:::SHARED:::default:::google-sheets:::addRow",
          "legacyElementId": "JS###v1###GoogleSheets###addRow",
          "methodName": "addRow",
          "position": {
            "x": 1740,
            "y": 230
          }
        },
        "flowElementId": "0BCB0B9A-49B6-4404-B6A6-ACBD5CFF5D0D",
        "groupId": "9C10598B-31F1-4E00-A0E1-00EA692433FF",
        "id": "AD4441AC-97B0-4D2A-A953-3724B0502A0D",
        "metaInfo": {
          "bodyParams": [
            {
              "name": "documentId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": ""
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "sheetId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "NUMBER",
                    "label": null,
                    "type": "INPUT",
                    "value": 1944998269
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "row",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "evalOne",
                    "subPathSegments": [
                      {
                        "key": "auditRow",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "F41B3611-EE3D-442B-9D16-8AC9F42A48ED"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "connectionId": null,
          "enabled": true,
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "methodName": "addRow",
          "onFailElemId": "D50111C3-2326-4EE2-B155-1A52F7E9F724",
          "packageId": "default",
          "resultAlias": "addAud",
          "retryPolicy": null,
          "saveToVariable": null,
          "serviceId": "google-sheets",
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "API_SERVICE",
          "type": "EXTENSION"
        },
        "name": "Add row to Audit log",
        "nextElementIds": [],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "notes": "Sends messages to Slack channels with optional Block Kit rich layouts. Supports plain text with Slack formatting, or advanced Block Kit JSON for buttons, menus, and interactive elements. Returns the message timestamp and channel ID for later updates or tracking.",
          "elementId": "EXTENSION:::SHARED:::default:::slack:::sendMessageToChannel",
          "isFirstElement": false,
          "dynamicOptionLabels": {
            "channelId": {}
          },
          "blockDefinitionId": "api-service-method",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Slack: this product failed Result"
          },
          "newElementId": "EXTENSION:::SHARED:::default:::slack:::sendMessageToChannel",
          "legacyElementId": "JS###v1###slack###sendMessageToChannel",
          "methodName": "sendMessageToChannel",
          "position": {
            "x": 2320,
            "y": 410
          }
        },
        "flowElementId": "F4592141-EC05-4ECD-8322-0F38CEB2B20B",
        "groupId": "9C10598B-31F1-4E00-A0E1-00EA692433FF",
        "id": "AFD73CD5-2EA7-4752-B416-3169273A25B4",
        "metaInfo": {
          "bodyParams": [
            {
              "name": "channelId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": ""
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "messageText",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": ":rotating_light: *Product "
                  },
                  {
                    "id": "LIST_ITERATOR_CURRENT_ELEMENT",
                    "label": null,
                    "subPathSegments": [
                      {
                        "key": "index",
                        "optional": false
                      }
                    ],
                    "type": "LIST_ITERATOR_CURRENT_ELEMENT",
                    "value": "9C10598B-31F1-4E00-A0E1-00EA692433FF"
                  },
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": " ("
                  },
                  {
                    "id": "LIST_ITERATOR_CURRENT_ELEMENT",
                    "label": null,
                    "subPathSegments": [
                      {
                        "key": "lookup",
                        "optional": false
                      }
                    ],
                    "type": "LIST_ITERATOR_CURRENT_ELEMENT",
                    "value": "9C10598B-31F1-4E00-A0E1-00EA692433FF"
                  },
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": ") of "
                  },
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "name",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  },
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": " failed* - the other products in this document are still processed.\n*Step:* "
                  },
                  {
                    "id": "EXECUTION_CONTEXT_DATA_BUCKET_VARIABLE",
                    "label": "Default - lastError",
                    "subPathSegments": [
                      {
                        "key": "source",
                        "optional": false
                      }
                    ],
                    "type": "EXECUTION_CONTEXT_PATH",
                    "value": "executionContext.dataBuckets.Default.lastError",
                    "valueSegments": [
                      {
                        "key": "executionContext",
                        "optional": false
                      },
                      {
                        "key": "dataBuckets",
                        "optional": false
                      },
                      {
                        "key": "Default",
                        "optional": false
                      },
                      {
                        "key": "lastError",
                        "optional": false
                      }
                    ]
                  },
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "\n*Error:* "
                  },
                  {
                    "id": "EXECUTION_CONTEXT_DATA_BUCKET_VARIABLE",
                    "label": "Default - lastError",
                    "subPathSegments": [
                      {
                        "key": "message",
                        "optional": false
                      }
                    ],
                    "type": "EXECUTION_CONTEXT_PATH",
                    "value": "executionContext.dataBuckets.Default.lastError",
                    "valueSegments": [
                      {
                        "key": "executionContext",
                        "optional": false
                      },
                      {
                        "key": "dataBuckets",
                        "optional": false
                      },
                      {
                        "key": "Default",
                        "optional": false
                      },
                      {
                        "key": "lastError",
                        "optional": false
                      }
                    ]
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "threadId",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "sendAsBot",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "K_FALSE",
                    "label": null,
                    "type": "KEYWORD",
                    "value": false
                  }
                ],
                "mode": "BASIC",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "botName",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "botIcon",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "replyBroadcast",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "K_FALSE",
                    "label": null,
                    "type": "KEYWORD",
                    "value": false
                  }
                ],
                "mode": "BASIC",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "imageURL",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "blocks",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "connectionId": null,
          "enabled": true,
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "methodName": "sendMessageToChannel",
          "onFailElemId": null,
          "packageId": "default",
          "resultAlias": "slkLoopErr",
          "retryPolicy": null,
          "saveToVariable": null,
          "serviceId": "slack",
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "API_SERVICE",
          "type": "EXTENSION"
        },
        "name": "Slack: this product failed",
        "nextElementIds": [],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "error-handler",
          "isFirstElement": false,
          "blockDefinitionId": "error-handler",
          "setResultToVariable": true,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "position": {
            "x": 9039,
            "y": 371
          }
        },
        "flowElementId": "E69D486B-A2B2-4378-8D12-7C377650E5FE",
        "groupId": null,
        "id": "6DF351C0-9BD3-4DC3-8925-AECE8CD89337",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "ehParse",
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "storeResult": true
        },
        "name": "Parsing AI output failed",
        "nextElementIds": [
          "092BEE99-4F57-47CC-9031-5CB4FF41471D"
        ],
        "nextGroupIds": [],
        "type": "ERROR_HANDLER"
      },
      {
        "clientMetadata": {
          "notes": "Adds new data rows to Google Sheets for AI agents to store processed results, log user interactions, or collect data from automated workflows. Perfect for building databases, tracking metrics, saving form submissions, or creating data collection pipelines.",
          "elementId": "EXTENSION:::SHARED:::default:::google-sheets:::addRow",
          "isFirstElement": false,
          "dynamicOptionLabels": {
            "documentId": {},
            "sheetId": {
              "979899611": "Staging"
            }
          },
          "blockDefinitionId": "api-service-method",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Add row to Staging Result"
          },
          "newElementId": "EXTENSION:::SHARED:::default:::google-sheets:::addRow",
          "legacyElementId": "JS###v1###GoogleSheets###addRow",
          "methodName": "addRow",
          "position": {
            "x": 870,
            "y": 180
          }
        },
        "flowElementId": "FB53A985-66EF-4019-8E09-5EA297EB87C0",
        "groupId": "9C10598B-31F1-4E00-A0E1-00EA692433FF",
        "id": "2E7C28E6-E812-406E-8073-722170DD0430",
        "metaInfo": {
          "bodyParams": [
            {
              "name": "documentId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": ""
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "sheetId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "NUMBER",
                    "label": null,
                    "type": "INPUT",
                    "value": 979899611
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "row",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "evalOne",
                    "subPathSegments": [
                      {
                        "key": "stagingRow",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "F41B3611-EE3D-442B-9D16-8AC9F42A48ED"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "connectionId": null,
          "enabled": true,
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "methodName": "addRow",
          "onFailElemId": "FBC6D016-0764-44A8-9AD4-09CE4DE0B631",
          "packageId": "default",
          "resultAlias": "addStg",
          "retryPolicy": null,
          "saveToVariable": null,
          "serviceId": "google-sheets",
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "API_SERVICE",
          "type": "EXTENSION"
        },
        "name": "Add row to Staging",
        "nextElementIds": [
          "9E7A243E-C208-4033-88E4-641CB2EC676D"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "condition",
          "isFirstElement": false,
          "blockDefinitionId": "condition",
          "position": {
            "x": 1160,
            "y": 90
          }
        },
        "flowElementId": "3F007635-CEA1-44FF-815B-C55523262993",
        "groupId": "9C10598B-31F1-4E00-A0E1-00EA692433FF",
        "id": "9E7A243E-C208-4033-88E4-641CB2EC676D",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "condition": {
            "conditionParts": [
              {
                "id": "dde3b476-3c66-419f-836d-a8834f1bf9d6",
                "nestedOperation": null,
                "operation": "isTrue",
                "property": {
                  "expression": [
                    {
                      "id": "ELEMENT_RESULT",
                      "label": "evalOne",
                      "subPathSegments": [
                        {
                          "key": "hasReview",
                          "optional": false
                        }
                      ],
                      "type": "ELEMENT_LINK",
                      "value": "F41B3611-EE3D-442B-9D16-8AC9F42A48ED"
                    }
                  ],
                  "mode": "EXPRESSION",
                  "parseJsonString": false,
                  "resultType": null
                },
                "propertyType": "BOOLEAN",
                "values": []
              }
            ],
            "grouping": [
              "dde3b476-3c66-419f-836d-a8834f1bf9d6"
            ]
          },
          "elseComponent": {
            "componentId": "AD4441AC-97B0-4D2A-A953-3724B0502A0D",
            "componentType": "ELEMENT"
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "cRev",
          "storeResult": false,
          "thenComponent": {
            "componentId": "4D2CF0B6-C796-493A-9489-5FD3B6D77C14",
            "componentType": "ELEMENT"
          }
        },
        "name": "Needs review?",
        "nextElementIds": [
          "AD4441AC-97B0-4D2A-A953-3724B0502A0D",
          "4D2CF0B6-C796-493A-9489-5FD3B6D77C14"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "preferredDateFormats": []
        },
        "type": "CONDITION"
      },
      {
        "clientMetadata": {
          "notes": "Sends messages to Slack channels with optional Block Kit rich layouts. Supports plain text with Slack formatting, or advanced Block Kit JSON for buttons, menus, and interactive elements. Returns the message timestamp and channel ID for later updates or tracking.",
          "elementId": "EXTENSION:::SHARED:::default:::slack:::sendMessageToChannel",
          "isFirstElement": false,
          "dynamicOptionLabels": {
            "channelId": {}
          },
          "blockDefinitionId": "api-service-method",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Slack: AI output cut off Result"
          },
          "newElementId": "EXTENSION:::SHARED:::default:::slack:::sendMessageToChannel",
          "legacyElementId": "JS###v1###slack###sendMessageToChannel",
          "methodName": "sendMessageToChannel",
          "position": {
            "x": 9619,
            "y": 551
          }
        },
        "flowElementId": "A6CB67D3-D7CD-4B0E-B88C-316B209AD75F",
        "groupId": null,
        "id": "97081E08-A9E3-4813-9BB2-35C0EC65188B",
        "metaInfo": {
          "bodyParams": [
            {
              "name": "channelId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": ""
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "messageText",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "parse",
                    "subPathSegments": [
                      {
                        "key": "warningText",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "7B45CE3A-3387-426C-A400-E646B37A53AE"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "threadId",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "sendAsBot",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "K_FALSE",
                    "label": null,
                    "type": "KEYWORD",
                    "value": false
                  }
                ],
                "mode": "BASIC",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "botName",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "botIcon",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "replyBroadcast",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "K_FALSE",
                    "label": null,
                    "type": "KEYWORD",
                    "value": false
                  }
                ],
                "mode": "BASIC",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "imageURL",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "blocks",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "parse",
                    "subPathSegments": [
                      {
                        "key": "warningBlocks",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "7B45CE3A-3387-426C-A400-E646B37A53AE"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "connectionId": null,
          "enabled": true,
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "methodName": "sendMessageToChannel",
          "onFailElemId": null,
          "packageId": "default",
          "resultAlias": "slkTrunc",
          "retryPolicy": null,
          "saveToVariable": null,
          "serviceId": "slack",
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "API_SERVICE",
          "type": "EXTENSION"
        },
        "name": "Slack: AI output cut off",
        "nextElementIds": [
          "859BF672-3B36-4603-9196-132F3800DA27"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "notes": "Adds new data rows to Google Sheets for AI agents to store processed results, log user interactions, or collect data from automated workflows. Perfect for building databases, tracking metrics, saving form submissions, or creating data collection pipelines.",
          "elementId": "EXTENSION:::SHARED:::default:::google-sheets:::addRow",
          "isFirstElement": false,
          "dynamicOptionLabels": {
            "documentId": {},
            "sheetId": {
              "1944998269": "Audit log"
            }
          },
          "blockDefinitionId": "api-service-method",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Audit log: output cut off Result"
          },
          "newElementId": "EXTENSION:::SHARED:::default:::google-sheets:::addRow",
          "legacyElementId": "JS###v1###GoogleSheets###addRow",
          "methodName": "addRow",
          "position": {
            "x": 9909,
            "y": 551
          }
        },
        "flowElementId": "F34D72C9-8840-47D0-8061-AF6226199435",
        "groupId": null,
        "id": "859BF672-3B36-4603-9196-132F3800DA27",
        "metaInfo": {
          "bodyParams": [
            {
              "name": "documentId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": ""
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "sheetId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "NUMBER",
                    "label": null,
                    "type": "INPUT",
                    "value": 1944998269
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "row",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "parse",
                    "subPathSegments": [
                      {
                        "key": "truncAudit",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "7B45CE3A-3387-426C-A400-E646B37A53AE"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "connectionId": null,
          "enabled": true,
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "methodName": "addRow",
          "onFailElemId": null,
          "packageId": "default",
          "resultAlias": "audTrunc",
          "retryPolicy": null,
          "saveToVariable": null,
          "serviceId": "google-sheets",
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "API_SERVICE",
          "type": "EXTENSION"
        },
        "name": "Audit log: output cut off",
        "nextElementIds": [],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "error-handler",
          "isFirstElement": false,
          "blockDefinitionId": "error-handler",
          "setResultToVariable": true,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "position": {
            "x": 2030,
            "y": 410
          }
        },
        "flowElementId": "EEAA1068-4FAB-41FB-AFBA-C758BBFCB824",
        "groupId": "9C10598B-31F1-4E00-A0E1-00EA692433FF",
        "id": "FBC6D016-0764-44A8-9AD4-09CE4DE0B631",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "eh_addStg",
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "storeResult": true
        },
        "name": "Write to Staging failed",
        "nextElementIds": [
          "AFD73CD5-2EA7-4752-B416-3169273A25B4"
        ],
        "nextGroupIds": [],
        "type": "ERROR_HANDLER"
      },
      {
        "clientMetadata": {
          "notes": "Sends messages to Slack channels with optional Block Kit rich layouts. Supports plain text with Slack formatting, or advanced Block Kit JSON for buttons, menus, and interactive elements. Returns the message timestamp and channel ID for later updates or tracking.",
          "elementId": "EXTENSION:::SHARED:::default:::slack:::sendMessageToChannel",
          "isFirstElement": false,
          "dynamicOptionLabels": {
            "channelId": {}
          },
          "blockDefinitionId": "api-service-method",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Slack: review request Result"
          },
          "newElementId": "EXTENSION:::SHARED:::default:::slack:::sendMessageToChannel",
          "legacyElementId": "JS###v1###slack###sendMessageToChannel",
          "methodName": "sendMessageToChannel",
          "position": {
            "x": 1450,
            "y": 0
          }
        },
        "flowElementId": "E4F3F0EF-1E4A-469A-B915-893C01E6782B",
        "groupId": "9C10598B-31F1-4E00-A0E1-00EA692433FF",
        "id": "4D2CF0B6-C796-493A-9489-5FD3B6D77C14",
        "metaInfo": {
          "bodyParams": [
            {
              "name": "channelId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": ""
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "messageText",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "evalOne",
                    "subPathSegments": [
                      {
                        "key": "review",
                        "optional": false
                      },
                      {
                        "key": "text",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "F41B3611-EE3D-442B-9D16-8AC9F42A48ED"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "threadId",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "sendAsBot",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "K_FALSE",
                    "label": null,
                    "type": "KEYWORD",
                    "value": false
                  }
                ],
                "mode": "BASIC",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "botName",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "botIcon",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "replyBroadcast",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "K_FALSE",
                    "label": null,
                    "type": "KEYWORD",
                    "value": false
                  }
                ],
                "mode": "BASIC",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "imageURL",
              "type": "SIMPLE",
              "value": {
                "expression": [],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "blocks",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "evalOne",
                    "subPathSegments": [
                      {
                        "key": "review",
                        "optional": false
                      },
                      {
                        "key": "blocks",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "F41B3611-EE3D-442B-9D16-8AC9F42A48ED"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "connectionId": null,
          "enabled": true,
          "hostType": "SHARED",
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "methodName": "sendMessageToChannel",
          "onFailElemId": "52A13878-8CF4-4CF6-8BFC-02231B31E9D7",
          "packageId": "default",
          "resultAlias": "slkRev",
          "retryPolicy": null,
          "saveToVariable": null,
          "serviceId": "slack",
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "subtype": "API_SERVICE",
          "type": "EXTENSION"
        },
        "name": "Slack: review request",
        "nextElementIds": [
          "AD4441AC-97B0-4D2A-A953-3724B0502A0D"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "error-handler",
          "isFirstElement": false,
          "blockDefinitionId": "error-handler",
          "setResultToVariable": true,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "position": {
            "x": 2030,
            "y": 230
          }
        },
        "flowElementId": "00935519-3C96-4916-BB76-3D174C37D80F",
        "groupId": "9C10598B-31F1-4E00-A0E1-00EA692433FF",
        "id": "D50111C3-2326-4EE2-B155-1A52F7E9F724",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "eh_addAud",
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "storeResult": true
        },
        "name": "Write to Audit log failed",
        "nextElementIds": [
          "AFD73CD5-2EA7-4752-B416-3169273A25B4"
        ],
        "nextGroupIds": [],
        "type": "ERROR_HANDLER"
      },
      {
        "clientMetadata": {
          "elementId": "custom-cloud-code",
          "isFirstElement": false,
          "blockDefinitionId": "custom-cloud-code",
          "setResultToVariable": false,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "Compare this product with Products Result"
          },
          "position": {
            "x": 290,
            "y": 320
          }
        },
        "flowElementId": "75A63243-779B-41B4-A6C3-E165BA0E8C09",
        "groupId": "9C10598B-31F1-4E00-A0E1-00EA692433FF",
        "id": "F41B3611-EE3D-442B-9D16-8AC9F42A48ED",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "codeArguments": [
            {
              "name": "item",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "LIST_ITERATOR_CURRENT_ELEMENT",
                    "label": null,
                    "subPathSegments": null,
                    "type": "LIST_ITERATOR_CURRENT_ELEMENT",
                    "value": "9C10598B-31F1-4E00-A0E1-00EA692433FF"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "productHit",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "findP",
                    "subPathSegments": null,
                    "type": "ELEMENT_LINK",
                    "value": "DB8E75A6-AEA7-4401-9D3C-0C5FE1CC310A"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "rates",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "parse",
                    "subPathSegments": [
                      {
                        "key": "rates",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "7B45CE3A-3387-426C-A400-E646B37A53AE"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "fileId",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "id",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "fileName",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "name",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "modifiedTime",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "modifiedTime",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "fileLink",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "ELEMENT_RESULT",
                    "label": "meta",
                    "subPathSegments": [
                      {
                        "key": "webViewLink",
                        "optional": false
                      }
                    ],
                    "type": "ELEMENT_LINK",
                    "value": "C5B6F0EF-E43F-4358-AC3E-E14B1C8DE19B"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            },
            {
              "name": "stagingUrl",
              "type": "SIMPLE",
              "value": {
                "expression": [
                  {
                    "id": "TEXT",
                    "label": null,
                    "type": "INPUT",
                    "value": "https://docs.google.com/spreadsheets/d/YOUR_SPREADSHEET_ID/edit#gid=979899611"
                  }
                ],
                "mode": "EXPRESSION",
                "parseJsonString": false,
                "resultType": null
              }
            }
          ],
          "codeBody": {
            "expression": [
              {
                "id": "TEXT",
                "label": null,
                "type": "INPUT",
                "value": "// Step 2 of evaluation, run once per product inside the loop.\n// Inputs: item (from the parse step), productHit (Find Row in Products: { rowData, rowNumber } or \"\"), rates, fileId, fileName, modifiedTime, fileLink, stagingUrl\nconst THRESHOLD = 0.9;\nconst FIELDS = [\n  ['product_name', 'Product Name'],\n  ['specifications', 'Specifications'],\n  ['price', 'Price'],\n  ['availability', 'Availability'],\n  ['packaging', 'Packaging'],\n  ['application_notes', 'Application Notes'],\n  ['safety_data', 'Safety Data'],\n  ['compliance', 'Compliance'],\n];\nconst normCol = (label) => (label === 'Price' ? 'Price (USD)' : label + ' (normalized)');\nconst rawCol = (label) => label + ' (as written)';\nconst now = new Date().toISOString();\n\nif (typeof rates === 'string') { try { rates = JSON.parse(rates); } catch (e) { rates = null; } }\nfunction priceToUsd(n) {\n  if (!n || typeof n !== 'object' || typeof n.amount !== 'number') return { usd: null, why: 'price amount not numeric' };\n  const cur = String(n.currency || '').toUpperCase();\n  if (!cur) return { usd: null, why: 'currency not stated' };\n  if (cur === 'USD') return { usd: Math.round(n.amount * 10000) / 10000, why: null };\n  if (!rates || !rates[cur]) return { usd: null, why: 'no FX rate for ' + cur };\n  return { usd: Math.round((n.amount / rates[cur]) * 10000) / 10000, why: null, fx: cur + ' @ ' + rates[cur] + '/USD' };\n}\n\nconst clean = (v) => String(v === null || v === undefined ? '' : v).toLowerCase().replace(/\\s+/g, ' ').trim();\nfunction sameNumber(a, b) {\n  const x = parseFloat(a), y = parseFloat(b);\n  return !isNaN(x) && !isNaN(y) && Math.abs(x - y) < 0.005;\n}\nconst cut = (s, n) => { s = String(s === null || s === undefined ? '' : s); return s.length > n ? s.slice(0, n - 1) + '…' : s; };\n\nconst p = item || {};\nconst hitRow = (h) => {\n  if (typeof h === 'string') { if (!h.trim()) return null; try { h = JSON.parse(h); } catch (e) { return null; } }\n  return (h && h.rowData && typeof h.rowData === 'object') ? h.rowData : null;\n};\nconst stagingRows = [], reviewItems = [], auditRows = [];\n{\n\n  const f = (p && p.fields) || {};\n  const codeF = f.product_code || {};\n  const code = String(codeF.as_written || codeF.normalized || '').trim();\n  const codeKey = code.toUpperCase();\n  const reviewId = (String(fileId).slice(-6) + '-' + (codeKey || 'NOCODE') + '-' + Date.now().toString(36) + Math.floor(Math.random() * 1296).toString(36)).replace(/[^A-Za-z0-9._-]/g, '');\n\n  const proposed = { 'Product Code': code };\n  const confidence = { product_code: codeF.confidence };\n  const pages = { product_code: codeF.page };\n  const uncertain = [];\n  const conflicts = [];\n  const additions = [];\n  const notes = {};\n\n  if (!code && codeF.present === false && typeof codeF.confidence === 'number' && codeF.confidence < THRESHOLD) uncertain.push({ key: 'product_code', label: 'Product Code', reason: codeF.note || 'unsure whether a code is printed' });\n  if (!code) uncertain.push({ key: 'product_code', label: 'Product Code', reason: 'no product code found' });\n  else if (!(codeF.confidence >= THRESHOLD)) uncertain.push({ key: 'product_code', label: 'Product Code', reason: codeF.note || 'low confidence' });\n  if (p.dupCode) uncertain.push({ key: 'product_code', label: 'Product Code', reason: 'code appears more than once in this document' });\n\n  const ex0 = hitRow(productHit);\n  const existing = ex0 && codeKey && String(ex0['Product Code'] || '').trim().toUpperCase() === codeKey ? ex0 : null;\n\n  for (const [key, label] of FIELDS) {\n    const v = f[key] || { present: false, confidence: 1 }; // omitted = not stated in the document\n    confidence[key] = v.confidence;\n    pages[key] = v.page;\n    if (v.note) notes[key] = v.note;\n    if (v.present === false) {\n      // A field the document does not state: never a conflict, never overwrites. Uncertain only if the AI is unsure it is absent.\n      if (typeof v.confidence === 'number' && v.confidence < THRESHOLD) uncertain.push({ key, label, reason: v.note || 'unsure whether this field is in the document' });\n      continue;\n    }\n    let normalized = v.normalized;\n    if (key === 'price') {\n      const conv = priceToUsd(v.normalized);\n      normalized = conv.usd;\n      if (conv.why) uncertain.push({ key, label, reason: 'cannot normalize to USD: ' + conv.why });\n      if (conv.fx) notes.price_fx = conv.fx;\n    } else if (normalized && typeof normalized === 'object') {\n      normalized = JSON.stringify(normalized);\n    }\n    proposed[rawCol(label)] = v.as_written === null || v.as_written === undefined ? '' : String(v.as_written);\n    proposed[normCol(label)] = normalized === null || normalized === undefined ? '' : normalized;\n    if (!(v.confidence >= THRESHOLD)) uncertain.push({ key, label, reason: v.note || 'confidence ' + v.confidence });\n\n    if (existing) {\n      const curRaw = existing[rawCol(label)];\n      const curNorm = existing[normCol(label)];\n      const curBlank = clean(curRaw) === '' && clean(curNorm) === '';\n      if (curBlank) { additions.push(label); continue; }\n      const rawSame = clean(curRaw) !== '' && clean(curRaw) === clean(proposed[rawCol(label)]);\n      const normSame = key === 'price' ? sameNumber(curNorm, normalized) : clean(curNorm) === clean(normalized);\n      if (!rawSame && !normSame) {\n        conflicts.push({ key, label, current: { as_written: curRaw, normalized: curNorm }, proposed: { as_written: proposed[rawCol(label)], normalized } });\n      }\n    }\n  }\n\n  const uncertainLabels = Array.from(new Set(uncertain.map((u) => u.label)));\n  const conflictLabels = conflicts.map((c) => c.label);\n  const needsReview = uncertain.length > 0 || conflicts.length > 0;\n  const isNew = !existing;\n\n  let status, change, human;\n  if (needsReview) {\n    status = 'pending_review';\n    const parts = [];\n    if (uncertainLabels.length) parts.push('uncertain: ' + uncertainLabels.join(', '));\n    if (conflictLabels.length) parts.push('conflicts with Products: ' + conflictLabels.join(', '));\n    change = (isNew ? 'new product' : 'existing product') + ' - ' + parts.join('; ') + ' - sent for review';\n    human = 'pending';\n  } else if (isNew) {\n    status = 'ready';\n    change = 'new product - all fields confident - staged as ready';\n    human = 'no';\n  } else if (additions.length) {\n    status = 'ready';\n    change = 'existing product - adds previously blank fields: ' + additions.join(', ') + ' - staged as ready';\n    human = 'no';\n  } else {\n    status = null;\n    change = 'no change - matches Products';\n    human = 'no';\n  }\n\n  if (status) {\n    const row = Object.assign({\n      'Review ID': reviewId,\n      'Status': status,\n    }, proposed, {\n      'Confidence': JSON.stringify(confidence),\n      'Source Pages': JSON.stringify(pages),\n      'Uncertain Fields': uncertain.map((u) => u.label + ': ' + u.reason).join(' | '),\n      'Conflicts': conflictLabels.join(', '),\n      'AI Notes': JSON.stringify(notes),\n      'Proposed (JSON)': JSON.stringify(proposed),\n      'Existing Product': isNew ? 'no' : 'yes',\n      'Document Name': fileName,\n      'Document Link': fileLink,\n      'Document Modified': modifiedTime,\n      'Created At': now,\n      'Decided By': '',\n      'Decided At': '',\n    });\n    stagingRows.push(row);\n  }\n\n  auditRows.push({\n    'Timestamp': now,\n    'Document Name': fileName,\n    'Document Modified': modifiedTime,\n    'Product Code': code || '(none)',\n    'Review ID': status ? reviewId : '',\n    'Change': change,\n    'Human Reviewed': human,\n    'Approved By': '',\n    'Decided At': '',\n  });\n\n  if (needsReview) {\n    const name = (f.product_name && (f.product_name.as_written || f.product_name.normalized)) || '(no name)';\n    const blocks = [];\n    blocks.push({ type: 'header', text: { type: 'plain_text', text: cut('Review: ' + name + ' (' + (code || 'no code') + ')', 150) } });\n    blocks.push({ type: 'section', text: { type: 'mrkdwn', text: cut('<' + fileLink + '|' + fileName + '>  ·  modified ' + modifiedTime + '  ·  ' + (isNew ? '*new product*' : '*existing product*') + '\\nReview ID `' + reviewId + '`', 2900) } });\n    blocks.push({ type: 'divider' });\n    const pageTxt = (k) => (pages[k] ? 'p.' + pages[k] : 'page n/a');\n    const confTxt = (k) => (typeof confidence[k] === 'number' ? 'conf ' + confidence[k].toFixed(2) : 'conf n/a');\n    const fmt = (raw, norm) => {\n      const r = cut(raw, 600), n = cut(norm, 600);\n      if (!r && !n) return '_(blank)_';\n      return r && n && clean(r) !== clean(n) ? r + '\\n→ ' + n : (r || n);\n    };\n    const shown = {};\n    // Editable box under each flagged field: press Enter to send the corrected value (block_id carries review + field).\n    const editCol = (k) => { if (k === 'product_code') return 'Product Code'; const l = FIELDS.find((x) => x[0] === k); return l ? normCol(l[1]) : null; };\n    const editBlock = (k, label) => {\n      const col = editCol(k);\n      if (!col) return null;\n      const cur = proposed[col];\n      const el = { type: 'plain_text_input', action_id: 'product_edit', dispatch_action_config: { trigger_actions_on: ['on_enter_pressed'] },\n        placeholder: { type: 'plain_text', text: 'Type the correct value, then press Enter' } };\n      if (cur !== undefined && cur !== null && String(cur) !== '') el.initial_value = cut(cur, 2900);\n      return { type: 'input', block_id: ('edit|' + reviewId + '|' + k).slice(0, 255), dispatch_action: true, optional: true,\n        label: { type: 'plain_text', text: cut('Correct ' + (k === 'price' ? 'price in USD' : label.toLowerCase()), 150) }, element: el };\n    };\n    for (const c of conflicts) {\n      shown[c.key] = true;\n      const u = uncertain.find((x) => x.key === c.key);\n      blocks.push({ type: 'section', fields: [\n        { type: 'mrkdwn', text: cut(':no_entry: *' + c.label + '* - conflict' + (u ? ' + uncertain' : '') + '\\n_Extracted_ (' + pageTxt(c.key) + ', ' + confTxt(c.key) + '):\\n' + fmt(c.proposed.as_written, c.proposed.normalized), 1990) },\n        { type: 'mrkdwn', text: cut('*Current in Products:*\\n' + fmt(c.current.as_written, c.current.normalized), 1990) },\n      ] });\n      const eb = editBlock(c.key, c.label); if (eb) blocks.push(eb);\n    }\n    for (const u of uncertain) {\n      if (shown[u.key]) continue;\n      shown[u.key] = true;\n      const lab = FIELDS.find((x) => x[0] === u.key);\n      const extracted = lab ? fmt(proposed[rawCol(lab[1])], proposed[normCol(lab[1])]) : fmt(code, '');\n      const cur = existing && lab ? fmt(existing[rawCol(lab[1])], existing[normCol(lab[1])]) : (existing ? fmt(existing['Product Code'], '') : '_(not in Products)_');\n      blocks.push({ type: 'section', fields: [\n        { type: 'mrkdwn', text: cut(':warning: *' + u.label + '* - uncertain (' + pageTxt(u.key) + ', ' + confTxt(u.key) + ')\\n_Why:_ ' + u.reason + '\\n_Extracted:_\\n' + extracted, 1990) },\n        { type: 'mrkdwn', text: cut('*Current in Products:*\\n' + cur, 1990) },\n      ] });\n      const eb = editBlock(u.key, u.label); if (eb) blocks.push(eb);\n      if (blocks.length > 44) break;\n    }\n    blocks.push({ type: 'context', elements: [{ type: 'mrkdwn', text: 'To correct a value: change it in the box under that field and press Enter (you will get a :white_check_mark: in the thread), then click Approve. Review ID `' + reviewId + '`' }] });\n    blocks.push({ type: 'actions', block_id: 'product_review', elements: [\n      { type: 'button', text: { type: 'plain_text', text: 'Approve' }, style: 'primary', action_id: 'product_approve', value: reviewId },\n      { type: 'button', text: { type: 'plain_text', text: 'Reject' }, style: 'danger', action_id: 'product_reject', value: reviewId },\n      { type: 'button', text: { type: 'plain_text', text: 'Open Staging' }, action_id: 'product_open_staging', url: stagingUrl },\n    ] });\n    reviewItems.push({\n      reviewId,\n      code,\n      text: 'Product review needed: ' + name + ' (' + (code || 'no code') + ') from ' + fileName,\n      blocks: JSON.stringify(blocks),\n    });\n  }\n\n}\n\nreturn {\n  stagingRow: stagingRows[0] || null,\n  hasStaging: stagingRows.length > 0,\n  review: reviewItems[0] || null,\n  hasReview: reviewItems.length > 0,\n  auditRow: auditRows[0],\n};\n"
              }
            ],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          },
          "enabled": true,
          "logging": {
            "input": {
              "logData": false,
              "message": null
            },
            "output": {
              "logData": false,
              "message": null
            }
          },
          "onFailElemId": "53D3B70E-C894-4BB9-BC41-65885F55B037",
          "resultAlias": "evalOne",
          "retryPolicy": null,
          "saveToVariable": null,
          "simulationResult": null,
          "slaConditions": [],
          "storeResult": true,
          "type": "CUSTOM_CLOUD_CODE"
        },
        "name": "Compare this product with Products",
        "nextElementIds": [
          "42AA42F3-708C-4306-B376-51BA8BCA8609"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "learningStatus": "OFF"
        },
        "type": "ACTION"
      },
      {
        "clientMetadata": {
          "elementId": "error-handler",
          "isFirstElement": false,
          "blockDefinitionId": "error-handler",
          "setResultToVariable": true,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "position": {
            "x": 2030,
            "y": 650
          }
        },
        "flowElementId": "4E261B28-693D-4AC8-8CE3-27FFE3740CEB",
        "groupId": "9C10598B-31F1-4E00-A0E1-00EA692433FF",
        "id": "53D3B70E-C894-4BB9-BC41-65885F55B037",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "eh_evalOne",
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "storeResult": true
        },
        "name": "Compare failed",
        "nextElementIds": [
          "AFD73CD5-2EA7-4752-B416-3169273A25B4"
        ],
        "nextGroupIds": [],
        "type": "ERROR_HANDLER"
      },
      {
        "clientMetadata": {
          "elementId": "condition",
          "isFirstElement": false,
          "blockDefinitionId": "condition",
          "position": {
            "x": 580,
            "y": 250
          }
        },
        "flowElementId": "91CBBB52-48A0-4142-9415-E46D3306C74E",
        "groupId": "9C10598B-31F1-4E00-A0E1-00EA692433FF",
        "id": "42AA42F3-708C-4306-B376-51BA8BCA8609",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "condition": {
            "conditionParts": [
              {
                "id": "b265645b-c502-4349-9df2-f81f8cd33c7e",
                "nestedOperation": null,
                "operation": "isTrue",
                "property": {
                  "expression": [
                    {
                      "id": "ELEMENT_RESULT",
                      "label": "evalOne",
                      "subPathSegments": [
                        {
                          "key": "hasStaging",
                          "optional": false
                        }
                      ],
                      "type": "ELEMENT_LINK",
                      "value": "F41B3611-EE3D-442B-9D16-8AC9F42A48ED"
                    }
                  ],
                  "mode": "EXPRESSION",
                  "parseJsonString": false,
                  "resultType": null
                },
                "propertyType": "BOOLEAN",
                "values": []
              }
            ],
            "grouping": [
              "b265645b-c502-4349-9df2-f81f8cd33c7e"
            ]
          },
          "elseComponent": {
            "componentId": "AD4441AC-97B0-4D2A-A953-3724B0502A0D",
            "componentType": "ELEMENT"
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "cStage",
          "storeResult": false,
          "thenComponent": {
            "componentId": "2E7C28E6-E812-406E-8073-722170DD0430",
            "componentType": "ELEMENT"
          }
        },
        "name": "Goes to Staging?",
        "nextElementIds": [
          "2E7C28E6-E812-406E-8073-722170DD0430",
          "AD4441AC-97B0-4D2A-A953-3724B0502A0D"
        ],
        "nextGroupIds": [],
        "serverFields": {
          "preferredDateFormats": []
        },
        "type": "CONDITION"
      },
      {
        "clientMetadata": {
          "elementId": "error-handler",
          "isFirstElement": false,
          "blockDefinitionId": "error-handler",
          "setResultToVariable": true,
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "position": {
            "x": 2030,
            "y": 830
          }
        },
        "flowElementId": "614010BC-0A98-4E28-965B-ADE4FBB233CE",
        "groupId": "9C10598B-31F1-4E00-A0E1-00EA692433FF",
        "id": "C5697CDD-32E6-4F5E-AB47-A233EAA6F88C",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "logging": null,
          "onFailElemId": null,
          "resultAlias": "eh_findP",
          "saveToVariable": {
            "dataBucket": "Default",
            "variable": "lastError"
          },
          "storeResult": true
        },
        "name": "Find in Products failed",
        "nextElementIds": [
          "AFD73CD5-2EA7-4752-B416-3169273A25B4"
        ],
        "nextGroupIds": [],
        "type": "ERROR_HANDLER"
      }
    ],
    "firstElementId": "80C2C2BE-6DFA-4C08-B7C6-D927539D561E",
    "groups": [
      {
        "clientMetadata": {
          "elementId": "triggers-group",
          "isFirstElement": true,
          "blockDefinitionId": "triggers-group",
          "viewport": {
            "x": 258.40730646206237,
            "y": 129.74587185112404,
            "zoom": 0.9944698320940752
          },
          "position": {
            "x": 171.5,
            "y": 567
          }
        },
        "flowElementId": "D4584266-6132-4F53-A5F4-08E4319A5D17",
        "groupId": null,
        "id": "80C2C2BE-6DFA-4C08-B7C6-D927539D561E",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "occurWithin": null,
          "occurrenceTimeUnit": null,
          "onFailElemId": null,
          "resultAlias": "trig",
          "storeResult": true,
          "transitionMode": "ONE_OCCUR"
        },
        "name": "New or updated file in Product Documents",
        "nextElementIds": [
          "8EE56168-20D5-4BE6-A43E-BA5F1A43B670"
        ],
        "nextGroupIds": [],
        "type": "TRIGGERS"
      },
      {
        "clientMetadata": {
          "elementId": "list-iterator",
          "isFirstElement": false,
          "blockDefinitionId": "list-iterator",
          "viewport": {
            "x": 0,
            "y": 0,
            "zoom": 0.8
          },
          "position": {
            "x": 9039,
            "y": 551
          }
        },
        "flowElementId": "471A4BAD-6086-4CD1-802E-7729287AC7C3",
        "groupId": null,
        "id": "9C10598B-31F1-4E00-A0E1-00EA692433FF",
        "loopType": "LIST_ITERATOR",
        "metaInfo": {
          "clientValidationState": {
            "errorMessage": null,
            "valid": true
          },
          "enabled": true,
          "firstElementId": "DB8E75A6-AEA7-4401-9D3C-0C5FE1CC310A",
          "list": {
            "expression": [
              {
                "id": "ELEMENT_RESULT",
                "label": "parse",
                "subPathSegments": [
                  {
                    "key": "items",
                    "optional": false
                  }
                ],
                "type": "ELEMENT_LINK",
                "value": "7B45CE3A-3387-426C-A400-E646B37A53AE"
              }
            ],
            "mode": "EXPRESSION",
            "parseJsonString": false,
            "resultType": null
          },
          "onFailElemId": null,
          "resultAlias": "loop2",
          "storeResult": true
        },
        "name": "For each product in the document",
        "nextElementIds": [
          "DA16DC79-FCE7-4877-8142-BE8B5D247B54"
        ],
        "nextGroupIds": [],
        "type": "LOOP"
      }
    ],
    "id": "8210BB20-4D0D-444D-8366-B5FEA73942FE",
    "metaInfo": {
      "clientValidationState": {
        "errorMessage": null,
        "valid": true
      },
      "errorMessage": null,
      "executionStaticData": [],
      "initialData": null,
      "initialDataDefaultValues": {},
      "ownerFlowVersionId": null,
      "schedule": null,
      "sharedMemory": {
        "anchor": {
          "missingAnchorPolicy": null,
          "path": null,
          "type": "FLOW_MEMORY"
        },
        "expirationInSec": null
      },
      "wasLive": true
    }
  },
  "slaCalendars": [],
  "slaGoals": [],
  "subFlows": [],
  "exportDate": "2026-10-13T08:29:04.775Z"
}