[{"data":1,"prerenderedAt":1795},["ShallowReactive",2],{"\u002Fdocs\u002Freference\u002Fnode-types":3,"docs-navigation":1720,"docs-surround:\u002Fdocs\u002Freference\u002Fnode-types":1792},{"id":4,"title":5,"body":6,"description":1711,"extension":1712,"meta":1713,"navigation":1714,"path":1715,"seo":1716,"stem":1718,"__hash__":1719},"docs\u002Fdocs\u002F4.reference\u002F2.node-types.md","Node Types",{"type":7,"value":8,"toc":1700},"minimark",[9,28,33,36,155,160,164,167,172,175,282,289,295,299,302,365,368,540,556,560,577,715,722,725,729,732,735,883,900,904,907,910,1067,1070,1099,1105,1109,1112,1115,1118,1141,1151,1162,1693,1696],[10,11,12,13,17,18,17,21,23,24,27],"p",{},"Gondo workflows use four node types: ",[14,15,16],"code",{},"trigger",", ",[14,19,20],{},"task",[14,22,14],{},", and ",[14,25,26],{},"human",".",[29,30,32],"h2",{"id":31},"shared-node-fields","Shared node fields",[10,34,35],{},"Most nodes share this shape:",[37,38,43],"pre",{"className":39,"code":40,"language":41,"meta":42,"style":42},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","id: example_node\ntype: task\ntitle: Example node\ngoal: One short sentence for people reading the graph.\nintegrations:\n  - finance_gmail\nconfig: {}\nui:\n  x: 0\n  y: 0\n","yaml","",[14,44,45,62,73,84,95,104,113,124,132,144],{"__ignoreMap":42},[46,47,50,54,58],"span",{"class":48,"line":49},"line",1,[46,51,53],{"class":52},"swJcz","id",[46,55,57],{"class":56},"sMK4o",":",[46,59,61],{"class":60},"sfazB"," example_node\n",[46,63,65,68,70],{"class":48,"line":64},2,[46,66,67],{"class":52},"type",[46,69,57],{"class":56},[46,71,72],{"class":60}," task\n",[46,74,76,79,81],{"class":48,"line":75},3,[46,77,78],{"class":52},"title",[46,80,57],{"class":56},[46,82,83],{"class":60}," Example node\n",[46,85,87,90,92],{"class":48,"line":86},4,[46,88,89],{"class":52},"goal",[46,91,57],{"class":56},[46,93,94],{"class":60}," One short sentence for people reading the graph.\n",[46,96,98,101],{"class":48,"line":97},5,[46,99,100],{"class":52},"integrations",[46,102,103],{"class":56},":\n",[46,105,107,110],{"class":48,"line":106},6,[46,108,109],{"class":56},"  -",[46,111,112],{"class":60}," finance_gmail\n",[46,114,116,119,121],{"class":48,"line":115},7,[46,117,118],{"class":52},"config",[46,120,57],{"class":56},[46,122,123],{"class":56}," {}\n",[46,125,127,130],{"class":48,"line":126},8,[46,128,129],{"class":52},"ui",[46,131,103],{"class":56},[46,133,135,138,140],{"class":48,"line":134},9,[46,136,137],{"class":52},"  x",[46,139,57],{"class":56},[46,141,143],{"class":142},"sbssI"," 0\n",[46,145,147,151,153],{"class":48,"line":146},10,[46,148,150],{"class":149},"sfNiH","  y",[46,152,57],{"class":56},[46,154,143],{"class":142},[10,156,157,159],{},[14,158,100],{}," lists the integration reference IDs the node is allowed to use.",[29,161,163],{"id":162},"trigger-nodes","Trigger nodes",[10,165,166],{},"Every published workflow has exactly one trigger: Manual, Auto, or Webhook. The trigger stays in the graph and its data schema describes the workflow inputs.",[168,169,171],"h3",{"id":170},"manual-trigger","Manual trigger",[10,173,174],{},"Use a Manual trigger when the job runs only when explicitly requested.",[37,176,178],{"className":39,"code":177,"language":41,"meta":42,"style":42},"type: trigger\ntitle: Run\nconfig:\n  kind: manual\n  name: review-invoices\n  dataSchema:\n    type: object\n    properties:\n      folderId:\n        type: string\n    required: [folderId]\n",[14,179,180,189,198,204,214,224,231,241,248,255,265],{"__ignoreMap":42},[46,181,182,184,186],{"class":48,"line":49},[46,183,67],{"class":52},[46,185,57],{"class":56},[46,187,188],{"class":60}," trigger\n",[46,190,191,193,195],{"class":48,"line":64},[46,192,78],{"class":52},[46,194,57],{"class":56},[46,196,197],{"class":60}," Run\n",[46,199,200,202],{"class":48,"line":75},[46,201,118],{"class":52},[46,203,103],{"class":56},[46,205,206,209,211],{"class":48,"line":86},[46,207,208],{"class":52},"  kind",[46,210,57],{"class":56},[46,212,213],{"class":60}," manual\n",[46,215,216,219,221],{"class":48,"line":97},[46,217,218],{"class":52},"  name",[46,220,57],{"class":56},[46,222,223],{"class":60}," review-invoices\n",[46,225,226,229],{"class":48,"line":106},[46,227,228],{"class":52},"  dataSchema",[46,230,103],{"class":56},[46,232,233,236,238],{"class":48,"line":115},[46,234,235],{"class":52},"    type",[46,237,57],{"class":56},[46,239,240],{"class":60}," object\n",[46,242,243,246],{"class":48,"line":126},[46,244,245],{"class":52},"    properties",[46,247,103],{"class":56},[46,249,250,253],{"class":48,"line":134},[46,251,252],{"class":52},"      folderId",[46,254,103],{"class":56},[46,256,257,260,262],{"class":48,"line":146},[46,258,259],{"class":52},"        type",[46,261,57],{"class":56},[46,263,264],{"class":60}," string\n",[46,266,268,271,273,276,279],{"class":48,"line":267},11,[46,269,270],{"class":52},"    required",[46,272,57],{"class":56},[46,274,275],{"class":56}," [",[46,277,278],{"class":60},"folderId",[46,280,281],{"class":56},"]\n",[10,283,284,285,288],{},"The ",[14,286,287],{},"config.name"," field above names the manual trigger, not the workflow itself.",[10,290,291,292,27],{},"The trigger output is available downstream as ",[14,293,294],{},"ctx.data.\u003CtriggerNodeId>",[168,296,298],{"id":297},"auto-trigger","Auto trigger",[10,300,301],{},"Use an auto trigger when the workflow should run on a schedule.",[37,303,305],{"className":39,"code":304,"language":41,"meta":42,"style":42},"type: trigger\ntitle: Weekday check\nconfig:\n  kind: auto\n  cron: '0 9 * * 1-5'\n  timezone: Europe\u002FLondon\n",[14,306,307,315,324,330,339,355],{"__ignoreMap":42},[46,308,309,311,313],{"class":48,"line":49},[46,310,67],{"class":52},[46,312,57],{"class":56},[46,314,188],{"class":60},[46,316,317,319,321],{"class":48,"line":64},[46,318,78],{"class":52},[46,320,57],{"class":56},[46,322,323],{"class":60}," Weekday check\n",[46,325,326,328],{"class":48,"line":75},[46,327,118],{"class":52},[46,329,103],{"class":56},[46,331,332,334,336],{"class":48,"line":86},[46,333,208],{"class":52},[46,335,57],{"class":56},[46,337,338],{"class":60}," auto\n",[46,340,341,344,346,349,352],{"class":48,"line":97},[46,342,343],{"class":52},"  cron",[46,345,57],{"class":56},[46,347,348],{"class":56}," '",[46,350,351],{"class":60},"0 9 * * 1-5",[46,353,354],{"class":56},"'\n",[46,356,357,360,362],{"class":48,"line":106},[46,358,359],{"class":52},"  timezone",[46,361,57],{"class":56},[46,363,364],{"class":60}," Europe\u002FLondon\n",[10,366,367],{},"An auto trigger can also run code before starting workflow runs.",[37,369,371],{"className":39,"code":370,"language":41,"meta":42,"style":42},"type: trigger\ntitle: New Gmail messages\nintegrations:\n  - finance_gmail\nconfig:\n  kind: auto\n  cron: '*\u002F15 * * * *'\n  code: |\n    const gmail = getIntegration('finance_gmail')\n    const messages = await (await gmail.get('\u002Fmessages?q=invoice')).json()\n\n    for (const message of messages.messages ?? []) {\n      if (await store.get(`seen.gmail.${message.id}`)) continue\n      await triggerWorkflow({ messageId: message.id })\n      await store.set(`seen.gmail.${message.id}`, true)\n    }\n  dataSchema:\n    type: object\n    required: [messageId]\n    properties:\n      messageId:\n        type: string\n",[14,372,373,381,390,396,402,408,416,429,440,445,450,456,462,468,474,480,486,493,502,516,523,531],{"__ignoreMap":42},[46,374,375,377,379],{"class":48,"line":49},[46,376,67],{"class":52},[46,378,57],{"class":56},[46,380,188],{"class":60},[46,382,383,385,387],{"class":48,"line":64},[46,384,78],{"class":52},[46,386,57],{"class":56},[46,388,389],{"class":60}," New Gmail messages\n",[46,391,392,394],{"class":48,"line":75},[46,393,100],{"class":52},[46,395,103],{"class":56},[46,397,398,400],{"class":48,"line":86},[46,399,109],{"class":56},[46,401,112],{"class":60},[46,403,404,406],{"class":48,"line":97},[46,405,118],{"class":52},[46,407,103],{"class":56},[46,409,410,412,414],{"class":48,"line":106},[46,411,208],{"class":52},[46,413,57],{"class":56},[46,415,338],{"class":60},[46,417,418,420,422,424,427],{"class":48,"line":115},[46,419,343],{"class":52},[46,421,57],{"class":56},[46,423,348],{"class":56},[46,425,426],{"class":60},"*\u002F15 * * * *",[46,428,354],{"class":56},[46,430,431,434,436],{"class":48,"line":126},[46,432,433],{"class":52},"  code",[46,435,57],{"class":56},[46,437,439],{"class":438},"s7zQu"," |\n",[46,441,442],{"class":48,"line":134},[46,443,444],{"class":60},"    const gmail = getIntegration('finance_gmail')\n",[46,446,447],{"class":48,"line":146},[46,448,449],{"class":60},"    const messages = await (await gmail.get('\u002Fmessages?q=invoice')).json()\n",[46,451,452],{"class":48,"line":267},[46,453,455],{"emptyLinePlaceholder":454},true,"\n",[46,457,459],{"class":48,"line":458},12,[46,460,461],{"class":60},"    for (const message of messages.messages ?? []) {\n",[46,463,465],{"class":48,"line":464},13,[46,466,467],{"class":60},"      if (await store.get(`seen.gmail.${message.id}`)) continue\n",[46,469,471],{"class":48,"line":470},14,[46,472,473],{"class":60},"      await triggerWorkflow({ messageId: message.id })\n",[46,475,477],{"class":48,"line":476},15,[46,478,479],{"class":60},"      await store.set(`seen.gmail.${message.id}`, true)\n",[46,481,483],{"class":48,"line":482},16,[46,484,485],{"class":60},"    }\n",[46,487,489,491],{"class":48,"line":488},17,[46,490,228],{"class":52},[46,492,103],{"class":56},[46,494,496,498,500],{"class":48,"line":495},18,[46,497,235],{"class":52},[46,499,57],{"class":56},[46,501,240],{"class":60},[46,503,505,507,509,511,514],{"class":48,"line":504},19,[46,506,270],{"class":52},[46,508,57],{"class":56},[46,510,275],{"class":56},[46,512,513],{"class":60},"messageId",[46,515,281],{"class":56},[46,517,519,521],{"class":48,"line":518},20,[46,520,245],{"class":52},[46,522,103],{"class":56},[46,524,526,529],{"class":48,"line":525},21,[46,527,528],{"class":52},"      messageId",[46,530,103],{"class":56},[46,532,534,536,538],{"class":48,"line":533},22,[46,535,259],{"class":52},[46,537,57],{"class":56},[46,539,264],{"class":60},[10,541,542,543,17,546,17,549,23,552,555],{},"Auto trigger code can use ",[14,544,545],{},"store.get",[14,547,548],{},"store.set",[14,550,551],{},"store.delete",[14,553,554],{},"triggerWorkflow(data)",". The runtime does not suppress identical inputs. Use stored markers, as above, or a provider’s incremental cursor to choose new work. Save the cursor returned by the provider after requesting the runs for that page; do not substitute the current time, which could skip items. Follow the provider’s pagination contract when processing longer lists.",[168,557,559],{"id":558},"webhook-trigger","Webhook trigger",[10,561,562,563,565,566,569,570,572,573,576],{},"A webhook starts when an external service sends an authenticated JSON request. Configure the endpoint and secret header in Studio; credentials are not part of YAML. Required ",[14,564,14],{}," reads ",[14,567,568],{},"ctx.event.body",", filters events, and calls ",[14,571,554],{}," zero, one, or several times. Its ",[14,574,575],{},"dataSchema"," describes the resulting workflow inputs, not the provider event envelope.",[37,578,580],{"className":39,"code":579,"language":41,"meta":42,"style":42},"type: trigger\ntitle: Successful payment\nconfig:\n  kind: webhook\n  code: |\n    const event = ctx.event.body\n    if (event.type !== 'payment.succeeded') return\n    if (typeof event.id !== 'string' || !event.id) throw new Error('Missing payment event ID')\n    const key = `payment.${event.id}`\n    if (await store.get(key)) return\n    await triggerWorkflow({ invoiceId: event.data.invoiceId })\n    await store.set(key, true)\n  dataSchema:\n    type: object\n    required: [invoiceId]\n    properties:\n      invoiceId:\n        type: string\n    additionalProperties: false\n",[14,581,582,590,599,605,614,622,627,632,637,642,647,652,657,663,671,684,690,697,705],{"__ignoreMap":42},[46,583,584,586,588],{"class":48,"line":49},[46,585,67],{"class":52},[46,587,57],{"class":56},[46,589,188],{"class":60},[46,591,592,594,596],{"class":48,"line":64},[46,593,78],{"class":52},[46,595,57],{"class":56},[46,597,598],{"class":60}," Successful payment\n",[46,600,601,603],{"class":48,"line":75},[46,602,118],{"class":52},[46,604,103],{"class":56},[46,606,607,609,611],{"class":48,"line":86},[46,608,208],{"class":52},[46,610,57],{"class":56},[46,612,613],{"class":60}," webhook\n",[46,615,616,618,620],{"class":48,"line":97},[46,617,433],{"class":52},[46,619,57],{"class":56},[46,621,439],{"class":438},[46,623,624],{"class":48,"line":106},[46,625,626],{"class":60},"    const event = ctx.event.body\n",[46,628,629],{"class":48,"line":115},[46,630,631],{"class":60},"    if (event.type !== 'payment.succeeded') return\n",[46,633,634],{"class":48,"line":126},[46,635,636],{"class":60},"    if (typeof event.id !== 'string' || !event.id) throw new Error('Missing payment event ID')\n",[46,638,639],{"class":48,"line":134},[46,640,641],{"class":60},"    const key = `payment.${event.id}`\n",[46,643,644],{"class":48,"line":146},[46,645,646],{"class":60},"    if (await store.get(key)) return\n",[46,648,649],{"class":48,"line":267},[46,650,651],{"class":60},"    await triggerWorkflow({ invoiceId: event.data.invoiceId })\n",[46,653,654],{"class":48,"line":458},[46,655,656],{"class":60},"    await store.set(key, true)\n",[46,658,659,661],{"class":48,"line":464},[46,660,228],{"class":52},[46,662,103],{"class":56},[46,664,665,667,669],{"class":48,"line":470},[46,666,235],{"class":52},[46,668,57],{"class":56},[46,670,240],{"class":60},[46,672,673,675,677,679,682],{"class":48,"line":476},[46,674,270],{"class":52},[46,676,57],{"class":56},[46,678,275],{"class":56},[46,680,681],{"class":60},"invoiceId",[46,683,281],{"class":56},[46,685,686,688],{"class":48,"line":482},[46,687,245],{"class":52},[46,689,103],{"class":56},[46,691,692,695],{"class":48,"line":488},[46,693,694],{"class":52},"      invoiceId",[46,696,103],{"class":56},[46,698,699,701,703],{"class":48,"line":495},[46,700,259],{"class":52},[46,702,57],{"class":56},[46,704,264],{"class":60},[46,706,707,710,712],{"class":48,"line":504},[46,708,709],{"class":52},"    additionalProperties",[46,711,57],{"class":56},[46,713,714],{"class":149}," false\n",[10,716,717,718,721],{},"Duplicate handling is ordinary code: the example uses the sender’s event ID as a store key. There is no event-ID selector or automatic payload deduplication. To forward the body unchanged, write ",[14,719,720],{},"await triggerWorkflow(ctx.event.body)",". Zero calls ignore the event. Webhook code uses the same workspace helpers and limits as Auto. After successful code execution, the runtime creates all requested runs, then saves store changes. A failure between those steps can cause repeats on retry. Sample events in Studio immediately start real runs and update the same workflow store; use a fresh sample ID when you want another run.",[10,723,724],{},"Employees can explicitly run their own published jobs through any trigger kind. They supply the trigger's expected inputs directly; Auto discovery code and Webhook mapping code are bypassed. Do not add a second Manual trigger. Preserve trigger IDs when changing kinds, since downstream references depend on them.",[29,726,728],{"id":727},"task-nodes","Task nodes",[10,730,731],{},"A task node is an AI reasoning step.",[10,733,734],{},"Use it when the workflow needs judgement, classification, drafting, document reading, messy data handling, or adaptable browser work.",[37,736,738],{"className":39,"code":737,"language":41,"meta":42,"style":42},"type: task\ntitle: Classify invoice\ngoal: Decide whether the invoice needs review.\nintegrations:\n  - finance_gmail\nconfig:\n  instruction: |-\n    Read the invoice email identified by ctx.data.new_email.messageId.\n    Return whether it needs human review.\n    If the amount is missing, set needsReview to true and explain why.\n  dataSchema:\n    type: object\n    required: [needsReview, reason]\n    properties:\n      needsReview:\n        type: boolean\n      reason:\n        type: string\n",[14,739,740,748,757,766,772,778,784,798,803,808,813,819,827,846,852,859,868,875],{"__ignoreMap":42},[46,741,742,744,746],{"class":48,"line":49},[46,743,67],{"class":52},[46,745,57],{"class":56},[46,747,72],{"class":60},[46,749,750,752,754],{"class":48,"line":64},[46,751,78],{"class":52},[46,753,57],{"class":56},[46,755,756],{"class":60}," Classify invoice\n",[46,758,759,761,763],{"class":48,"line":75},[46,760,89],{"class":52},[46,762,57],{"class":56},[46,764,765],{"class":60}," Decide whether the invoice needs review.\n",[46,767,768,770],{"class":48,"line":86},[46,769,100],{"class":52},[46,771,103],{"class":56},[46,773,774,776],{"class":48,"line":97},[46,775,109],{"class":56},[46,777,112],{"class":60},[46,779,780,782],{"class":48,"line":106},[46,781,118],{"class":52},[46,783,103],{"class":56},[46,785,786,789,791,794],{"class":48,"line":115},[46,787,788],{"class":52},"  instruction",[46,790,57],{"class":56},[46,792,793],{"class":438}," |",[46,795,797],{"class":796},"spNyl","-\n",[46,799,800],{"class":48,"line":126},[46,801,802],{"class":60},"    Read the invoice email identified by ctx.data.new_email.messageId.\n",[46,804,805],{"class":48,"line":134},[46,806,807],{"class":60},"    Return whether it needs human review.\n",[46,809,810],{"class":48,"line":146},[46,811,812],{"class":60},"    If the amount is missing, set needsReview to true and explain why.\n",[46,814,815,817],{"class":48,"line":267},[46,816,228],{"class":52},[46,818,103],{"class":56},[46,820,821,823,825],{"class":48,"line":458},[46,822,235],{"class":52},[46,824,57],{"class":56},[46,826,240],{"class":60},[46,828,829,831,833,835,838,841,844],{"class":48,"line":464},[46,830,270],{"class":52},[46,832,57],{"class":56},[46,834,275],{"class":56},[46,836,837],{"class":60},"needsReview",[46,839,840],{"class":56},",",[46,842,843],{"class":60}," reason",[46,845,281],{"class":56},[46,847,848,850],{"class":48,"line":470},[46,849,245],{"class":52},[46,851,103],{"class":56},[46,853,854,857],{"class":48,"line":476},[46,855,856],{"class":52},"      needsReview",[46,858,103],{"class":56},[46,860,861,863,865],{"class":48,"line":482},[46,862,259],{"class":52},[46,864,57],{"class":56},[46,866,867],{"class":60}," boolean\n",[46,869,870,873],{"class":48,"line":488},[46,871,872],{"class":52},"      reason",[46,874,103],{"class":56},[46,876,877,879,881],{"class":48,"line":495},[46,878,259],{"class":52},[46,880,57],{"class":56},[46,882,264],{"class":60},[10,884,885,886,888,889,17,892,895,896,899],{},"The task node returns structured data matching ",[14,887,575],{},". Request fields needed for downstream decisions, edits or saved business outputs. Do not add catch-all ",[14,890,891],{},"notes",[14,893,894],{},"issues"," or ",[14,897,898],{},"reviewIssues"," fields by default; represent missing values explicitly for the relevant field or branch.",[29,901,903],{"id":902},"code-nodes","Code nodes",[10,905,906],{},"A code node runs deterministic JavaScript.",[10,908,909],{},"Use it for API calls, structured writes, file movement in the workflow workspace, or transformations where the input shape is already clear.",[37,911,913],{"className":39,"code":912,"language":41,"meta":42,"style":42},"type: code\ntitle: Add row to sheet\ngoal: Write approved invoice data to the finance sheet.\nintegrations:\n  - finance_sheets\nconfig:\n  code: |\n    const sheets = getIntegration('finance_sheets')\n    const invoice = ctx.data.classify_invoice\n    const response = await sheets.post('\u002Fvalues\u002FA1:append', {\n      values: [[invoice.supplierName, invoice.amount]]\n    })\n    const result = await response.json()\n    return { updatedRange: result.updates?.updatedRange ?? null }\n  dataSchema:\n    type: object\n    required: [updatedRange]\n    properties:\n      updatedRange:\n        type: [string, 'null']\n",[14,914,915,924,933,942,948,955,961,969,974,979,984,989,994,999,1004,1010,1018,1031,1037,1044],{"__ignoreMap":42},[46,916,917,919,921],{"class":48,"line":49},[46,918,67],{"class":52},[46,920,57],{"class":56},[46,922,923],{"class":60}," code\n",[46,925,926,928,930],{"class":48,"line":64},[46,927,78],{"class":52},[46,929,57],{"class":56},[46,931,932],{"class":60}," Add row to sheet\n",[46,934,935,937,939],{"class":48,"line":75},[46,936,89],{"class":52},[46,938,57],{"class":56},[46,940,941],{"class":60}," Write approved invoice data to the finance sheet.\n",[46,943,944,946],{"class":48,"line":86},[46,945,100],{"class":52},[46,947,103],{"class":56},[46,949,950,952],{"class":48,"line":97},[46,951,109],{"class":56},[46,953,954],{"class":60}," finance_sheets\n",[46,956,957,959],{"class":48,"line":106},[46,958,118],{"class":52},[46,960,103],{"class":56},[46,962,963,965,967],{"class":48,"line":115},[46,964,433],{"class":52},[46,966,57],{"class":56},[46,968,439],{"class":438},[46,970,971],{"class":48,"line":126},[46,972,973],{"class":60},"    const sheets = getIntegration('finance_sheets')\n",[46,975,976],{"class":48,"line":134},[46,977,978],{"class":60},"    const invoice = ctx.data.classify_invoice\n",[46,980,981],{"class":48,"line":146},[46,982,983],{"class":60},"    const response = await sheets.post('\u002Fvalues\u002FA1:append', {\n",[46,985,986],{"class":48,"line":267},[46,987,988],{"class":60},"      values: [[invoice.supplierName, invoice.amount]]\n",[46,990,991],{"class":48,"line":458},[46,992,993],{"class":60},"    })\n",[46,995,996],{"class":48,"line":464},[46,997,998],{"class":60},"    const result = await response.json()\n",[46,1000,1001],{"class":48,"line":470},[46,1002,1003],{"class":60},"    return { updatedRange: result.updates?.updatedRange ?? null }\n",[46,1005,1006,1008],{"class":48,"line":476},[46,1007,228],{"class":52},[46,1009,103],{"class":56},[46,1011,1012,1014,1016],{"class":48,"line":482},[46,1013,235],{"class":52},[46,1015,57],{"class":56},[46,1017,240],{"class":60},[46,1019,1020,1022,1024,1026,1029],{"class":48,"line":488},[46,1021,270],{"class":52},[46,1023,57],{"class":56},[46,1025,275],{"class":56},[46,1027,1028],{"class":60},"updatedRange",[46,1030,281],{"class":56},[46,1032,1033,1035],{"class":48,"line":495},[46,1034,245],{"class":52},[46,1036,103],{"class":56},[46,1038,1039,1042],{"class":48,"line":504},[46,1040,1041],{"class":52},"      updatedRange",[46,1043,103],{"class":56},[46,1045,1046,1048,1050,1052,1055,1057,1059,1062,1065],{"class":48,"line":518},[46,1047,259],{"class":52},[46,1049,57],{"class":56},[46,1051,275],{"class":56},[46,1053,1054],{"class":60},"string",[46,1056,840],{"class":56},[46,1058,348],{"class":56},[46,1060,1061],{"class":60},"null",[46,1063,1064],{"class":56},"'",[46,1066,281],{"class":56},[10,1068,1069],{},"Code nodes can use:",[1071,1072,1073,1079,1084,1089,1094],"ul",{},[1074,1075,1076],"li",{},[14,1077,1078],{},"ctx.data",[1074,1080,1081],{},[14,1082,1083],{},"ctx.run",[1074,1085,1086],{},[14,1087,1088],{},"ctx.vars",[1074,1090,1091],{},[14,1092,1093],{},"getIntegration('\u003CreferenceId>')",[1074,1095,1096],{},[14,1097,1098],{},"log(...)",[10,1100,1101,1102,27],{},"External provider calls must go through ",[14,1103,1104],{},"getIntegration()",[29,1106,1108],{"id":1107},"human-nodes","Human nodes",[10,1110,1111],{},"A human node prepares a review, then either pauses for a person or completes automatically.",[10,1113,1114],{},"Use it when a person should review, approve, edit, or provide information.",[10,1116,1117],{},"Design the screen around the specific decision, correction or approval required. Include only information and controls that support that action. Do not add generic AI-generated notes, issues, risks or \"requires attention\" sections by default. Handle missing information beside the relevant field or through an explicit workflow branch. Add free-text input only when the process has a defined use for it, such as a rejection reason shown when rejecting. Keep build caveats and environment setup details in the authoring handoff.",[10,1119,1120,1121,1124,1125,1128,1129,1132,1133,1136,1137,1140],{},"Every newly authored human node requires a ",[14,1122,1123],{},"config.prepare"," JavaScript body. Return ",[14,1126,1127],{},"{ review: { state, assigneeIds } }"," to pause, or ",[14,1130,1131],{},"{ complete: output }"," to finish automatically. An empty ",[14,1134,1135],{},"assigneeIds"," list leaves the review with account admins\u002Fmembers. Select specific reviewers from backend ",[14,1138,1139],{},"ctx.users","; any listed reviewer may respond.",[10,1142,1143,1144,1147,1148,27],{},"Human node UI is stored as a Vue single-file component in ",[14,1145,1146],{},"config.component",". When completed, its final state becomes ",[14,1149,1150],{},"ctx.data.\u003CnodeId>",[10,1152,1153,1154,1157,1158,1161],{},"This example assumes ",[14,1155,1156],{},"extract_invoice"," supplies the invoice details and a purchase order number, which this process requires before approval. The approval branch saves the confirmed purchase order; the rejection branch uses ",[14,1159,1160],{},"rejectionReason"," to request a corrected invoice. The reason input appears only after the reviewer chooses rejection.",[37,1163,1165],{"className":39,"code":1164,"language":41,"meta":42,"style":42},"type: human\ntitle: Review invoice\ngoal: Confirm the purchase order or request a corrected invoice.\nconfig:\n  prepare: |\n    return { review: { state: { purchaseOrderNumber: ctx.data.extract_invoice.purchaseOrderNumber ?? '', decision: 'pending', rejectionReason: '' }, assigneeIds: [] } }\n  dataSchema:\n    type: object\n    required: [purchaseOrderNumber, decision, rejectionReason]\n    properties:\n      purchaseOrderNumber:\n        type: string\n      decision:\n        type: string\n        enum: [pending, approved, rejected]\n      rejectionReason:\n        type: string\n  component: |\n    \u003Ctemplate>\n      \u003Csection>\n        \u003Ch2>Review invoice {{ ctx.data.extract_invoice?.invoiceNumber }}\u003C\u002Fh2>\n        \u003Cp>{{ ctx.data.extract_invoice?.supplierName }} · {{ ctx.data.extract_invoice?.amount }} {{ ctx.data.extract_invoice?.currency }}\u003C\u002Fp>\n        \u003Cdiv v-if=\"readOnly\">\n          \u003Cp>Decision: {{ state.decision }}\u003C\u002Fp>\n          \u003Cp v-if=\"state.decision === 'approved'\">Purchase order: {{ state.purchaseOrderNumber }}\u003C\u002Fp>\n          \u003Cp v-else>{{ state.rejectionReason }}\u003C\u002Fp>\n        \u003C\u002Fdiv>\n        \u003Cdiv v-else-if=\"rejecting\">\n          \u003Clabel>\n            What must the supplier correct?\n            \u003Ctextarea v-model=\"rejectionReason\" \u002F>\n          \u003C\u002Flabel>\n          \u003Cbutton type=\"button\" :disabled=\"!rejectionReason.trim()\" @click=\"reject\">Request corrected invoice\u003C\u002Fbutton>\n          \u003Cbutton type=\"button\" @click=\"rejecting = false\">Back\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n        \u003Cdiv v-else>\n          \u003Clabel>\n            Purchase order number\n            \u003Cinput v-model=\"purchaseOrderNumber\">\n          \u003C\u002Flabel>\n          \u003Cbutton type=\"button\" :disabled=\"!purchaseOrderNumber.trim()\" @click=\"approve\">Approve invoice\u003C\u002Fbutton>\n          \u003Cbutton type=\"button\" @click=\"rejecting = true\">Reject invoice\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fsection>\n    \u003C\u002Ftemplate>\n\n    \u003Cscript setup>\n    import { ref } from 'vue'\n\n    const { state, ctx, readOnly, submitAction } = defineProps({\n      state: { type: Object, required: true },\n      ctx: { type: Object, required: true },\n      readOnly: { type: Boolean, default: false },\n      submitAction: { type: Function, required: true },\n    })\n    const purchaseOrderNumber = ref(state.purchaseOrderNumber ?? '')\n    const rejectionReason = ref('')\n    const rejecting = ref(false)\n\n    function approve() {\n      submitAction('approve', { purchaseOrderNumber: purchaseOrderNumber.value })\n    }\n\n    function reject() {\n      submitAction('reject', { rejectionReason: rejectionReason.value })\n    }\n    \u003C\u002Fscript>\n\n    \u003Cscript backend>\n    export async function approve(state, inputs) {\n      const purchaseOrderNumber = String(inputs.purchaseOrderNumber ?? '').trim()\n      if (!purchaseOrderNumber) throw new Error('Enter the purchase order number')\n      return { ...state, purchaseOrderNumber, decision: 'approved', rejectionReason: '', done: true }\n    }\n\n    export async function reject(state, inputs) {\n      const rejectionReason = String(inputs.rejectionReason ?? '').trim()\n      if (!rejectionReason) throw new Error('Describe the correction needed')\n      return { ...state, decision: 'rejected', rejectionReason, done: true }\n    }\n    \u003C\u002Fscript>\n",[14,1166,1167,1176,1185,1194,1200,1209,1214,1220,1228,1251,1257,1264,1272,1279,1287,1311,1318,1326,1335,1340,1345,1350,1355,1361,1367,1373,1379,1385,1391,1397,1403,1409,1415,1421,1427,1432,1438,1443,1449,1455,1460,1466,1472,1477,1483,1489,1494,1500,1506,1511,1517,1523,1529,1535,1541,1546,1552,1558,1564,1569,1575,1581,1586,1591,1597,1603,1608,1614,1619,1625,1631,1637,1643,1649,1654,1659,1665,1671,1677,1683,1688],{"__ignoreMap":42},[46,1168,1169,1171,1173],{"class":48,"line":49},[46,1170,67],{"class":52},[46,1172,57],{"class":56},[46,1174,1175],{"class":60}," human\n",[46,1177,1178,1180,1182],{"class":48,"line":64},[46,1179,78],{"class":52},[46,1181,57],{"class":56},[46,1183,1184],{"class":60}," Review invoice\n",[46,1186,1187,1189,1191],{"class":48,"line":75},[46,1188,89],{"class":52},[46,1190,57],{"class":56},[46,1192,1193],{"class":60}," Confirm the purchase order or request a corrected invoice.\n",[46,1195,1196,1198],{"class":48,"line":86},[46,1197,118],{"class":52},[46,1199,103],{"class":56},[46,1201,1202,1205,1207],{"class":48,"line":97},[46,1203,1204],{"class":52},"  prepare",[46,1206,57],{"class":56},[46,1208,439],{"class":438},[46,1210,1211],{"class":48,"line":106},[46,1212,1213],{"class":60},"    return { review: { state: { purchaseOrderNumber: ctx.data.extract_invoice.purchaseOrderNumber ?? '', decision: 'pending', rejectionReason: '' }, assigneeIds: [] } }\n",[46,1215,1216,1218],{"class":48,"line":115},[46,1217,228],{"class":52},[46,1219,103],{"class":56},[46,1221,1222,1224,1226],{"class":48,"line":126},[46,1223,235],{"class":52},[46,1225,57],{"class":56},[46,1227,240],{"class":60},[46,1229,1230,1232,1234,1236,1239,1241,1244,1246,1249],{"class":48,"line":134},[46,1231,270],{"class":52},[46,1233,57],{"class":56},[46,1235,275],{"class":56},[46,1237,1238],{"class":60},"purchaseOrderNumber",[46,1240,840],{"class":56},[46,1242,1243],{"class":60}," decision",[46,1245,840],{"class":56},[46,1247,1248],{"class":60}," rejectionReason",[46,1250,281],{"class":56},[46,1252,1253,1255],{"class":48,"line":146},[46,1254,245],{"class":52},[46,1256,103],{"class":56},[46,1258,1259,1262],{"class":48,"line":267},[46,1260,1261],{"class":52},"      purchaseOrderNumber",[46,1263,103],{"class":56},[46,1265,1266,1268,1270],{"class":48,"line":458},[46,1267,259],{"class":52},[46,1269,57],{"class":56},[46,1271,264],{"class":60},[46,1273,1274,1277],{"class":48,"line":464},[46,1275,1276],{"class":52},"      decision",[46,1278,103],{"class":56},[46,1280,1281,1283,1285],{"class":48,"line":470},[46,1282,259],{"class":52},[46,1284,57],{"class":56},[46,1286,264],{"class":60},[46,1288,1289,1292,1294,1296,1299,1301,1304,1306,1309],{"class":48,"line":476},[46,1290,1291],{"class":52},"        enum",[46,1293,57],{"class":56},[46,1295,275],{"class":56},[46,1297,1298],{"class":60},"pending",[46,1300,840],{"class":56},[46,1302,1303],{"class":60}," approved",[46,1305,840],{"class":56},[46,1307,1308],{"class":60}," rejected",[46,1310,281],{"class":56},[46,1312,1313,1316],{"class":48,"line":482},[46,1314,1315],{"class":52},"      rejectionReason",[46,1317,103],{"class":56},[46,1319,1320,1322,1324],{"class":48,"line":488},[46,1321,259],{"class":52},[46,1323,57],{"class":56},[46,1325,264],{"class":60},[46,1327,1328,1331,1333],{"class":48,"line":495},[46,1329,1330],{"class":52},"  component",[46,1332,57],{"class":56},[46,1334,439],{"class":438},[46,1336,1337],{"class":48,"line":504},[46,1338,1339],{"class":60},"    \u003Ctemplate>\n",[46,1341,1342],{"class":48,"line":518},[46,1343,1344],{"class":60},"      \u003Csection>\n",[46,1346,1347],{"class":48,"line":525},[46,1348,1349],{"class":60},"        \u003Ch2>Review invoice {{ ctx.data.extract_invoice?.invoiceNumber }}\u003C\u002Fh2>\n",[46,1351,1352],{"class":48,"line":533},[46,1353,1354],{"class":60},"        \u003Cp>{{ ctx.data.extract_invoice?.supplierName }} · {{ ctx.data.extract_invoice?.amount }} {{ ctx.data.extract_invoice?.currency }}\u003C\u002Fp>\n",[46,1356,1358],{"class":48,"line":1357},23,[46,1359,1360],{"class":60},"        \u003Cdiv v-if=\"readOnly\">\n",[46,1362,1364],{"class":48,"line":1363},24,[46,1365,1366],{"class":60},"          \u003Cp>Decision: {{ state.decision }}\u003C\u002Fp>\n",[46,1368,1370],{"class":48,"line":1369},25,[46,1371,1372],{"class":60},"          \u003Cp v-if=\"state.decision === 'approved'\">Purchase order: {{ state.purchaseOrderNumber }}\u003C\u002Fp>\n",[46,1374,1376],{"class":48,"line":1375},26,[46,1377,1378],{"class":60},"          \u003Cp v-else>{{ state.rejectionReason }}\u003C\u002Fp>\n",[46,1380,1382],{"class":48,"line":1381},27,[46,1383,1384],{"class":60},"        \u003C\u002Fdiv>\n",[46,1386,1388],{"class":48,"line":1387},28,[46,1389,1390],{"class":60},"        \u003Cdiv v-else-if=\"rejecting\">\n",[46,1392,1394],{"class":48,"line":1393},29,[46,1395,1396],{"class":60},"          \u003Clabel>\n",[46,1398,1400],{"class":48,"line":1399},30,[46,1401,1402],{"class":60},"            What must the supplier correct?\n",[46,1404,1406],{"class":48,"line":1405},31,[46,1407,1408],{"class":60},"            \u003Ctextarea v-model=\"rejectionReason\" \u002F>\n",[46,1410,1412],{"class":48,"line":1411},32,[46,1413,1414],{"class":60},"          \u003C\u002Flabel>\n",[46,1416,1418],{"class":48,"line":1417},33,[46,1419,1420],{"class":60},"          \u003Cbutton type=\"button\" :disabled=\"!rejectionReason.trim()\" @click=\"reject\">Request corrected invoice\u003C\u002Fbutton>\n",[46,1422,1424],{"class":48,"line":1423},34,[46,1425,1426],{"class":60},"          \u003Cbutton type=\"button\" @click=\"rejecting = false\">Back\u003C\u002Fbutton>\n",[46,1428,1430],{"class":48,"line":1429},35,[46,1431,1384],{"class":60},[46,1433,1435],{"class":48,"line":1434},36,[46,1436,1437],{"class":60},"        \u003Cdiv v-else>\n",[46,1439,1441],{"class":48,"line":1440},37,[46,1442,1396],{"class":60},[46,1444,1446],{"class":48,"line":1445},38,[46,1447,1448],{"class":60},"            Purchase order number\n",[46,1450,1452],{"class":48,"line":1451},39,[46,1453,1454],{"class":60},"            \u003Cinput v-model=\"purchaseOrderNumber\">\n",[46,1456,1458],{"class":48,"line":1457},40,[46,1459,1414],{"class":60},[46,1461,1463],{"class":48,"line":1462},41,[46,1464,1465],{"class":60},"          \u003Cbutton type=\"button\" :disabled=\"!purchaseOrderNumber.trim()\" @click=\"approve\">Approve invoice\u003C\u002Fbutton>\n",[46,1467,1469],{"class":48,"line":1468},42,[46,1470,1471],{"class":60},"          \u003Cbutton type=\"button\" @click=\"rejecting = true\">Reject invoice\u003C\u002Fbutton>\n",[46,1473,1475],{"class":48,"line":1474},43,[46,1476,1384],{"class":60},[46,1478,1480],{"class":48,"line":1479},44,[46,1481,1482],{"class":60},"      \u003C\u002Fsection>\n",[46,1484,1486],{"class":48,"line":1485},45,[46,1487,1488],{"class":60},"    \u003C\u002Ftemplate>\n",[46,1490,1492],{"class":48,"line":1491},46,[46,1493,455],{"emptyLinePlaceholder":454},[46,1495,1497],{"class":48,"line":1496},47,[46,1498,1499],{"class":60},"    \u003Cscript setup>\n",[46,1501,1503],{"class":48,"line":1502},48,[46,1504,1505],{"class":60},"    import { ref } from 'vue'\n",[46,1507,1509],{"class":48,"line":1508},49,[46,1510,455],{"emptyLinePlaceholder":454},[46,1512,1514],{"class":48,"line":1513},50,[46,1515,1516],{"class":60},"    const { state, ctx, readOnly, submitAction } = defineProps({\n",[46,1518,1520],{"class":48,"line":1519},51,[46,1521,1522],{"class":60},"      state: { type: Object, required: true },\n",[46,1524,1526],{"class":48,"line":1525},52,[46,1527,1528],{"class":60},"      ctx: { type: Object, required: true },\n",[46,1530,1532],{"class":48,"line":1531},53,[46,1533,1534],{"class":60},"      readOnly: { type: Boolean, default: false },\n",[46,1536,1538],{"class":48,"line":1537},54,[46,1539,1540],{"class":60},"      submitAction: { type: Function, required: true },\n",[46,1542,1544],{"class":48,"line":1543},55,[46,1545,993],{"class":60},[46,1547,1549],{"class":48,"line":1548},56,[46,1550,1551],{"class":60},"    const purchaseOrderNumber = ref(state.purchaseOrderNumber ?? '')\n",[46,1553,1555],{"class":48,"line":1554},57,[46,1556,1557],{"class":60},"    const rejectionReason = ref('')\n",[46,1559,1561],{"class":48,"line":1560},58,[46,1562,1563],{"class":60},"    const rejecting = ref(false)\n",[46,1565,1567],{"class":48,"line":1566},59,[46,1568,455],{"emptyLinePlaceholder":454},[46,1570,1572],{"class":48,"line":1571},60,[46,1573,1574],{"class":60},"    function approve() {\n",[46,1576,1578],{"class":48,"line":1577},61,[46,1579,1580],{"class":60},"      submitAction('approve', { purchaseOrderNumber: purchaseOrderNumber.value })\n",[46,1582,1584],{"class":48,"line":1583},62,[46,1585,485],{"class":60},[46,1587,1589],{"class":48,"line":1588},63,[46,1590,455],{"emptyLinePlaceholder":454},[46,1592,1594],{"class":48,"line":1593},64,[46,1595,1596],{"class":60},"    function reject() {\n",[46,1598,1600],{"class":48,"line":1599},65,[46,1601,1602],{"class":60},"      submitAction('reject', { rejectionReason: rejectionReason.value })\n",[46,1604,1606],{"class":48,"line":1605},66,[46,1607,485],{"class":60},[46,1609,1611],{"class":48,"line":1610},67,[46,1612,1613],{"class":60},"    \u003C\u002Fscript>\n",[46,1615,1617],{"class":48,"line":1616},68,[46,1618,455],{"emptyLinePlaceholder":454},[46,1620,1622],{"class":48,"line":1621},69,[46,1623,1624],{"class":60},"    \u003Cscript backend>\n",[46,1626,1628],{"class":48,"line":1627},70,[46,1629,1630],{"class":60},"    export async function approve(state, inputs) {\n",[46,1632,1634],{"class":48,"line":1633},71,[46,1635,1636],{"class":60},"      const purchaseOrderNumber = String(inputs.purchaseOrderNumber ?? '').trim()\n",[46,1638,1640],{"class":48,"line":1639},72,[46,1641,1642],{"class":60},"      if (!purchaseOrderNumber) throw new Error('Enter the purchase order number')\n",[46,1644,1646],{"class":48,"line":1645},73,[46,1647,1648],{"class":60},"      return { ...state, purchaseOrderNumber, decision: 'approved', rejectionReason: '', done: true }\n",[46,1650,1652],{"class":48,"line":1651},74,[46,1653,485],{"class":60},[46,1655,1657],{"class":48,"line":1656},75,[46,1658,455],{"emptyLinePlaceholder":454},[46,1660,1662],{"class":48,"line":1661},76,[46,1663,1664],{"class":60},"    export async function reject(state, inputs) {\n",[46,1666,1668],{"class":48,"line":1667},77,[46,1669,1670],{"class":60},"      const rejectionReason = String(inputs.rejectionReason ?? '').trim()\n",[46,1672,1674],{"class":48,"line":1673},78,[46,1675,1676],{"class":60},"      if (!rejectionReason) throw new Error('Describe the correction needed')\n",[46,1678,1680],{"class":48,"line":1679},79,[46,1681,1682],{"class":60},"      return { ...state, decision: 'rejected', rejectionReason, done: true }\n",[46,1684,1686],{"class":48,"line":1685},80,[46,1687,485],{"class":60},[46,1689,1691],{"class":48,"line":1690},81,[46,1692,1613],{"class":60},[10,1694,1695],{},"Human nodes should render both an active input state and a completed recap state.",[1697,1698,1699],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":42,"searchDepth":64,"depth":64,"links":1701},[1702,1703,1708,1709,1710],{"id":31,"depth":64,"text":32},{"id":162,"depth":64,"text":163,"children":1704},[1705,1706,1707],{"id":170,"depth":75,"text":171},{"id":297,"depth":75,"text":298},{"id":558,"depth":75,"text":559},{"id":727,"depth":64,"text":728},{"id":902,"depth":64,"text":903},{"id":1107,"depth":64,"text":1108},"Reference for trigger, task, code, and human nodes, including configs and runtime context.","md",{},"[object Object]","\u002Fdocs\u002Freference\u002Fnode-types",{"title":1717,"description":1711},"Gondo Node Types","docs\u002F4.reference\u002F2.node-types","97iT0KlqT4NM2NufvpABVOGhMFkNEwGmcgjtEX25atw",[1721],{"title":1722,"path":1723,"stem":1724,"children":1725},"Docs","\u002Fdocs","docs",[1726,1730,1735,1756,1771,1787],{"title":1727,"path":1723,"stem":1728,"description":1729},"Gondo Docs","docs\u002Findex","Learn the basic ideas behind Gondo, from integrations and workflows to runs, approvals, and workflow YAML.",{"title":1731,"path":1732,"stem":1733,"description":1734},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started","Connect an integration, ask Gondo for help, build a workflow, and watch it run.",{"title":1736,"path":1737,"stem":1738,"children":1739,"page":1755},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F2.concepts",[1740,1745,1750],{"title":1741,"path":1742,"stem":1743,"description":1744},"Integrations","\u002Fdocs\u002Fconcepts\u002Fintegrations","docs\u002F2.concepts\u002F1.integrations","Integrations are the connected apps, accounts, websites, and systems Gondo can use.",{"title":1746,"path":1747,"stem":1748,"description":1749},"Workflows","\u002Fdocs\u002Fconcepts\u002Fworkflows","docs\u002F2.concepts\u002F2.workflows","Workflows are repeatable processes made from triggers, AI tasks, code, human review, and edges.",{"title":1751,"path":1752,"stem":1753,"description":1754},"Runs and Activity","\u002Fdocs\u002Fconcepts\u002Fruns-and-activity","docs\u002F2.concepts\u002F3.runs-and-activity","Learn what happens when a workflow runs and how to read statuses, approvals, failures, and reauth pauses.",false,{"title":1757,"path":1758,"stem":1759,"children":1760,"page":1755},"Guides","\u002Fdocs\u002Fguides","docs\u002F3.guides",[1761,1766],{"title":1762,"path":1763,"stem":1764,"description":1765},"Connect an Integration","\u002Fdocs\u002Fguides\u002Fconnect-an-integration","docs\u002F3.guides\u002F1.connect-an-integration","Add a connected app or system so Gondo can use it in chats and workflows.",{"title":1767,"path":1768,"stem":1769,"description":1770},"Build Your First Workflow","\u002Fdocs\u002Fguides\u002Fbuild-your-first-workflow","docs\u002F3.guides\u002F2.build-your-first-workflow","A practical walkthrough for turning a plain-English process into a small Gondo workflow.",{"title":1772,"path":1773,"stem":1774,"children":1775,"page":1755},"Reference","\u002Fdocs\u002Freference","docs\u002F4.reference",[1776,1781,1782],{"title":1777,"path":1778,"stem":1779,"description":1780},"Workflow YAML","\u002Fdocs\u002Freference\u002Fworkflow-yaml","docs\u002F4.reference\u002F1.workflow-yaml","The technical shape of Gondo workflow definitions, including version, run display, variables, nodes, edges, and schema rules.",{"title":5,"path":1715,"stem":1718,"description":1711},{"title":1783,"path":1784,"stem":1785,"description":1786},"Integration Tools","\u002Fdocs\u002Freference\u002Fintegration-tools","docs\u002F4.reference\u002F3.integration-tools","How integration tools, toolsets, scopes, disabled tools, and custom tools fit together.",{"title":1788,"path":1789,"stem":1790,"description":1791},"Troubleshooting","\u002Fdocs\u002Ftroubleshooting","docs\u002F5.troubleshooting","Fix common problems with integrations, workflow runs, human input, browser sessions, and YAML.",[1793,1794],{"title":1777,"path":1778,"stem":1779,"children":-1},{"title":1783,"path":1784,"stem":1785,"children":-1},1791285442850]