[{"data":1,"prerenderedAt":1223},["ShallowReactive",2],{"docs:navigation":3,"docs:page:\u002Fdocs\u002Fdeployment\u002Fautomations":115},[4],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Introduction","\u002Fdocs","docs\u002F1.index",[9,11,16,21,38,95,110],{"title":5,"path":6,"stem":7,"icon":10},"i-lucide-house",{"title":12,"path":13,"stem":14,"icon":15},"Quickstart","\u002Fdocs\u002Fquickstart","docs\u002F2.quickstart","i-lucide-rocket",{"title":17,"path":18,"stem":19,"icon":20},"Essentials","\u002Fdocs\u002Fconfiguration","docs\u002F3.configuration","i-lucide-book-open",{"title":22,"path":23,"stem":24,"children":25,"icon":27},"Authentication","\u002Fdocs\u002Fauthentication","docs\u002F4.authentication\u002Findex",[26,28,33],{"title":22,"path":23,"stem":24,"icon":27},"i-lucide-shield-check",{"title":29,"path":30,"stem":31,"icon":32},"Protect User Data","\u002Fdocs\u002Fauthentication\u002Fuser-data","docs\u002F4.authentication\u002F1.user-data","i-lucide-user-lock",{"title":34,"path":35,"stem":36,"icon":37},"Two-Factor Verification","\u002Fdocs\u002Fauthentication\u002Ftwo-factor","docs\u002F4.authentication\u002F2.two-factor","i-lucide-key-round",{"title":39,"path":40,"stem":41,"children":42,"icon":44},"Deployment","\u002Fdocs\u002Fdeployment","docs\u002F5.deployment\u002Findex",[43,45,50,55,60,65,70,75,80,85,90],{"title":39,"path":40,"stem":41,"icon":44},"i-lucide-cloud-upload",{"title":46,"path":47,"stem":48,"icon":49},"Deploy to Cloudflare","\u002Fdocs\u002Fdeployment\u002Fcloudflare","docs\u002F5.deployment\u002F1.cloudflare","i-simple-icons-cloudflare",{"title":51,"path":52,"stem":53,"icon":54},"Platform Support","\u002Fdocs\u002Fdeployment\u002Fsupport","docs\u002F5.deployment\u002F10.support","i-lucide-list-checks",{"title":56,"path":57,"stem":58,"icon":59},"Deploy to Vercel","\u002Fdocs\u002Fdeployment\u002Fvercel","docs\u002F5.deployment\u002F2.vercel","i-simple-icons-vercel",{"title":61,"path":62,"stem":63,"icon":64},"Deploy to Azure","\u002Fdocs\u002Fdeployment\u002Fazure","docs\u002F5.deployment\u002F3.azure","i-simple-icons-microsoftazure",{"title":66,"path":67,"stem":68,"icon":69},"Switch Hosts","\u002Fdocs\u002Fdeployment\u002Fswitch-hosts","docs\u002F5.deployment\u002F4.switch-hosts","i-lucide-arrow-right-left",{"title":71,"path":72,"stem":73,"icon":74},"Database and File Storage","\u002Fdocs\u002Fdeployment\u002Fdata-services","docs\u002F5.deployment\u002F5.data-services","i-lucide-database",{"title":76,"path":77,"stem":78,"icon":79},"Domains and Secrets","\u002Fdocs\u002Fdeployment\u002Fsettings","docs\u002F5.deployment\u002F6.settings","i-lucide-settings",{"title":81,"path":82,"stem":83,"icon":84},"Troubleshoot Deployment","\u002Fdocs\u002Fdeployment\u002Ftroubleshooting","docs\u002F5.deployment\u002F7.troubleshooting","i-lucide-wrench",{"title":86,"path":87,"stem":88,"icon":89},"Deploy Agents","\u002Fdocs\u002Fdeployment\u002Fagents","docs\u002F5.deployment\u002F8.agents","i-lucide-bot",{"title":91,"path":92,"stem":93,"icon":94},"Deploy Automations","\u002Fdocs\u002Fdeployment\u002Fautomations","docs\u002F5.deployment\u002F9.automations","i-lucide-workflow",{"title":96,"path":97,"stem":98,"children":99,"icon":101},"Connect Accounts","\u002Fdocs\u002Fconnect","docs\u002F6.connect\u002Findex",[100,102,106],{"title":96,"path":97,"stem":98,"icon":101},"i-lucide-plug",{"title":103,"path":104,"stem":105,"icon":37},"Connection Credentials","\u002Fdocs\u002Fconnect\u002Fcredentials","docs\u002F6.connect\u002F1.credentials",{"title":107,"path":108,"stem":109,"icon":84},"Connect MCP Servers","\u002Fdocs\u002Fconnect\u002Fmcp","docs\u002F6.connect\u002F2.mcp",{"title":111,"path":112,"stem":113,"icon":114},"Project Reference","\u002Fdocs\u002Freference","docs\u002F7.reference","i-lucide-terminal",{"page":116,"surround":1218},{"id":117,"title":91,"body":118,"description":1211,"extension":1212,"links":1213,"meta":1214,"navigation":1215,"path":92,"seo":1216,"stem":93,"__hash__":1217},"docs\u002Fdocs\u002F5.deployment\u002F9.automations.md",{"type":119,"value":120,"toc":1204},"minimark",[121,125,130,138,364,371,848,855,859,868,914,933,940,943,947,1001,1008,1012,1015,1126,1133,1148,1155,1159,1178,1193,1200],[122,123,124],"p",{},"Declare tasks once and let the selected cloud continue them after the accepting\nrequest ends. Automations support named checkpoints, cron schedules, durable\ndelays, event waits, cancellation, and retries for explicitly idempotent actions.\nThe automatic deployment path currently requires Nuxt.",[126,127,129],"h2",{"id":128},"_1-declare-a-host-and-schedule","1. Declare a Host and Schedule",[122,131,132,133,137],{},"Add this declaration to your existing ",[134,135,136],"code",{},"cloud.config.ts",":",[139,140,145],"pre",{"className":141,"code":142,"filename":136,"language":143,"meta":144,"style":144},"language-ts shiki shiki-themes github-light github-light github-dark","deploy: {\n  target: 'vercel', \u002F\u002F 'cloudflare' | 'vercel' | 'azure'\n  automations: {\n    entry: 'server\u002Fcloudconfig\u002Fautomations.ts',\n    schedules: {\n      daily: {\n        cron: '0 9 * * *',\n        timeZone: 'Europe\u002FAmsterdam',\n        run: {\n          task: 'report',\n          scope: { ownerId: null, workspace: 'operations' },\n          payload: { report: 'daily' },\n        },\n      },\n    },\n  },\n  secrets: ['REPORT_ENDPOINT', 'REPORT_TOKEN'],\n},\n","ts","",[134,146,147,160,180,188,202,210,218,231,244,252,265,296,314,320,326,332,338,358],{"__ignoreMap":144},[148,149,152,156],"span",{"class":150,"line":151},"line",1,[148,153,155],{"class":154},"snPdu","deploy",[148,157,159],{"class":158},"sxrX7",": {\n",[148,161,163,166,169,173,176],{"class":150,"line":162},2,[148,164,165],{"class":154},"  target",[148,167,168],{"class":158},": ",[148,170,172],{"class":171},"sIIMD","'vercel'",[148,174,175],{"class":158},", ",[148,177,179],{"class":178},"sCsY4","\u002F\u002F 'cloudflare' | 'vercel' | 'azure'\n",[148,181,183,186],{"class":150,"line":182},3,[148,184,185],{"class":154},"  automations",[148,187,159],{"class":158},[148,189,191,194,196,199],{"class":150,"line":190},4,[148,192,193],{"class":154},"    entry",[148,195,168],{"class":158},[148,197,198],{"class":171},"'server\u002Fcloudconfig\u002Fautomations.ts'",[148,200,201],{"class":158},",\n",[148,203,205,208],{"class":150,"line":204},5,[148,206,207],{"class":154},"    schedules",[148,209,159],{"class":158},[148,211,213,216],{"class":150,"line":212},6,[148,214,215],{"class":154},"      daily",[148,217,159],{"class":158},[148,219,221,224,226,229],{"class":150,"line":220},7,[148,222,223],{"class":154},"        cron",[148,225,168],{"class":158},[148,227,228],{"class":171},"'0 9 * * *'",[148,230,201],{"class":158},[148,232,234,237,239,242],{"class":150,"line":233},8,[148,235,236],{"class":154},"        timeZone",[148,238,168],{"class":158},[148,240,241],{"class":171},"'Europe\u002FAmsterdam'",[148,243,201],{"class":158},[148,245,247,250],{"class":150,"line":246},9,[148,248,249],{"class":154},"        run",[148,251,159],{"class":158},[148,253,255,258,260,263],{"class":150,"line":254},10,[148,256,257],{"class":154},"          task",[148,259,168],{"class":158},[148,261,262],{"class":171},"'report'",[148,264,201],{"class":158},[148,266,268,271,274,277,279,283,285,288,290,293],{"class":150,"line":267},11,[148,269,270],{"class":154},"          scope",[148,272,273],{"class":158},": { ",[148,275,276],{"class":154},"ownerId",[148,278,168],{"class":158},[148,280,282],{"class":281},"sBjJW","null",[148,284,175],{"class":158},[148,286,287],{"class":154},"workspace",[148,289,168],{"class":158},[148,291,292],{"class":171},"'operations'",[148,294,295],{"class":158}," },\n",[148,297,299,302,304,307,309,312],{"class":150,"line":298},12,[148,300,301],{"class":154},"          payload",[148,303,273],{"class":158},[148,305,306],{"class":154},"report",[148,308,168],{"class":158},[148,310,311],{"class":171},"'daily'",[148,313,295],{"class":158},[148,315,317],{"class":150,"line":316},13,[148,318,319],{"class":158},"        },\n",[148,321,323],{"class":150,"line":322},14,[148,324,325],{"class":158},"      },\n",[148,327,329],{"class":150,"line":328},15,[148,330,331],{"class":158},"    },\n",[148,333,335],{"class":150,"line":334},16,[148,336,337],{"class":158},"  },\n",[148,339,341,344,347,350,352,355],{"class":150,"line":340},17,[148,342,343],{"class":154},"  secrets",[148,345,346],{"class":158},": [",[148,348,349],{"class":171},"'REPORT_ENDPOINT'",[148,351,175],{"class":158},[148,353,354],{"class":171},"'REPORT_TOKEN'",[148,356,357],{"class":158},"],\n",[148,359,361],{"class":150,"line":360},18,[148,362,363],{"class":158},"},\n",[122,365,366,367,370],{},"The host default-exports ",[134,368,369],{},"defineAutomationHost",". Its authorization method runs at\nacceptance, on status and control operations, and before every continuation.\nThis example permits only a trusted operations task:",[139,372,375],{"className":141,"code":373,"filename":374,"language":143,"meta":144,"style":144},"import { defineAutomationHost } from '@cloudconfig\u002Fcore\u002Fautomations'\n\nexport default defineAutomationHost({\n  async authorize(request) {\n    if (\n      request.task !== 'report' ||\n      request.scope.ownerId !== null ||\n      request.scope.workspace !== 'operations'\n    ) throw new Error('This job belongs to operations.')\n  },\n  tasks: {\n    async report(payload, context) {\n      return context.step('send-report', async ({ idempotencyKey, signal }) => {\n        const endpoint = context.env?.REPORT_ENDPOINT\n        const token = context.env?.REPORT_TOKEN\n        if (typeof endpoint !== 'string' || typeof token !== 'string') {\n          throw new Error('Configure REPORT_ENDPOINT and REPORT_TOKEN.')\n        }\n        const response = await fetch(endpoint, {\n          method: 'POST',\n          headers: {\n            authorization: `Bearer ${token}`,\n            'content-type': 'application\u002Fjson',\n            'idempotency-key': idempotencyKey,\n          },\n          body: JSON.stringify(payload),\n          signal,\n        })\n        if (!response.ok) throw new Error(`Report service returned ${response.status}.`)\n        return { sent: true }\n      }, { idempotent: true, attempts: 3 })\n    },\n  },\n})\n","server\u002Fcloudconfig\u002Fautomations.ts",[134,376,377,392,398,412,430,438,452,464,474,496,500,505,525,566,583,597,631,647,652,671,682,688,705,718,727,733,751,757,763,800,815,832,837,842],{"__ignoreMap":144},[148,378,379,383,386,389],{"class":150,"line":151},[148,380,382],{"class":381},"s8jYJ","import",[148,384,385],{"class":158}," { defineAutomationHost } ",[148,387,388],{"class":381},"from",[148,390,391],{"class":171}," '@cloudconfig\u002Fcore\u002Fautomations'\n",[148,393,394],{"class":150,"line":162},[148,395,397],{"emptyLinePlaceholder":396},true,"\n",[148,399,400,403,406,409],{"class":150,"line":182},[148,401,402],{"class":381},"export",[148,404,405],{"class":381}," default",[148,407,408],{"class":154}," defineAutomationHost",[148,410,411],{"class":158},"({\n",[148,413,414,417,420,423,427],{"class":150,"line":190},[148,415,416],{"class":381},"  async",[148,418,419],{"class":154}," authorize",[148,421,422],{"class":158},"(",[148,424,426],{"class":425},"sP4rz","request",[148,428,429],{"class":158},") {\n",[148,431,432,435],{"class":150,"line":204},[148,433,434],{"class":381},"    if",[148,436,437],{"class":158}," (\n",[148,439,440,443,446,449],{"class":150,"line":212},[148,441,442],{"class":158},"      request.task ",[148,444,445],{"class":381},"!==",[148,447,448],{"class":171}," 'report'",[148,450,451],{"class":381}," ||\n",[148,453,454,457,459,462],{"class":150,"line":220},[148,455,456],{"class":158},"      request.scope.ownerId ",[148,458,445],{"class":381},[148,460,461],{"class":281}," null",[148,463,451],{"class":381},[148,465,466,469,471],{"class":150,"line":233},[148,467,468],{"class":158},"      request.scope.workspace ",[148,470,445],{"class":381},[148,472,473],{"class":171}," 'operations'\n",[148,475,476,479,482,485,488,490,493],{"class":150,"line":246},[148,477,478],{"class":158},"    ) ",[148,480,481],{"class":381},"throw",[148,483,484],{"class":381}," new",[148,486,487],{"class":154}," Error",[148,489,422],{"class":158},[148,491,492],{"class":171},"'This job belongs to operations.'",[148,494,495],{"class":158},")\n",[148,497,498],{"class":150,"line":254},[148,499,337],{"class":158},[148,501,502],{"class":150,"line":267},[148,503,504],{"class":158},"  tasks: {\n",[148,506,507,510,513,515,518,520,523],{"class":150,"line":298},[148,508,509],{"class":381},"    async",[148,511,512],{"class":154}," report",[148,514,422],{"class":158},[148,516,517],{"class":425},"payload",[148,519,175],{"class":158},[148,521,522],{"class":425},"context",[148,524,429],{"class":158},[148,526,527,530,533,536,538,541,543,546,549,552,554,557,560,563],{"class":150,"line":316},[148,528,529],{"class":381},"      return",[148,531,532],{"class":158}," context.",[148,534,535],{"class":154},"step",[148,537,422],{"class":158},[148,539,540],{"class":171},"'send-report'",[148,542,175],{"class":158},[148,544,545],{"class":381},"async",[148,547,548],{"class":158}," ({ ",[148,550,551],{"class":425},"idempotencyKey",[148,553,175],{"class":158},[148,555,556],{"class":425},"signal",[148,558,559],{"class":158}," }) ",[148,561,562],{"class":381},"=>",[148,564,565],{"class":158}," {\n",[148,567,568,571,574,577,580],{"class":150,"line":322},[148,569,570],{"class":381},"        const",[148,572,573],{"class":281}," endpoint",[148,575,576],{"class":381}," =",[148,578,579],{"class":158}," context.env?.",[148,581,582],{"class":281},"REPORT_ENDPOINT\n",[148,584,585,587,590,592,594],{"class":150,"line":328},[148,586,570],{"class":381},[148,588,589],{"class":281}," token",[148,591,576],{"class":381},[148,593,579],{"class":158},[148,595,596],{"class":281},"REPORT_TOKEN\n",[148,598,599,602,605,608,611,613,616,619,622,625,627,629],{"class":150,"line":334},[148,600,601],{"class":381},"        if",[148,603,604],{"class":158}," (",[148,606,607],{"class":381},"typeof",[148,609,610],{"class":158}," endpoint ",[148,612,445],{"class":381},[148,614,615],{"class":171}," 'string'",[148,617,618],{"class":381}," ||",[148,620,621],{"class":381}," typeof",[148,623,624],{"class":158}," token ",[148,626,445],{"class":381},[148,628,615],{"class":171},[148,630,429],{"class":158},[148,632,633,636,638,640,642,645],{"class":150,"line":340},[148,634,635],{"class":381},"          throw",[148,637,484],{"class":381},[148,639,487],{"class":154},[148,641,422],{"class":158},[148,643,644],{"class":171},"'Configure REPORT_ENDPOINT and REPORT_TOKEN.'",[148,646,495],{"class":158},[148,648,649],{"class":150,"line":360},[148,650,651],{"class":158},"        }\n",[148,653,655,657,660,662,665,668],{"class":150,"line":654},19,[148,656,570],{"class":381},[148,658,659],{"class":281}," response",[148,661,576],{"class":381},[148,663,664],{"class":381}," await",[148,666,667],{"class":154}," fetch",[148,669,670],{"class":158},"(endpoint, {\n",[148,672,674,677,680],{"class":150,"line":673},20,[148,675,676],{"class":158},"          method: ",[148,678,679],{"class":171},"'POST'",[148,681,201],{"class":158},[148,683,685],{"class":150,"line":684},21,[148,686,687],{"class":158},"          headers: {\n",[148,689,691,694,697,700,703],{"class":150,"line":690},22,[148,692,693],{"class":158},"            authorization: ",[148,695,696],{"class":171},"`Bearer ${",[148,698,699],{"class":158},"token",[148,701,702],{"class":171},"}`",[148,704,201],{"class":158},[148,706,708,711,713,716],{"class":150,"line":707},23,[148,709,710],{"class":171},"            'content-type'",[148,712,168],{"class":158},[148,714,715],{"class":171},"'application\u002Fjson'",[148,717,201],{"class":158},[148,719,721,724],{"class":150,"line":720},24,[148,722,723],{"class":171},"            'idempotency-key'",[148,725,726],{"class":158},": idempotencyKey,\n",[148,728,730],{"class":150,"line":729},25,[148,731,732],{"class":158},"          },\n",[148,734,736,739,742,745,748],{"class":150,"line":735},26,[148,737,738],{"class":158},"          body: ",[148,740,741],{"class":281},"JSON",[148,743,744],{"class":158},".",[148,746,747],{"class":154},"stringify",[148,749,750],{"class":158},"(payload),\n",[148,752,754],{"class":150,"line":753},27,[148,755,756],{"class":158},"          signal,\n",[148,758,760],{"class":150,"line":759},28,[148,761,762],{"class":158},"        })\n",[148,764,766,768,770,773,776,778,780,782,784,787,790,792,795,798],{"class":150,"line":765},29,[148,767,601],{"class":381},[148,769,604],{"class":158},[148,771,772],{"class":381},"!",[148,774,775],{"class":158},"response.ok) ",[148,777,481],{"class":381},[148,779,484],{"class":381},[148,781,487],{"class":154},[148,783,422],{"class":158},[148,785,786],{"class":171},"`Report service returned ${",[148,788,789],{"class":158},"response",[148,791,744],{"class":171},[148,793,794],{"class":158},"status",[148,796,797],{"class":171},"}.`",[148,799,495],{"class":158},[148,801,803,806,809,812],{"class":150,"line":802},30,[148,804,805],{"class":381},"        return",[148,807,808],{"class":158}," { sent: ",[148,810,811],{"class":281},"true",[148,813,814],{"class":158}," }\n",[148,816,818,821,823,826,829],{"class":150,"line":817},31,[148,819,820],{"class":158},"      }, { idempotent: ",[148,822,811],{"class":281},[148,824,825],{"class":158},", attempts: ",[148,827,828],{"class":281},"3",[148,830,831],{"class":158}," })\n",[148,833,835],{"class":150,"line":834},32,[148,836,331],{"class":158},[148,838,840],{"class":150,"line":839},33,[148,841,337],{"class":158},[148,843,845],{"class":150,"line":844},34,[148,846,847],{"class":158},"})\n",[122,849,850,851,854],{},"Enable retries only when the receiving service actually deduplicates the action\nor repeating it is safe. Sending an idempotency header alone does not establish\nthat guarantee. Store credentials in server environment variables; job payloads\nand checkpoint results must contain JSON values and may enter native execution\nhistory. Keep task modules portable: Azure runs them outside Nuxt, so use explicit\nimports and the supplied ",[134,852,853],{},"context.env"," instead of Nuxt aliases or request state.",[126,856,858],{"id":857},"_2-install-and-deploy","2. Install and Deploy",[122,860,861,862,867],{},"Install the same ",[863,864,866],"a",{"href":865},"\u002Fdocs\u002Fdeployment\u002Fagents#2-install-the-native-runtime","native runtime dependencies","\nused by agents, then run:",[139,869,873],{"className":870,"code":871,"language":872,"meta":144,"style":144},"language-bash shiki shiki-themes github-light github-light github-dark","pnpm exec cloudconfig doctor\npnpm exec cloudconfig deploy --dry-run\npnpm exec cloudconfig deploy\n","bash",[134,874,875,889,903],{"__ignoreMap":144},[148,876,877,880,883,886],{"class":150,"line":151},[148,878,879],{"class":154},"pnpm",[148,881,882],{"class":171}," exec",[148,884,885],{"class":171}," cloudconfig",[148,887,888],{"class":171}," doctor\n",[148,890,891,893,895,897,900],{"class":150,"line":162},[148,892,879],{"class":154},[148,894,882],{"class":171},[148,896,885],{"class":171},[148,898,899],{"class":171}," deploy",[148,901,902],{"class":281}," --dry-run\n",[148,904,905,907,909,911],{"class":150,"line":182},[148,906,879],{"class":154},[148,908,882],{"class":171},[148,910,885],{"class":171},[148,912,913],{"class":171}," deploy\n",[122,915,916,917,920,921,924,925,928,929,932],{},"Deployment creates a private ",[134,918,919],{},"CLOUDCONFIG_AUTOMATION_ADMIN_KEY"," in the ignored\n",[134,922,923],{},".env",", uploads it as a server secret, publishes the app, and synchronizes\nconfig-declared schedules through ",[134,926,927],{},"POST \u002F_cloudconfig\u002Fautomations\u002Fconfigure",".\nThis authenticated endpoint accepts only schedules from the deployed source;\nrequest bodies cannot submit arbitrary jobs. Schedules start without an app\nvisit. A protected Vercel deployment also needs\n",[134,930,931],{},"VERCEL_AUTOMATION_BYPASS_SECRET"," locally or in CI for this request.",[122,934,935,936,939],{},"An unchanged schedule retains its next occurrence across deployments. Changing\none replaces its native timer; removing one cancels future occurrences. Runtime\nschedules created with ",[134,937,938],{},"platform.schedule(key, value)"," have a separate namespace.\nCron has five fields and uses the declared IANA time zone. A delayed scheduler\nenqueues the recorded occurrence, then advances to the next future occurrence;\nit does not backfill every missed interval.",[122,941,942],{},"If schedule synchronization fails, the CLI reports that the app was published\nbut schedules were not configured. Correct startup or deployment-protection\nsettings and retry deployment. A dry run never generates this key or calls this\nendpoint.",[126,944,946],{"id":945},"where-execution-lives","Where Execution Lives",[948,949,950,973,983],"ul",{},[951,952,953,957,958,175,961,964,965,968,969,972],"li",{},[954,955,956],"strong",{},"Cloudflare:"," a separate SQLite Durable Object class stores jobs, receipts,\nleases, and schedules. Alarms continue work. Defaults are\n",[134,959,960],{},"CloudconfigAutomations",[134,962,963],{},"CLOUDCONFIG_AUTOMATIONS",", and migration tag\n",[134,966,967],{},"cloudconfig-automations-v1","; override them under ",[134,970,971],{},"deploy.automations.cloudflare","\nwhen adopting existing resources. Keep identities stable across deployments.",[951,974,975,978,979,982],{},[954,976,977],{},"Vercel:"," the official Workflow compiler builds job and schedule functions\nwith queue triggers. Private records use the configured application database,\nnormally Turso, in the historical ",[134,980,981],{},"_cloudconfig_agent_records"," table. Agents\nand automations use different record keys. Native sleeps suspend delays and\nevent waits; event waits also recheck every 60 seconds.",[951,984,985,988,989,992,993,996,997,1000],{},[954,986,987],{},"Azure:"," agents and automations share one separate Durable Functions app and\nprivate Storage account. Blob records hold checkpoints and results; native\ntimers and external events continue jobs. The web app receives a private\n",[134,990,991],{},"CLOUDCONFIG_AZURE_AUTOMATION_ENDPOINT"," and Function key automatically. Existing\n",[134,994,995],{},"deploy.azure.agents.appName"," and ",[134,998,999],{},"storageAccount"," options name this shared\nexecution app. They do not select the application's database or upload storage.",[122,1002,1003,1004,1007],{},"Schedules use a stable run ID for each occurrence to deduplicate native retries.\nCloudflare routes each scheduled job to its owner's Durable Object. Vercel\nstarts a new scheduling execution after each occurrence; Azure uses\n",[134,1005,1006],{},"continueAsNew"," to bound scheduling history.",[126,1009,1011],{"id":1010},"start-signal-and-cancel-a-job","Start, Signal, and Cancel a Job",[122,1013,1014],{},"In an authenticated Nuxt server route, derive the owner and workspace from the\nsession, verify access, and call the server utility:",[139,1016,1018],{"className":141,"code":1017,"language":143,"meta":144,"style":144},"const platform = useCloudConfigAutomations(event)\nconst runs = await platform.runs(scope)\nawait runs.start({ scope, runId, task: 'process-order', payload: { orderId } })\nconst result = await runs.status(runId)\nawait runs.signal(runId, 'approved', { approved: true })\nawait runs.cancel(runId)\n",[134,1019,1020,1036,1056,1076,1094,1115],{"__ignoreMap":144},[148,1021,1022,1025,1028,1030,1033],{"class":150,"line":151},[148,1023,1024],{"class":381},"const",[148,1026,1027],{"class":281}," platform",[148,1029,576],{"class":381},[148,1031,1032],{"class":154}," useCloudConfigAutomations",[148,1034,1035],{"class":158},"(event)\n",[148,1037,1038,1040,1043,1045,1047,1050,1053],{"class":150,"line":162},[148,1039,1024],{"class":381},[148,1041,1042],{"class":281}," runs",[148,1044,576],{"class":381},[148,1046,664],{"class":381},[148,1048,1049],{"class":158}," platform.",[148,1051,1052],{"class":154},"runs",[148,1054,1055],{"class":158},"(scope)\n",[148,1057,1058,1061,1064,1067,1070,1073],{"class":150,"line":182},[148,1059,1060],{"class":381},"await",[148,1062,1063],{"class":158}," runs.",[148,1065,1066],{"class":154},"start",[148,1068,1069],{"class":158},"({ scope, runId, task: ",[148,1071,1072],{"class":171},"'process-order'",[148,1074,1075],{"class":158},", payload: { orderId } })\n",[148,1077,1078,1080,1083,1085,1087,1089,1091],{"class":150,"line":190},[148,1079,1024],{"class":381},[148,1081,1082],{"class":281}," result",[148,1084,576],{"class":381},[148,1086,664],{"class":381},[148,1088,1063],{"class":158},[148,1090,794],{"class":154},[148,1092,1093],{"class":158},"(runId)\n",[148,1095,1096,1098,1100,1102,1105,1108,1111,1113],{"class":150,"line":204},[148,1097,1060],{"class":381},[148,1099,1063],{"class":158},[148,1101,556],{"class":154},[148,1103,1104],{"class":158},"(runId, ",[148,1106,1107],{"class":171},"'approved'",[148,1109,1110],{"class":158},", { approved: ",[148,1112,811],{"class":281},[148,1114,831],{"class":158},[148,1116,1117,1119,1121,1124],{"class":150,"line":212},[148,1118,1060],{"class":381},[148,1120,1063],{"class":158},[148,1122,1123],{"class":154},"cancel",[148,1125,1093],{"class":158},[122,1127,1128,1129,1132],{},"Implement the corresponding task and authorization in your host. Never trust a\nbrowser-supplied owner, workspace, or system scope. Outside a request, use\n",[134,1130,1131],{},"getAutomationPlatform(env)"," with the activity's environment. Both native ports\nare bound inside workers, so jobs can start agents and agent callbacks can\nschedule jobs.",[122,1134,1135,1136,1139,1140,1143,1144,1147],{},"Inside a task, ",[134,1137,1138],{},"context.sleep('delay', milliseconds)"," persists a deadline and\n",[134,1141,1142],{},"context.waitForEvent('approved')"," pauses until that named event arrives. Signals\nare buffered; the first payload for each event name wins, including signals sent\nbefore the wait. ",[134,1145,1146],{},"runs.resume(runId)"," nudges a nonterminal execution after an\ninfrastructure interruption. Failed business tasks remain failed; review their\nresults before starting a new run.",[122,1149,1150,1151,1154],{},"Use stable, unique checkpoint names and keep external I\u002FO inside ",[134,1152,1153],{},"context.step",".\nEach native activity performs at most one new action and replays completed\nreceipts. Honor the action's deadline signal and keep individual actions under\nthree minutes; split longer work into checkpoints. There are at most 1,000 named\ncheckpoints per job. An interrupted non-idempotent action fails for review\nbecause its external outcome is uncertain. Cancellation prevents future work;\nan external service may already have completed an in-flight action.",[126,1156,1158],{"id":1157},"integration-jobs","Integration Jobs",[122,1160,1161,1162,1165,1166,1169,1170,1173,1174,1177],{},"With Connect enabled and ",[134,1163,1164],{},"deploy.automations"," declared, CloudConfig adds token\nrefresh, encryption-key rotation, registered MCP client-secret rotation, and\nabandoned-connection cleanup every five minutes. The bounded sweep saves its\ncursor between runs. Tune ",[134,1167,1168],{},"connect.maintenance: { cron, timeZone, limit }"," for\nlarger installations; ",[134,1171,1172],{},"limit"," defaults to 50 and may be 1–500. Set\n",[134,1175,1176],{},"connect.maintenance: false"," when another scheduler owns housekeeping. Keep older\nencryption keys until the entire sweep succeeds; inspect maintenance results for\nfailed rows before removing them.",[122,1179,1180,1181,1184,1185,1188,1189,1192],{},"Set ",[134,1182,1183],{},"connect.webhooks: { task: 'provider-event' }"," to dispatch verified integration\nevents to a task in your host. The payload is a ",[134,1186,1187],{},"WebhookDelivery"," with a public\nconnection summary, not account credentials. The run ID includes provider,\nevent, connection, and delivery identity. Vendor retries reuse that ID. Connect\nacknowledges the event only after durable acceptance; unavailable queues return\nan error. Existing ",[134,1190,1191],{},"onConnectWebhook"," handlers still run inline, so keep them\nshort and do long work in tasks. Recheck connection ownership and permissions\nwhen a task later uses account credentials.",[122,1194,1195,1196,1199],{},"The archived dashboard automation editor is not restored by this runtime.\nCloudflare-specific ",[134,1197,1198],{},"deploy.workflows"," classes also remain Cloudflare-specific;\nuse the task API above for portable jobs. Changing hosts does not migrate\nin-flight native jobs. Drain the previous runtime and recreate schedules on the\ndestination.",[1201,1202,1203],"style",{},"html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":144,"searchDepth":162,"depth":162,"links":1205},[1206,1207,1208,1209,1210],{"id":128,"depth":162,"text":129},{"id":857,"depth":162,"text":858},{"id":945,"depth":162,"text":946},{"id":1010,"depth":162,"text":1011},{"id":1157,"depth":162,"text":1158},"Run scheduled and event-driven jobs durably on Cloudflare, Vercel, and Azure.","md",null,{},{"icon":94},{"title":91,"description":1211},"R7bnuJmPto-xxIA2ibc0ZU2dS0AxYgXlW0iC56PN0P8",[1219,1221],{"title":86,"path":87,"stem":88,"description":1220,"icon":89},"Deploy a Nuxt agent host using native durable execution on Cloudflare, Vercel, or Azure.",{"title":96,"path":97,"stem":98,"description":1222,"icon":101},"Let signed-in users authorize a Google account for your server to use.",1792122403883]