[{"data":1,"prerenderedAt":800},["ShallowReactive",2],{"navigation_docs":3,"-packages-coordinator-sdk":72,"-packages-coordinator-sdk-surround":795},[4,20,41],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Overview",false,"\u002Fgetting-started","1.getting-started",[10,15],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Adding Documentation","\u002Fgetting-started\u002Fadding-documentation","1.getting-started\u002F3.adding-documentation","i-lucide-file-plus",{"title":21,"icon":22,"path":23,"stem":24,"children":25,"page":6},"Applications","i-lucide-layout-grid","\u002Fapplications","2.applications",[26,31,36],{"title":27,"path":28,"stem":29,"icon":30},"Web","\u002Fapplications\u002Fweb","2.applications\u002F1.web","i-lucide-globe-code",{"title":32,"path":33,"stem":34,"icon":35},"Coordinator","\u002Fapplications\u002Fcoordinator","2.applications\u002F2.coordinator","i-lucide-clock",{"title":37,"path":38,"stem":39,"icon":40},"Profile Chrome Extension","\u002Fapplications\u002Fprofile-recorder","2.applications\u002F3.profile-recorder","i-lucide-mouse-pointer-click",{"title":42,"icon":43,"path":44,"stem":45,"children":46,"page":6},"Packages","i-lucide-package","\u002Fpackages","3.packages",[47,52,57,62,67],{"title":48,"path":49,"stem":50,"icon":51},"Profile Runner","\u002Fpackages\u002Fprofile-runner","3.packages\u002F1.profile-runner","i-lucide-scan-search",{"title":53,"path":54,"stem":55,"icon":56},"Schema","\u002Fpackages\u002Fschema","3.packages\u002F2.schema","i-lucide-file-json",{"title":58,"path":59,"stem":60,"icon":61},"UI","\u002Fpackages\u002Fui","3.packages\u002F2.ui","i-lucide-layout-dashboard",{"title":63,"path":64,"stem":65,"icon":66},"Coordinator SDK","\u002Fpackages\u002Fcoordinator-sdk","3.packages\u002F3.coordinator-sdk","i-lucide-plug-zap",{"title":68,"path":69,"stem":70,"icon":71},"Client","\u002Fpackages\u002Fclient","3.packages\u002F4.client","i-lucide-plug",{"id":73,"title":63,"body":74,"description":788,"extension":789,"links":790,"meta":791,"navigation":792,"path":64,"seo":793,"stem":65,"__hash__":794},"docs\u002F3.packages\u002F3.coordinator-sdk.md",{"type":75,"value":76,"toc":784},"minimark",[77,102,107,122,238,244,254,409,446,767,780],[78,79,80,84,85,88,89,97,98,101],"p",{},[81,82,83],"code",{},"@scrape-admin\u002Fcoordinator-sdk"," wraps ",[86,87,32],"a",{"href":33},"'s REST API in a small, typed client\nbuilt on ",[86,90,94],{"href":91,"rel":92},"https:\u002F\u002Fgithub.com\u002Funjs\u002Fofetch",[93],"nofollow",[81,95,96],{},"ofetch",", so callers get autocomplete and type-checking against\n",[81,99,100],{},"@scrape-admin\u002Fcoordinator-schema"," instead of hand-rolling fetch calls and headers.",[103,104,106],"h2",{"id":105},"creating-a-client","Creating a client",[78,108,109,112,113,116,117,121],{},[81,110,111],{},"createCoordinatorClient"," takes the coordinator's base URL and the calling tenant's ID, which is sent on every\nrequest as the ",[81,114,115],{},"x-tenant-id"," header required by the coordinator's ",[86,118,120],{"href":119},"\u002Fapplications\u002Fcoordinator#authentication","authentication",":",[123,124,129],"pre",{"className":125,"code":126,"language":127,"meta":128,"style":128},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createCoordinatorClient } from '@scrape-admin\u002Fcoordinator-sdk'\n\nconst coordinator = createCoordinatorClient({\n  baseUrl: 'http:\u002F\u002Flocalhost:3001',\n  tenantId: 'my-tenant',\n})\n","ts","",[81,130,131,163,170,192,212,229],{"__ignoreMap":128},[132,133,136,140,144,148,151,154,157,160],"span",{"class":134,"line":135},"line",1,[132,137,139],{"class":138},"s7zQu","import",[132,141,143],{"class":142},"sMK4o"," {",[132,145,147],{"class":146},"sTEyZ"," createCoordinatorClient",[132,149,150],{"class":142}," }",[132,152,153],{"class":138}," from",[132,155,156],{"class":142}," '",[132,158,83],{"class":159},"sfazB",[132,161,162],{"class":142},"'\n",[132,164,166],{"class":134,"line":165},2,[132,167,169],{"emptyLinePlaceholder":168},true,"\n",[132,171,173,177,180,183,186,189],{"class":134,"line":172},3,[132,174,176],{"class":175},"spNyl","const",[132,178,179],{"class":146}," coordinator ",[132,181,182],{"class":142},"=",[132,184,147],{"class":185},"s2Zo4",[132,187,188],{"class":146},"(",[132,190,191],{"class":142},"{\n",[132,193,195,199,201,203,206,209],{"class":134,"line":194},4,[132,196,198],{"class":197},"swJcz","  baseUrl",[132,200,121],{"class":142},[132,202,156],{"class":142},[132,204,205],{"class":159},"http:\u002F\u002Flocalhost:3001",[132,207,208],{"class":142},"'",[132,210,211],{"class":142},",\n",[132,213,215,218,220,222,225,227],{"class":134,"line":214},5,[132,216,217],{"class":197},"  tenantId",[132,219,121],{"class":142},[132,221,156],{"class":142},[132,223,224],{"class":159},"my-tenant",[132,226,208],{"class":142},[132,228,211],{"class":142},[132,230,232,235],{"class":134,"line":231},6,[132,233,234],{"class":142},"}",[132,236,237],{"class":146},")\n",[103,239,241],{"id":240},"scheduledwebhooks",[81,242,243],{},"scheduledWebhooks",[78,245,246,247,249,250,253],{},"The client exposes one namespace, ",[81,248,243],{},", mirroring the coordinator's ",[81,251,252],{},"\u002Fapi\u002Fv1\u002Fwebhooks\u002Fscheduled"," API:",[255,256,257,273],"table",{},[258,259,260],"thead",{},[261,262,263,267,270],"tr",{},[264,265,266],"th",{},"Method",[264,268,269],{},"Request",[264,271,272],{},"Returns",[274,275,276,294,311,327,343,359,376,392],"tbody",{},[261,277,278,284,289],{},[279,280,281],"td",{},[81,282,283],{},"scheduledWebhooks.list()",[279,285,286],{},[81,287,288],{},"GET \u002F",[279,290,291],{},[81,292,293],{},"ScheduledWebhook[]",[261,295,296,301,306],{},[279,297,298],{},[81,299,300],{},"scheduledWebhooks.create(payload)",[279,302,303],{},[81,304,305],{},"POST \u002F",[279,307,308],{},[81,309,310],{},"ScheduledWebhook",[261,312,313,318,323],{},[279,314,315],{},[81,316,317],{},"scheduledWebhooks.get(id)",[279,319,320],{},[81,321,322],{},"GET \u002F:id",[279,324,325],{},[81,326,310],{},[261,328,329,334,339],{},[279,330,331],{},[81,332,333],{},"scheduledWebhooks.update(id, payload)",[279,335,336],{},[81,337,338],{},"PATCH \u002F:id",[279,340,341],{},[81,342,310],{},[261,344,345,350,355],{},[279,346,347],{},[81,348,349],{},"scheduledWebhooks.delete(id)",[279,351,352],{},[81,353,354],{},"DELETE \u002F:id",[279,356,357],{},[81,358,310],{},[261,360,361,366,371],{},[279,362,363],{},[81,364,365],{},"scheduledWebhooks.runs(id).list()",[279,367,368],{},[81,369,370],{},"GET \u002F:id\u002Fruns",[279,372,373],{},[81,374,375],{},"ScheduledWebhookRun[]",[261,377,378,383,388],{},[279,379,380],{},[81,381,382],{},"scheduledWebhooks.runs(id).trigger(payload?)",[279,384,385],{},[81,386,387],{},"POST \u002F:id\u002Fruns",[279,389,390],{},[81,391,375],{},[261,393,394,399,404],{},[279,395,396],{},[81,397,398],{},"scheduledWebhooks.runs(id).get(runId)",[279,400,401],{},[81,402,403],{},"GET \u002F:id\u002Fruns\u002F:runId",[279,405,406],{},[81,407,408],{},"ScheduledWebhookRun",[78,410,411,414,415,418,419,422,423,418,426,429,430,434,435,438,439,441,442,445],{},[81,412,413],{},"payload"," for ",[81,416,417],{},"create","\u002F",[81,420,421],{},"update"," is validated against ",[81,424,425],{},"CreateScheduledWebhook",[81,427,428],{},"UpdateScheduledWebhook"," from\n",[86,431,432],{"href":54},[81,433,100],{},": one or more ",[81,436,437],{},"destinations",", an optional ",[81,440,413],{}," body, and a\n",[81,443,444],{},"cronExpression",".",[123,447,449],{"className":125,"code":448,"language":127,"meta":128,"style":128},"\u002F\u002F Schedule a webhook to fire every 5 minutes\nconst webhook = await coordinator.scheduledWebhooks.create({\n  destinations: [{ url: 'https:\u002F\u002Fexample.com\u002Fhooks\u002Fscrape-complete' }],\n  cronExpression: '*\u002F5 * * * *',\n})\n\n\u002F\u002F Update its schedule\nawait coordinator.scheduledWebhooks.update(webhook.id, { cronExpression: '0 * * * *' })\n\n\u002F\u002F Trigger a run immediately, outside the cron schedule\nconst [run] = await coordinator.scheduledWebhooks.runs(webhook.id).trigger()\n\n\u002F\u002F Inspect run history\nconst runs = await coordinator.scheduledWebhooks.runs(webhook.id).list()\nconst sameRun = await coordinator.scheduledWebhooks.runs(webhook.id).get(run.id)\n\n\u002F\u002F Stop scheduling it\nawait coordinator.scheduledWebhooks.delete(webhook.id)\n",[81,450,451,457,484,516,532,538,542,548,593,598,604,647,652,658,693,734,739,745],{"__ignoreMap":128},[132,452,453],{"class":134,"line":135},[132,454,456],{"class":455},"sHwdD","\u002F\u002F Schedule a webhook to fire every 5 minutes\n",[132,458,459,461,464,466,469,472,474,476,478,480,482],{"class":134,"line":165},[132,460,176],{"class":175},[132,462,463],{"class":146}," webhook ",[132,465,182],{"class":142},[132,467,468],{"class":138}," await",[132,470,471],{"class":146}," coordinator",[132,473,445],{"class":142},[132,475,243],{"class":146},[132,477,445],{"class":142},[132,479,417],{"class":185},[132,481,188],{"class":146},[132,483,191],{"class":142},[132,485,486,489,491,494,497,500,502,504,507,509,511,514],{"class":134,"line":172},[132,487,488],{"class":197},"  destinations",[132,490,121],{"class":142},[132,492,493],{"class":146}," [",[132,495,496],{"class":142},"{",[132,498,499],{"class":197}," url",[132,501,121],{"class":142},[132,503,156],{"class":142},[132,505,506],{"class":159},"https:\u002F\u002Fexample.com\u002Fhooks\u002Fscrape-complete",[132,508,208],{"class":142},[132,510,150],{"class":142},[132,512,513],{"class":146},"]",[132,515,211],{"class":142},[132,517,518,521,523,525,528,530],{"class":134,"line":194},[132,519,520],{"class":197},"  cronExpression",[132,522,121],{"class":142},[132,524,156],{"class":142},[132,526,527],{"class":159},"*\u002F5 * * * *",[132,529,208],{"class":142},[132,531,211],{"class":142},[132,533,534,536],{"class":134,"line":214},[132,535,234],{"class":142},[132,537,237],{"class":146},[132,539,540],{"class":134,"line":231},[132,541,169],{"emptyLinePlaceholder":168},[132,543,545],{"class":134,"line":544},7,[132,546,547],{"class":455},"\u002F\u002F Update its schedule\n",[132,549,551,554,556,558,560,562,564,567,569,572,575,577,580,582,584,587,589,591],{"class":134,"line":550},8,[132,552,553],{"class":138},"await",[132,555,471],{"class":146},[132,557,445],{"class":142},[132,559,243],{"class":146},[132,561,445],{"class":142},[132,563,421],{"class":185},[132,565,566],{"class":146},"(webhook",[132,568,445],{"class":142},[132,570,571],{"class":146},"id",[132,573,574],{"class":142},",",[132,576,143],{"class":142},[132,578,579],{"class":197}," cronExpression",[132,581,121],{"class":142},[132,583,156],{"class":142},[132,585,586],{"class":159},"0 * * * *",[132,588,208],{"class":142},[132,590,150],{"class":142},[132,592,237],{"class":146},[132,594,596],{"class":134,"line":595},9,[132,597,169],{"emptyLinePlaceholder":168},[132,599,601],{"class":134,"line":600},10,[132,602,603],{"class":455},"\u002F\u002F Trigger a run immediately, outside the cron schedule\n",[132,605,607,609,611,614,616,619,621,623,625,627,629,632,634,636,639,641,644],{"class":134,"line":606},11,[132,608,176],{"class":175},[132,610,493],{"class":142},[132,612,613],{"class":146},"run",[132,615,513],{"class":142},[132,617,618],{"class":142}," =",[132,620,468],{"class":138},[132,622,471],{"class":146},[132,624,445],{"class":142},[132,626,243],{"class":146},[132,628,445],{"class":142},[132,630,631],{"class":185},"runs",[132,633,566],{"class":146},[132,635,445],{"class":142},[132,637,638],{"class":146},"id)",[132,640,445],{"class":142},[132,642,643],{"class":185},"trigger",[132,645,646],{"class":146},"()\n",[132,648,650],{"class":134,"line":649},12,[132,651,169],{"emptyLinePlaceholder":168},[132,653,655],{"class":134,"line":654},13,[132,656,657],{"class":455},"\u002F\u002F Inspect run history\n",[132,659,661,663,666,668,670,672,674,676,678,680,682,684,686,688,691],{"class":134,"line":660},14,[132,662,176],{"class":175},[132,664,665],{"class":146}," runs ",[132,667,182],{"class":142},[132,669,468],{"class":138},[132,671,471],{"class":146},[132,673,445],{"class":142},[132,675,243],{"class":146},[132,677,445],{"class":142},[132,679,631],{"class":185},[132,681,566],{"class":146},[132,683,445],{"class":142},[132,685,638],{"class":146},[132,687,445],{"class":142},[132,689,690],{"class":185},"list",[132,692,646],{"class":146},[132,694,696,698,701,703,705,707,709,711,713,715,717,719,721,723,726,729,731],{"class":134,"line":695},15,[132,697,176],{"class":175},[132,699,700],{"class":146}," sameRun ",[132,702,182],{"class":142},[132,704,468],{"class":138},[132,706,471],{"class":146},[132,708,445],{"class":142},[132,710,243],{"class":146},[132,712,445],{"class":142},[132,714,631],{"class":185},[132,716,566],{"class":146},[132,718,445],{"class":142},[132,720,638],{"class":146},[132,722,445],{"class":142},[132,724,725],{"class":185},"get",[132,727,728],{"class":146},"(run",[132,730,445],{"class":142},[132,732,733],{"class":146},"id)\n",[132,735,737],{"class":134,"line":736},16,[132,738,169],{"emptyLinePlaceholder":168},[132,740,742],{"class":134,"line":741},17,[132,743,744],{"class":455},"\u002F\u002F Stop scheduling it\n",[132,746,748,750,752,754,756,758,761,763,765],{"class":134,"line":747},18,[132,749,553],{"class":138},[132,751,471],{"class":146},[132,753,445],{"class":142},[132,755,243],{"class":146},[132,757,445],{"class":142},[132,759,760],{"class":185},"delete",[132,762,566],{"class":146},[132,764,445],{"class":142},[132,766,733],{"class":146},[78,768,769,770,772,773,418,776,779],{},"Every call throws (via ",[81,771,96],{},") on a non-2xx response, so wrap calls in ",[81,774,775],{},"try",[81,777,778],{},"catch"," where a failed request should\nbe handled rather than bubbling up.",[781,782,783],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":128,"searchDepth":165,"depth":165,"links":785},[786,787],{"id":105,"depth":165,"text":106},{"id":240,"depth":165,"text":243},"A typed client for the coordinator's scheduled webhook API.","md",null,{},{"icon":66},{"title":63,"description":788},"dszHPbabq7G0V7sk2VLWtwKrdO9Pwc2h_078yGURZQM",[796,798],{"title":58,"path":59,"stem":60,"description":797,"icon":61,"children":-1},"Common UI elements and components for the Scrape Admin applications.",{"title":68,"path":69,"stem":70,"description":799,"icon":71,"children":-1},"A typed HTTP client for the Scrape Admin team API.",1790949708940]