[{"data":1,"prerenderedAt":1055},["ShallowReactive",2],{"docs:\u002Fen\u002Fguide\u002Fdashboard":3},{"page":4,"untranslated":1054,"translated":74},{"id":5,"title":6,"body":7,"description":1045,"extension":1046,"meta":1047,"navigation":74,"path":1048,"publishedAt":1049,"seo":1050,"stem":1051,"updatedAt":1052,"__hash__":1053},"docs_en\u002Fen\u002Fguide\u002Fdashboard.md","Dashboard and authentication",{"type":8,"value":9,"toc":1024},"minimark",[10,14,27,32,37,150,157,161,180,190,194,201,263,316,320,370,509,513,529,556,607,611,642,727,754,758,777,784,788,794,798,807,811,832,836,848,852,856,873,879,883,906,920,924,948,952,965,977,983,995,1007,1020],[11,12,6],"h1",{"id":13},"ダッシュボードと認証",[15,16,18],"callout",{"type":17},"warning",[19,20,21,22,26],"p",{},"If you do not specify ",[23,24,25],"code",{},"auth",", all requests to the REST API and the dashboard receive a 404 response.",[28,29,31],"h2",{"id":30},"bearerauth","bearerAuth",[19,33,34,36],{},[23,35,31],{}," authenticates requests with a single token.",[38,39,44],"pre",{"className":40,"code":41,"language":42,"meta":43,"style":43},"language-ts shiki shiki-themes github-light github-dark","import { bearerAuth, defineTsumugi } from 'tsumugi';\n\nconst tsumugi = defineTsumugi({\n  performers,\n  auth: bearerAuth((env: Env) => env.TSUMUGI_TOKEN, { cookie: 'tsumugi_token' }),\n});\n","ts","",[23,45,46,69,76,96,102,144],{"__ignoreMap":43},[47,48,51,55,59,62,66],"span",{"class":49,"line":50},"line",1,[47,52,54],{"class":53},"szBVR","import",[47,56,58],{"class":57},"sVt8B"," { bearerAuth, defineTsumugi } ",[47,60,61],{"class":53},"from",[47,63,65],{"class":64},"sZZnC"," 'tsumugi'",[47,67,68],{"class":57},";\n",[47,70,72],{"class":49,"line":71},2,[47,73,75],{"emptyLinePlaceholder":74},true,"\n",[47,77,79,82,86,89,93],{"class":49,"line":78},3,[47,80,81],{"class":53},"const",[47,83,85],{"class":84},"sj4cs"," tsumugi",[47,87,88],{"class":53}," =",[47,90,92],{"class":91},"sScJk"," defineTsumugi",[47,94,95],{"class":57},"({\n",[47,97,99],{"class":49,"line":98},4,[47,100,101],{"class":57},"  performers,\n",[47,103,105,108,110,113,117,120,123,126,129,132,135,138,141],{"class":49,"line":104},5,[47,106,107],{"class":57},"  auth: ",[47,109,31],{"class":91},[47,111,112],{"class":57},"((",[47,114,116],{"class":115},"s4XuR","env",[47,118,119],{"class":53},":",[47,121,122],{"class":91}," Env",[47,124,125],{"class":57},") ",[47,127,128],{"class":53},"=>",[47,130,131],{"class":57}," env.",[47,133,134],{"class":84},"TSUMUGI_TOKEN",[47,136,137],{"class":57},", { cookie: ",[47,139,140],{"class":64},"'tsumugi_token'",[47,142,143],{"class":57}," }),\n",[47,145,147],{"class":49,"line":146},6,[47,148,149],{"class":57},"});\n",[19,151,152,153,156],{},"Retrieve the token from a Secret with a function, as in the example above.",[154,155],"br",{},"\nIf you write the token directly as a string, it is included in both the repository and the bundle, which creates a security risk.",[158,159,160],"h3",{"id":160},"cookie",[19,162,163,164,166,167,170,171,173,174,176,177,179],{},"When you specify the ",[23,165,160],{}," option, Tsumugi validates the token in the cookie with the specified name, in addition to the ",[23,168,169],{},"Authorization"," header.",[154,172],{},"\nThe browser does not send the ",[23,175,169],{}," header when it fetches the initial HTML.",[154,178],{},"\nThis setting is required to open the dashboard.",[19,181,182,183,185,186,189],{},"Cookie authentication can be subject to CSRF.",[154,184],{},"\nThe side that issues the cookie must explicitly specify ",[23,187,188],{},"SameSite=Strict",".",[28,191,193],{"id":192},"cloudflare-access","Cloudflare Access",[19,195,196,197,200],{},"When you specify ",[23,198,199],{},"cloudflareAccess",", Tsumugi validates the JWT issued by Cloudflare Access.",[38,202,204],{"className":40,"code":203,"language":42,"meta":43,"style":43},"import { cloudflareAccess, defineTsumugi } from 'tsumugi';\n\nconst tsumugi = defineTsumugi({\n  performers,\n  auth: cloudflareAccess({ teamDomain: 'example', aud: 'audience tag' }),\n});\n",[23,205,206,219,223,235,239,259],{"__ignoreMap":43},[47,207,208,210,213,215,217],{"class":49,"line":50},[47,209,54],{"class":53},[47,211,212],{"class":57}," { cloudflareAccess, defineTsumugi } ",[47,214,61],{"class":53},[47,216,65],{"class":64},[47,218,68],{"class":57},[47,220,221],{"class":49,"line":71},[47,222,75],{"emptyLinePlaceholder":74},[47,224,225,227,229,231,233],{"class":49,"line":78},[47,226,81],{"class":53},[47,228,85],{"class":84},[47,230,88],{"class":53},[47,232,92],{"class":91},[47,234,95],{"class":57},[47,236,237],{"class":49,"line":98},[47,238,101],{"class":57},[47,240,241,243,245,248,251,254,257],{"class":49,"line":104},[47,242,107],{"class":57},[47,244,199],{"class":91},[47,246,247],{"class":57},"({ teamDomain: ",[47,249,250],{"class":64},"'example'",[47,252,253],{"class":57},", aud: ",[47,255,256],{"class":64},"'audience tag'",[47,258,143],{"class":57},[47,260,261],{"class":49,"line":146},[47,262,149],{"class":57},[264,265,266,279],"table",{},[267,268,269],"thead",{},[270,271,272,276],"tr",{},[273,274,275],"th",{},"Name",[273,277,278],{},"Description",[280,281,282,296,306],"tbody",{},[270,283,284,290],{},[285,286,287],"td",{},[23,288,289],{},"teamDomain",[285,291,292,293],{},"The team part of ",[23,294,295],{},"\u003Cteam>.cloudflareaccess.com",[270,297,298,303],{},[285,299,300],{},[23,301,302],{},"aud",[285,304,305],{},"The audience tag of the Access application",[270,307,308,313],{},[285,309,310],{},[23,311,312],{},"cacheTtlMs",[285,314,315],{},"The refetch interval for the JWKS. The default is 1 hour",[28,317,319],{"id":318},"独自の認証","Custom authentication",[19,321,322,323,325,326,328,329,332,333,189,335,337,338,341,342,189,345,347,348,350,351,353,354,356,357,359,360,362,363,366,367,369],{},"To implement custom authentication, specify a function in the ",[23,324,25],{}," option.",[154,327],{},"\nThe arguments of this function are ",[23,330,331],{},"request"," and ",[23,334,116],{},[154,336],{},"\nThe return value of this function is a ",[23,339,340],{},"Response"," or ",[23,343,344],{},"undefined",[154,346],{},"\nIf it returns ",[23,349,344],{},", authentication succeeds and Tsumugi continues processing the request.",[154,352],{},"\nIf it returns a ",[23,355,340],{},", authentication fails, and Tsumugi responds with that ",[23,358,340],{}," and stops processing.",[154,361],{},"\nFor example, you can check the session with ",[23,364,365],{},"findSession"," and return a 401 ",[23,368,340],{}," if none exists.",[38,371,373],{"className":40,"code":372,"language":42,"meta":43,"style":43},"import { defineTsumugi } from 'tsumugi';\n\nconst tsumugi = defineTsumugi({\n  performers,\n  auth: async (request, env: Env) => {\n    const session = await findSession(request, env);\n    return session ? undefined : Response.json({ error: 'unauthorized' }, { status: 401 });\n  },\n});\n",[23,374,375,388,392,404,408,440,459,498,504],{"__ignoreMap":43},[47,376,377,379,382,384,386],{"class":49,"line":50},[47,378,54],{"class":53},[47,380,381],{"class":57}," { defineTsumugi } ",[47,383,61],{"class":53},[47,385,65],{"class":64},[47,387,68],{"class":57},[47,389,390],{"class":49,"line":71},[47,391,75],{"emptyLinePlaceholder":74},[47,393,394,396,398,400,402],{"class":49,"line":78},[47,395,81],{"class":53},[47,397,85],{"class":84},[47,399,88],{"class":53},[47,401,92],{"class":91},[47,403,95],{"class":57},[47,405,406],{"class":49,"line":98},[47,407,101],{"class":57},[47,409,410,413,416,419,422,424,427,429,431,433,435,437],{"class":49,"line":104},[47,411,412],{"class":91},"  auth",[47,414,415],{"class":57},": ",[47,417,418],{"class":53},"async",[47,420,421],{"class":57}," (",[47,423,331],{"class":115},[47,425,426],{"class":57},", ",[47,428,116],{"class":115},[47,430,119],{"class":53},[47,432,122],{"class":91},[47,434,125],{"class":57},[47,436,128],{"class":53},[47,438,439],{"class":57}," {\n",[47,441,442,445,448,450,453,456],{"class":49,"line":146},[47,443,444],{"class":53},"    const",[47,446,447],{"class":84}," session",[47,449,88],{"class":53},[47,451,452],{"class":53}," await",[47,454,455],{"class":91}," findSession",[47,457,458],{"class":57},"(request, env);\n",[47,460,462,465,468,471,474,477,480,483,486,489,492,495],{"class":49,"line":461},7,[47,463,464],{"class":53},"    return",[47,466,467],{"class":57}," session ",[47,469,470],{"class":53},"?",[47,472,473],{"class":84}," undefined",[47,475,476],{"class":53}," :",[47,478,479],{"class":57}," Response.",[47,481,482],{"class":91},"json",[47,484,485],{"class":57},"({ error: ",[47,487,488],{"class":64},"'unauthorized'",[47,490,491],{"class":57}," }, { status: ",[47,493,494],{"class":84},"401",[47,496,497],{"class":57}," });\n",[47,499,501],{"class":49,"line":500},8,[47,502,503],{"class":57},"  },\n",[47,505,507],{"class":49,"line":506},9,[47,508,149],{"class":57},[28,510,512],{"id":511},"認証しない構成","Configuration without authentication",[15,514,516],{"type":515},"danger",[19,517,518,519,522,523,525,526,528],{},"If you specify ",[23,520,521],{},"unsafeNoAuth",", the REST API and the dashboard do not require authentication.",[154,524],{},"\nEvery user who can reach the Worker can view job contents, including the payload, and can enqueue, cancel, and rerun jobs.",[154,527],{},"\nDo not use it in a public environment.",[19,530,531,532,534,535,537,538,189,541,543,544,546,547,549,550,552,553,555],{},"Use ",[23,533,521],{}," only when authentication is performed in front of Tsumugi.",[154,536],{},"\nExamples include a configuration where Cloudflare Access is applied to the entire route, and checking behavior with ",[23,539,540],{},"wrangler dev",[154,542],{},"\nWhen you do not authenticate, do not omit ",[23,545,25],{},"; specify ",[23,548,521],{}," explicitly.",[154,551],{},"\nWhile ",[23,554,521],{}," is specified, a warning is written to the log.",[38,557,559],{"className":40,"code":558,"language":42,"meta":43,"style":43},"import { defineTsumugi, unsafeNoAuth } from 'tsumugi';\n\nconst tsumugi = defineTsumugi({\n  performers,\n  auth: unsafeNoAuth(),\n});\n",[23,560,561,574,578,590,594,603],{"__ignoreMap":43},[47,562,563,565,568,570,572],{"class":49,"line":50},[47,564,54],{"class":53},[47,566,567],{"class":57}," { defineTsumugi, unsafeNoAuth } ",[47,569,61],{"class":53},[47,571,65],{"class":64},[47,573,68],{"class":57},[47,575,576],{"class":49,"line":71},[47,577,75],{"emptyLinePlaceholder":74},[47,579,580,582,584,586,588],{"class":49,"line":78},[47,581,81],{"class":53},[47,583,85],{"class":84},[47,585,88],{"class":53},[47,587,92],{"class":91},[47,589,95],{"class":57},[47,591,592],{"class":49,"line":98},[47,593,101],{"class":57},[47,595,596,598,600],{"class":49,"line":104},[47,597,107],{"class":57},[47,599,521],{"class":91},[47,601,602],{"class":57},"(),\n",[47,604,605],{"class":49,"line":146},[47,606,149],{"class":57},[28,608,610],{"id":609},"ダッシュボードの有効化","Enabling the dashboard",[19,612,613,614,617,618,621,622,625,626,629,630,189,633,635,636,638,639,641],{},"When you pass ",[23,615,616],{},"ui()"," from ",[23,619,620],{},"tsumugi\u002Fui"," to the ",[23,623,624],{},"ui"," option of ",[23,627,628],{},"defineTsumugi",", Tsumugi responds with the dashboard HTML to GET requests for paths other than ",[23,631,632],{},"\u002Fapi",[154,634],{},"\nIf you do not specify ",[23,637,624],{},", the dashboard is not included in the bundle.",[154,640],{},"\nWhen the API responds with 401, the dashboard displays a token input field.",[38,643,645],{"className":40,"code":644,"language":42,"meta":43,"style":43},"import { ui } from 'tsumugi\u002Fui';\n\nconst tsumugi = defineTsumugi({\n  performers,\n  auth: bearerAuth((env: Env) => env.TSUMUGI_TOKEN, { cookie: 'tsumugi_token' }),\n  ui: ui({ tokenCookie: 'tsumugi_token' }),\n});\n",[23,646,647,661,665,677,681,709,723],{"__ignoreMap":43},[47,648,649,651,654,656,659],{"class":49,"line":50},[47,650,54],{"class":53},[47,652,653],{"class":57}," { ui } ",[47,655,61],{"class":53},[47,657,658],{"class":64}," 'tsumugi\u002Fui'",[47,660,68],{"class":57},[47,662,663],{"class":49,"line":71},[47,664,75],{"emptyLinePlaceholder":74},[47,666,667,669,671,673,675],{"class":49,"line":78},[47,668,81],{"class":53},[47,670,85],{"class":84},[47,672,88],{"class":53},[47,674,92],{"class":91},[47,676,95],{"class":57},[47,678,679],{"class":49,"line":98},[47,680,101],{"class":57},[47,682,683,685,687,689,691,693,695,697,699,701,703,705,707],{"class":49,"line":104},[47,684,107],{"class":57},[47,686,31],{"class":91},[47,688,112],{"class":57},[47,690,116],{"class":115},[47,692,119],{"class":53},[47,694,122],{"class":91},[47,696,125],{"class":57},[47,698,128],{"class":53},[47,700,131],{"class":57},[47,702,134],{"class":84},[47,704,137],{"class":57},[47,706,140],{"class":64},[47,708,143],{"class":57},[47,710,711,714,716,719,721],{"class":49,"line":146},[47,712,713],{"class":57},"  ui: ",[47,715,624],{"class":91},[47,717,718],{"class":57},"({ tokenCookie: ",[47,720,140],{"class":64},[47,722,143],{"class":57},[47,724,725],{"class":49,"line":461},[47,726,149],{"class":57},[264,728,729,737],{},[267,730,731],{},[270,732,733,735],{},[273,734,275],{},[273,736,278],{},[280,738,739],{},[270,740,741,746],{},[285,742,743],{},[23,744,745],{},"tokenCookie",[285,747,748,749,751,752],{},"The name of the cookie that stores the token. The same value as ",[23,750,160],{}," in ",[23,753,31],{},[28,755,757],{"id":756},"ジョブの一覧","Job list",[19,759,760,761,763,764,767,768,189,771,773,774,776],{},"In the job list, you filter by status, binding, and creation time range, page through the results, and sort by column.",[154,762],{},"\nYou can also search by job ID, ",[23,765,766],{},"uniqueKey",", and ",[23,769,770],{},"concurrencyKey",[154,772],{},"\nThe job detail page shows the attempt history, progress, logs, and trace information.",[154,775],{},"\nManual retry and cancel, bulk retry and bulk cancel of selected jobs, and job enqueueing are also done from the job list page.",[19,778,779],{},[780,781],"img",{"alt":782,"src":783},"Job list page","\u002Fdashboard-jobs.jpg",[158,785,787],{"id":786},"検索","Search",[19,789,790,791,793],{},"The value you enter in the search field is matched exactly.",[154,792],{},"\nIf you enter a value that matches the job ID format, the details of that job are displayed.",[158,795,797],{"id":796},"一括操作","Bulk operations",[19,799,800,801,803,804,806],{},"Select jobs with the checkbox at the left end of each row.",[154,802],{},"\nThe checkbox in the header row selects all displayed rows.",[154,805],{},"\nWhen you select one or more jobs, a menu appears for retrying or canceling the selected jobs together.",[158,808,810],{"id":809},"表示の設定","Display settings",[19,812,813,814,816,817,819,820,822,823,825,826,828,829,831],{},"Display settings are saved in the browser and applied in later sessions.",[154,815],{},"\nChoose the refresh interval from Off, 1s, 3s, 10s, 30s, and 1m; the default is 3 seconds.",[154,818],{},"\nYou can toggle the display of the ID, Started at, Updated at, Attempts, and Processing time columns.",[154,821],{},"\nBinding and Status are always displayed.",[154,824],{},"\nChoose the page size from 10, 20, 30, and 50.",[154,827],{},"\nSwitch the language between Japanese and English at the bottom of the sidebar.",[154,830],{},"\nOn first use, it follows the browser's language setting.",[158,833,835],{"id":834},"時刻の表示","Time display",[19,837,838,839,841,842,844,845,847],{},"Times for recurring executions are displayed in each schedule's time zone.",[154,840],{},"\nAll other times are displayed in the browser's IANA time zone.",[154,843],{},"\nEvery time is accompanied by its IANA time zone and GMT offset.",[154,846],{},"\nThe creation time range is specified by year, month, and day in the browser's local date.",[28,849,851],{"id":850},"ジョブの詳細","Job details",[158,853,855],{"id":854},"試行履歴","Attempt history",[19,857,858,859,861,862,189,867,869,870,872],{},"The start time, end time, and error of each attempt are shown in the job details.",[154,860],{},"\nFor the maximum number of stored entries and the maximum length of the error body, see ",[863,864,866],"a",{"href":865},"\u002Fen\u002Fguide\u002Fperformer#%E5%A4%B1%E6%95%97%E3%81%A8%E3%83%AA%E3%83%88%E3%83%A9%E3%82%A4","Failure and retry",[154,868],{},"\nThe attempt history is included only in the job detail response, not in the list response.",[154,871],{},"\nAn attempt that succeeds on the first try is not recorded in the history.",[19,874,875],{},[780,876],{"alt":877,"src":878},"Attempt history display","\u002Fdashboard-attempts.jpg",[158,880,882],{"id":881},"ログとトレース情報","Logs and trace information",[19,884,885,886,889,890,892,893,895,896,898,899,189,903,905],{},"Messages saved with ",[23,887,888],{},"ctx.log()"," appear in the job details in the order received.",[154,891],{},"\nEach log includes the attempt number, the recorded time, and the body.",[154,894],{},"\nLogs of running jobs are also displayed, but it may take some time before they appear.",[154,897],{},"\nFor the maximum number of stored entries, the body length, and the storage interval, see ",[863,900,902],{"href":901},"\u002Fen\u002Fguide\u002Fperformer#%E3%83%AD%E3%82%B0","Logs",[154,904],{},"\nThe log retention period is the same as the job retention period.",[19,907,908,909,912,913,915,916,189],{},"For a job enqueued with ",[23,910,911],{},"traceparent"," specified, that value is displayed in the job details.",[154,914],{},"\nFor how to use it in a performer, see ",[863,917,919],{"href":918},"\u002Fen\u002Fguide\u002Fperformer#%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9%E6%83%85%E5%A0%B1","Trace information",[158,921,923],{"id":922},"リトライ可否の表示","Retryability display",[19,925,926,927,189,930,932,934,935,341,938,941,942,944,945,947],{},"Each row in the list includes ",[23,928,929],{},"retryable",[154,931],{},[23,933,929],{}," indicates whether the job is ",[23,936,937],{},"FAILED",[23,939,940],{},"STALLED"," and is within its retention period.",[154,943],{},"\nA successful retry is not guaranteed.",[154,946],{},"\nFor a retry request on a job past its retention period, the REST API responds with 410.",[28,949,951],{"id":950},"runs","Runs",[19,953,954,955,958,959,961,962,964],{},"If ",[23,956,957],{},"flows"," is configured, a Runs item appears in the sidebar.",[154,960],{},"\nIf ",[23,963,957],{}," is empty, it is not displayed.",[19,966,967,968,970,971,973,974,976],{},"The Run list shows the Flow, status, and node progress.",[154,969],{},"\nIf you specify a Flow or status, only matching Runs are listed.",[154,972],{},"\nSelecting a row opens the detail panel.",[154,975],{},"\nThe detail panel offers two views: graph and waterfall.",[19,978,979],{},[780,980],{"alt":981,"src":982},"Run waterfall","\u002Fdashboard-run.jpg",[19,984,985,986,988,989,991,992,994],{},"The waterfall lays out the execution time of each node on a time axis.",[154,987],{},"\nThe graph shows node dependencies, the status of each node, and the progress of the child nodes of a fan-out node.",[154,990],{},"\nUp to 24 child nodes are displayed, and the remainder is shown as counts by status.",[154,993],{},"\nSelecting a waterfall row or a graph node opens the details of that job.",[19,996,997,998,1000,1001,1003,1004,1006],{},"In the details of a Run started as a subflow, the parent Run's ID is shown as a link.",[154,999],{},"\nSelecting this link opens the parent Run's details.",[154,1002],{},"\nA subflow node in the graph has a button that opens the child Run's details.",[154,1005],{},"\nSelecting a subflow row in the waterfall also opens the child Run's details.",[19,1008,1009,1010,1012,1013,1015,1016,1019],{},"Start, resume, and cancel Runs from the Runs page.",[154,1011],{},"\nOnly ",[23,1014,937],{}," Runs can be resumed, and only ",[23,1017,1018],{},"RUNNING"," Runs can be canceled.",[1021,1022,1023],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}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);}",{"title":43,"searchDepth":78,"depth":78,"links":1025},[1026,1029,1030,1031,1032,1033,1039,1044],{"id":30,"depth":71,"text":31,"children":1027},[1028],{"id":160,"depth":78,"text":160},{"id":192,"depth":71,"text":193},{"id":318,"depth":71,"text":319},{"id":511,"depth":71,"text":512},{"id":609,"depth":71,"text":610},{"id":756,"depth":71,"text":757,"children":1034},[1035,1036,1037,1038],{"id":786,"depth":78,"text":787},{"id":796,"depth":78,"text":797},{"id":809,"depth":78,"text":810},{"id":834,"depth":78,"text":835},{"id":850,"depth":71,"text":851,"children":1040},[1041,1042,1043],{"id":854,"depth":78,"text":855},{"id":881,"depth":78,"text":882},{"id":922,"depth":78,"text":923},{"id":950,"depth":71,"text":951},"How to configure authentication for the REST API and the dashboard, and how to view, search, and bulk-operate on jobs and Runs in the dashboard","md",{},"\u002Fen\u002Fguide\u002Fdashboard","2026-07-22",{"title":6,"description":1045},"en\u002Fguide\u002Fdashboard","2026-10-30","Yd2jzXIxo_mRycKPbisngtCf0iE2NIzg9HhPJhjMS1M",false,1794027576752]