[{"data":1,"prerenderedAt":953},["ShallowReactive",2],{"navigation":3,"\u002Fconfiguration\u002Faccess-token":66,"\u002Fconfiguration\u002Faccess-token-surround":948},[4,28,56],{"title":5,"path":6,"stem":7,"children":8,"icon":27},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12,17,22],{"title":10,"path":6,"stem":7,"icon":11},"What & Why","i-lucide-house",{"title":13,"path":14,"stem":15,"icon":16},"Requirements","\u002Fgetting-started\u002Frequirements","1.getting-started\u002F2.requirements","i-lucide-badge-check",{"title":18,"path":19,"stem":20,"icon":21},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F3.installation","i-lucide-download",{"title":23,"path":24,"stem":25,"icon":26},"Upgrade Guide","\u002Fgetting-started\u002Fupgrade-guide","1.getting-started\u002F4.upgrade-guide","i-lucide-arrow-up-circle",false,{"title":29,"path":30,"stem":31,"children":32,"icon":35},"Configuration","\u002Fconfiguration","2.configuration\u002F1.index",[33,36,41,46,51],{"title":34,"path":30,"stem":31,"icon":35},"Overview","i-lucide-settings",{"title":37,"path":38,"stem":39,"icon":40},"Outputs","\u002Fconfiguration\u002Foutputs","2.configuration\u002F2.outputs","i-lucide-file-output",{"title":42,"path":43,"stem":44,"icon":45},"Root Module","\u002Fconfiguration\u002Froot-module","2.configuration\u002F3.root-module","i-lucide-git-branch",{"title":47,"path":48,"stem":49,"icon":50},"Access Token","\u002Fconfiguration\u002Faccess-token","2.configuration\u002F4.access-token","i-lucide-key-round",{"title":52,"path":53,"stem":54,"icon":55},"UI","\u002Fconfiguration\u002Fui","2.configuration\u002F5.ui","i-lucide-layout-dashboard",{"title":57,"path":58,"stem":59,"children":60,"page":27},"Internals","\u002Fguide","3.guide",[61],{"title":62,"path":63,"stem":64,"icon":65},"How It Works","\u002Fguide\u002Fhow-it-works","3.guide\u002F1.how-it-works","i-lucide-workflow",{"id":67,"title":47,"body":68,"description":941,"extension":942,"links":943,"meta":944,"navigation":945,"path":48,"seo":946,"stem":49,"__hash__":947},"docs\u002F2.configuration\u002F4.access-token.md",{"type":69,"value":70,"toc":930},"minimark",[71,75,79,91,184,189,203,303,326,330,337,340,343,399,432,436,439,442,446,449,456,459,473,477,487,565,568,576,594,601,692,695,785,789,914,926],[72,73,47],"h2",{"id":74},"access-token",[76,77,78],"p",{},"Nest Graph Inspector installs its endpoints on a native HTTP server inside your\nrunning application. Those endpoints expose your application's internal\nstructure, and the Direct Run endpoint invokes live provider or controller\nmethods, so by default every one of them is gated behind a short-lived access\ntoken.",[76,80,81,82,86,87,90],{},"Token protection is on unless you set ",[83,84,85],"code",{},"accessToken.enabled"," to ",[83,88,89],{},"false",". You do\nnot need to configure anything.",[92,93,98],"pre",{"className":94,"code":95,"language":96,"meta":97,"style":97},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","accessToken?: {\n  enabled?: boolean\n  ttlMs?: number\n  secret?: string\n  logToken?: boolean\n  bruteForce?: { \u002F* see below *\u002F }\n}\n","ts","",[83,99,100,116,128,139,150,160,178],{"__ignoreMap":97},[101,102,105,109,113],"span",{"class":103,"line":104},"line",1,[101,106,108],{"class":107},"sTEyZ","accessToken",[101,110,112],{"class":111},"sMK4o","?:",[101,114,115],{"class":111}," {\n",[101,117,119,122,125],{"class":103,"line":118},2,[101,120,121],{"class":107},"  enabled?",[101,123,124],{"class":111},":",[101,126,127],{"class":107}," boolean\n",[101,129,131,134,136],{"class":103,"line":130},3,[101,132,133],{"class":107},"  ttlMs",[101,135,112],{"class":111},[101,137,138],{"class":107}," number\n",[101,140,142,145,147],{"class":103,"line":141},4,[101,143,144],{"class":107},"  secret",[101,146,112],{"class":111},[101,148,149],{"class":107}," string\n",[101,151,153,156,158],{"class":103,"line":152},5,[101,154,155],{"class":107},"  logToken",[101,157,112],{"class":111},[101,159,127],{"class":107},[101,161,163,166,168,171,175],{"class":103,"line":162},6,[101,164,165],{"class":107},"  bruteForce",[101,167,112],{"class":111},[101,169,170],{"class":111}," {",[101,172,174],{"class":173},"sHwdD"," \u002F* see below *\u002F",[101,176,177],{"class":111}," }\n",[101,179,181],{"class":103,"line":180},7,[101,182,183],{"class":111},"}\n",[185,186,188],"h3",{"id":187},"what-a-token-gates","What a token gates",[76,190,191,192,195,196,198,199,202],{},"Tokens gate every endpoint the inspector installs, and nothing else in your\napplication. For a Viewer output, the graph routes below are installed; the\nDirect Run and history routes are installed only when that output's\n",[83,193,194],{},"directRun.enabled"," is not ",[83,197,89],{}," (it defaults to ",[83,200,201],{},"true","):",[204,205,206,219],"table",{},[207,208,209],"thead",{},[210,211,212,216],"tr",{},[213,214,215],"th",{},"Endpoint",[213,217,218],{},"What it serves",[220,221,222,233,243,253,263,273,283,293],"tbody",{},[210,223,224,230],{},[225,226,227],"td",{},[83,228,229],{},"GET \u002F__graph-inspector\u002Finformation.json",[225,231,232],{},"Which inspector version is installed and what it serves",[210,234,235,240],{},[225,236,237],{},[83,238,239],{},"GET \u002F__graph-inspector\u002Foutput.json",[225,241,242],{},"Your dependency graph",[210,244,245,250],{},[225,246,247],{},[83,248,249],{},"GET \u002F__graph-inspector\u002Foutput.schema.json",[225,251,252],{},"The JSON Schema that graph conforms to",[210,254,255,260],{},[225,256,257],{},[83,258,259],{},"GET \u002F__graph-inspector\u002Foutput.md",[225,261,262],{},"The same graph as Markdown",[210,264,265,270],{},[225,266,267],{},[83,268,269],{},"POST \u002Fdirect-run",[225,271,272],{},"Invokes an advertised provider or controller method; exists only when Direct Run is enabled",[210,274,275,280],{},[225,276,277],{},[83,278,279],{},"GET \u002Fdirect-run\u002Fhistories",[225,281,282],{},"Completed Direct Run traces in full; exists only when Direct Run is enabled",[210,284,285,290],{},[225,286,287],{},[83,288,289],{},"GET \u002Fdirect-run\u002Fhistory\u002Findex.json",[225,291,292],{},"A summary list of completed traces; exists only when Direct Run is enabled",[210,294,295,300],{},[225,296,297],{},[83,298,299],{},"GET \u002Fdirect-run\u002Fhistory\u002F\u003CtraceId>",[225,301,302],{},"One completed trace; exists only when Direct Run is enabled",[76,304,305,306,309,310,313,314,317,318,321,322,325],{},"The graph paths above are relative to the Viewer output's ",[83,307,308],{},"path",".\n",[83,311,312],{},"\u002Fdirect-run"," is the default Direct Run path and follows ",[83,315,316],{},"directRun.path"," if\nyou change it. With ",[83,319,320],{},"directRun.enabled: false",", the graph remains available but\nnone of the Direct Run or history paths exist, and its graph omits Direct Run\nmetadata. The AI chat is not on this list because it is not an endpoint: the\nmodel runs inside your browser and reads the graph through ",[83,323,324],{},"output.md",", which\nis already gated.",[185,327,329],{"id":328},"how-a-token-travels","How a token travels",[76,331,332,333,336],{},"A token is issued when your application starts and is embedded directly in the\nviewer link printed to your console, so opening that link just works. That link\nis the only thing that hands a token over: the viewer reads it once, keeps it\nfor the tab, and immediately rewrites its own address bar without it. From then\non it authenticates with the ",[83,334,335],{},"x-graph-inspector-token"," header on every\nfollow-up request, Direct Run included.",[76,338,339],{},"That means the URL you can copy out of the viewer, share, or leave in your\nhistory is not a working credential — only the link printed in your console is.",[76,341,342],{},"When you call the endpoints yourself, send the token any of these ways:",[92,344,348],{"className":345,"code":346,"language":347,"meta":97,"style":97},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -H 'Authorization: Bearer \u003Ctoken>' http:\u002F\u002Flocalhost:53371\u002F__graph-inspector\u002Foutput.json\ncurl -H 'x-graph-inspector-token: \u003Ctoken>' http:\u002F\u002Flocalhost:53371\u002F__graph-inspector\u002Foutput.json\ncurl 'http:\u002F\u002Flocalhost:53371\u002F__graph-inspector\u002Foutput.json?__inspector_token=\u003Ctoken>'\n","bash",[83,349,350,372,387],{"__ignoreMap":97},[101,351,352,356,360,363,366,369],{"class":103,"line":104},[101,353,355],{"class":354},"sBMFI","curl",[101,357,359],{"class":358},"sfazB"," -H",[101,361,362],{"class":111}," '",[101,364,365],{"class":358},"Authorization: Bearer \u003Ctoken>",[101,367,368],{"class":111},"'",[101,370,371],{"class":358}," http:\u002F\u002Flocalhost:53371\u002F__graph-inspector\u002Foutput.json\n",[101,373,374,376,378,380,383,385],{"class":103,"line":118},[101,375,355],{"class":354},[101,377,359],{"class":358},[101,379,362],{"class":111},[101,381,382],{"class":358},"x-graph-inspector-token: \u003Ctoken>",[101,384,368],{"class":111},[101,386,371],{"class":358},[101,388,389,391,393,396],{"class":103,"line":130},[101,390,355],{"class":354},[101,392,362],{"class":111},[101,394,395],{"class":358},"http:\u002F\u002Flocalhost:53371\u002F__graph-inspector\u002Foutput.json?__inspector_token=\u003Ctoken>",[101,397,398],{"class":111},"'\n",[76,400,401,402,405,406,409,410,409,413,416,417,420,421,423,424,427,428,431],{},"A request without a valid token is answered with ",[83,403,404],{},"401"," and a JSON body naming\nthe reason: ",[83,407,408],{},"missing",", ",[83,411,412],{},"malformed",[83,414,415],{},"signature",", or ",[83,418,419],{},"expired",". Two cases do not\nanswer ",[83,422,404],{},": a caller that has been locked out for repeated guesses gets ",[83,425,426],{},"429","\ninstead (see below), and a CORS preflight (",[83,429,430],{},"OPTIONS",") is not gated at all,\nbecause it carries no token of its own and blocking it would stop the browser\nfrom ever sending the request it is asking about.",[185,433,435],{"id":434},"expiry","Expiry",[76,437,438],{},"A token carries its own expiry. Issued at 13:00 with the default lifetime, it\nstops working at 16:00 — the payload is signed, so the expiry cannot be edited\nwithout invalidating the token.",[76,440,441],{},"Once a token expires, restart the application to print a fresh viewer link.",[185,443,445],{"id":444},"can-a-token-be-guessed","Can a token be guessed?",[76,447,448],{},"Not by trying. A token is accepted only if its HMAC-SHA256 signature checks\nout, which means guessing one means guessing a 256-bit value.",[76,450,451,452,455],{},"The part worth your attention is the signing secret. Left unset, it is 32\nrandom bytes generated per process and there is nothing to guess. If you set\n",[83,453,454],{},"secret"," yourself, keep it long: a token exposes both the payload it signs and\nthe resulting signature, so anyone holding a single leaked token can test\ncandidate secrets offline, on their own hardware, without ever touching your\napplication. A short or dictionary secret falls quickly that way. The library\nwarns at startup when a configured secret is under 32 characters.",[76,457,458],{},"The other real risk is leakage rather than guessing. A token placed in a URL\ntravels into access logs, proxy logs, and browser history, so treat a token as\nyou would a password and prefer the header form for anything scripted — which\nis what the viewer itself does.",[76,460,461,462,465,466,468,469,472],{},"The startup message is itself one of those places. It is the only channel that\nhands a token out, so it prints one by default, which means anything collecting\nyour application logs collects a working credential along with it. Where that\nmatters, set ",[83,463,464],{},"logToken: false",": the token is then left out of the message and\nout of the printed viewer link, and you supply your own by configuring a\n",[83,467,454],{}," and minting tokens with the exported ",[83,470,471],{},"AccessTokenService",".",[185,474,476],{"id":475},"brute-force-lockout","Brute force lockout",[76,478,479,480,482,483,486],{},"Repeated invalid tokens from the same client address are counted, and once a\nclient runs out of attempts it is refused with ",[83,481,426],{}," and a ",[83,484,485],{},"Retry-After","\nheader until the block expires.",[92,488,490],{"className":94,"code":489,"language":96,"meta":97,"style":97},"accessToken?: {\n  bruteForce?: {\n    enabled?: boolean\n    maxFailures?: number\n    windowMs?: number\n    blockMs?: number\n    maxTrackedClients?: number\n  }\n}\n",[83,491,492,500,509,518,527,536,545,554,560],{"__ignoreMap":97},[101,493,494,496,498],{"class":103,"line":104},[101,495,108],{"class":107},[101,497,112],{"class":111},[101,499,115],{"class":111},[101,501,502,505,507],{"class":103,"line":118},[101,503,504],{"class":107},"  bruteForce?",[101,506,124],{"class":111},[101,508,115],{"class":111},[101,510,511,514,516],{"class":103,"line":130},[101,512,513],{"class":107},"    enabled?",[101,515,124],{"class":111},[101,517,127],{"class":107},[101,519,520,523,525],{"class":103,"line":141},[101,521,522],{"class":107},"    maxFailures",[101,524,112],{"class":111},[101,526,138],{"class":107},[101,528,529,532,534],{"class":103,"line":152},[101,530,531],{"class":107},"    windowMs",[101,533,112],{"class":111},[101,535,138],{"class":107},[101,537,538,541,543],{"class":103,"line":162},[101,539,540],{"class":107},"    blockMs",[101,542,112],{"class":111},[101,544,138],{"class":107},[101,546,547,550,552],{"class":103,"line":180},[101,548,549],{"class":107},"    maxTrackedClients",[101,551,112],{"class":111},[101,553,138],{"class":107},[101,555,557],{"class":103,"line":556},8,[101,558,559],{"class":111},"  }\n",[101,561,563],{"class":103,"line":562},9,[101,564,183],{"class":111},[76,566,567],{},"A block applies to the client, not the token: once blocked, even a valid token\nis refused until the block lifts. Other clients are unaffected.",[76,569,570,571,575],{},"Two kinds of rejection are deliberately ",[572,573,574],"strong",{},"not"," counted as guesses:",[577,578,579,587],"ul",{},[580,581,582,583,586],"li",{},"a request with ",[572,584,585],{},"no token at all",", which is not an attempt at one, and would\notherwise lock out anyone who simply opened an endpoint in a browser",[580,588,589,590,593],{},"a request with a ",[572,591,592],{},"genuine but expired token",", which could only have come\nfrom something that already held a real one",[76,595,596,597,600],{},"Clients are identified by socket address. A forwarded header such as\n",[83,598,599],{},"X-Forwarded-For"," is intentionally ignored, since the caller sets it: trusting\none would let a brute force rotate past the lockout, and would let anyone lock\nout an address of their choosing. If you place the inspector behind a reverse\nproxy, every request arrives with the proxy's address and the lockout becomes\neffectively global.",[204,602,603,616],{},[207,604,605],{},[210,606,607,610,613],{},[213,608,609],{},"API",[213,611,612],{},"Description",[213,614,615],{},"Default",[220,617,618,632,647,662,677],{},[210,619,620,625,628],{},[225,621,622],{},[83,623,624],{},"enabled?: boolean",[225,626,627],{},"Whether failed guesses are counted at all.",[225,629,630],{},[83,631,201],{},[210,633,634,639,642],{},[225,635,636],{},[83,637,638],{},"maxFailures?: number",[225,640,641],{},"Invalid tokens allowed inside one window before the client is blocked.",[225,643,644],{},[83,645,646],{},"10",[210,648,649,654,657],{},[225,650,651],{},[83,652,653],{},"windowMs?: number",[225,655,656],{},"How long failures accumulate before the count resets.",[225,658,659],{},[83,660,661],{},"60000",[210,663,664,669,672],{},[225,665,666],{},[83,667,668],{},"blockMs?: number",[225,670,671],{},"How long a blocked client is refused.",[225,673,674],{},[83,675,676],{},"900000",[210,678,679,684,687],{},[225,680,681],{},[83,682,683],{},"maxTrackedClients?: number",[225,685,686],{},"Upper bound on tracked addresses, so the tracker cannot be grown without limit.",[225,688,689],{},[83,690,691],{},"1000",[185,693,609],{"id":694},"api",[204,696,697,708],{},[207,698,699],{},[210,700,701,703,705],{},[213,702,609],{},[213,704,612],{},[213,706,707],{},"Benefit",[220,709,710,724,737,754,772],{},[210,711,712,716,721],{},[225,713,714],{},[83,715,624],{},[225,717,718,719,472],{},"Whether inspector endpoints require a token. Defaults to ",[83,720,201],{},[225,722,723],{},"Lets you opt out on a host where the inspector port is already unreachable from outside.",[210,725,726,731,734],{},[225,727,728],{},[83,729,730],{},"ttlMs?: number",[225,732,733],{},"How long an issued token stays valid, in milliseconds. Defaults to three hours.",[225,735,736],{},"Matches the token lifetime to how long a debugging session actually lasts.",[210,738,739,744,751],{},[225,740,741],{},[83,742,743],{},"secret?: string",[225,745,746,747,750],{},"Signing secret, 32 characters or more. Defaults to the ",[83,748,749],{},"NEST_GRAPH_INSPECTOR_TOKEN_SECRET"," environment variable, then to a random per-process secret.",[225,752,753],{},"Keeps issued tokens valid across restarts, which matters for containers that reboot often.",[210,755,756,761,766],{},[225,757,758],{},[83,759,760],{},"logToken?: boolean",[225,762,763,764,472],{},"Whether the issued token is printed on startup. Defaults to ",[83,765,201],{},[225,767,768,769,771],{},"Keeps a live credential out of shipped application logs when set to ",[83,770,89],{},", at the cost of minting tokens yourself.",[210,773,774,779,782],{},[225,775,776],{},[83,777,778],{},"bruteForce?: object",[225,780,781],{},"Per-client lockout for repeated invalid tokens. See above.",[225,783,784],{},"Caps how fast an attacker can try at all, and surfaces the attempt as a logged block.",[185,786,788],{"id":787},"example","Example",[92,790,792],{"className":94,"code":791,"language":96,"meta":97,"style":97},"NestGraphInspectorModule.forRoot({\n  outputs: [{ type: 'viewer' }],\n  accessToken: {\n    ttlMs: 30 * 60 * 1000,\n    secret: process.env.INSPECTOR_SECRET,\n  },\n})\n",[83,793,794,811,846,855,879,901,906],{"__ignoreMap":97},[101,795,796,799,801,805,808],{"class":103,"line":104},[101,797,798],{"class":107},"NestGraphInspectorModule",[101,800,472],{"class":111},[101,802,804],{"class":803},"s2Zo4","forRoot",[101,806,807],{"class":107},"(",[101,809,810],{"class":111},"{\n",[101,812,813,817,819,822,825,828,830,832,835,837,840,843],{"class":103,"line":118},[101,814,816],{"class":815},"swJcz","  outputs",[101,818,124],{"class":111},[101,820,821],{"class":107}," [",[101,823,824],{"class":111},"{",[101,826,827],{"class":815}," type",[101,829,124],{"class":111},[101,831,362],{"class":111},[101,833,834],{"class":358},"viewer",[101,836,368],{"class":111},[101,838,839],{"class":111}," }",[101,841,842],{"class":107},"]",[101,844,845],{"class":111},",\n",[101,847,848,851,853],{"class":103,"line":130},[101,849,850],{"class":815},"  accessToken",[101,852,124],{"class":111},[101,854,115],{"class":111},[101,856,857,860,862,866,869,872,874,877],{"class":103,"line":141},[101,858,859],{"class":815},"    ttlMs",[101,861,124],{"class":111},[101,863,865],{"class":864},"sbssI"," 30",[101,867,868],{"class":111}," *",[101,870,871],{"class":864}," 60",[101,873,868],{"class":111},[101,875,876],{"class":864}," 1000",[101,878,845],{"class":111},[101,880,881,884,886,889,891,894,896,899],{"class":103,"line":152},[101,882,883],{"class":815},"    secret",[101,885,124],{"class":111},[101,887,888],{"class":107}," process",[101,890,472],{"class":111},[101,892,893],{"class":107},"env",[101,895,472],{"class":111},[101,897,898],{"class":107},"INSPECTOR_SECRET",[101,900,845],{"class":111},[101,902,903],{"class":103,"line":162},[101,904,905],{"class":111},"  },\n",[101,907,908,911],{"class":103,"line":180},[101,909,910],{"class":111},"}",[101,912,913],{"class":107},")\n",[915,916,919],"callout",{"color":917,"icon":918},"warning","i-lucide-shield-alert",[76,920,921,922,925],{},"Turning ",[83,923,924],{},"enabled"," off removes the only check in front of the Direct Run\nendpoint, which executes provider or controller methods against your running\napplication with its real database connections. Leave it on unless the port is unreachable from\nanywhere you do not control.",[927,928,929],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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}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 .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 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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":97,"searchDepth":104,"depth":118,"links":931},[932],{"id":74,"depth":118,"text":47,"children":933},[934,935,936,937,938,939,940],{"id":187,"depth":130,"text":188},{"id":328,"depth":130,"text":329},{"id":434,"depth":130,"text":435},{"id":444,"depth":130,"text":445},{"id":475,"depth":130,"text":476},{"id":694,"depth":130,"text":609},{"id":787,"depth":130,"text":788},"Gate every inspector endpoint behind a short-lived token.","md",null,{},{"icon":50},{"title":47,"description":941},"L_SAha5NwcFoEKyIjiW_TTCoCmtkCLu4EJt4bepi-ao",[949,951],{"title":42,"path":43,"stem":44,"description":950,"icon":45,"children":-1},"Configure the entry point of your dependency graph.",{"title":52,"path":53,"stem":54,"description":952,"icon":55,"children":-1},"Configure how the viewer's layout is persisted.",1791777231998]