[{"data":1,"prerenderedAt":1118},["ShallowReactive",2],{"page-\u002Fworkflows\u002Fstep-outputs":3,"all-pages":784},{"id":4,"title":5,"body":6,"description":775,"extension":776,"meta":777,"navigation":58,"path":778,"robots":779,"seo":780,"sitemap":781,"stem":782,"__hash__":783},"content\u002F01.workflows\u002F04.step-outputs.md","Step Outputs",{"type":7,"value":8,"toc":763},"minimark",[9,13,17,83,93,104,107,147,164,168,181,205,211,255,276,310,314,317,331,334,358,381,385,388,433,437,440,455,458,462,469,551,558,562,576,600,603,632,642,651,655,700,704,707,759],[10,11,5],"h1",{"id":12},"step-outputs",[14,15,16],"p",{},"Every step declares what it produces. Consumers reference the step's result,\nnot the producer's file name:",[18,19,24],"pre",{"className":20,"code":21,"language":22,"meta":23,"style":23},"language-bhw shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","hosts = step.exec(\n    command = [\"subfinder\", \"-d\", config.var(\"target\")],\n    stdout = path.file(\"hosts.txt\"),\n)\n\nlive = step.exec(\n    command = [\"httpx\", \"-l\", hosts.output],\n    stdout = path.file(\"live.txt\"),\n)\n","bhw","",[25,26,27,35,41,47,53,60,66,72,78],"code",{"__ignoreMap":23},[28,29,32],"span",{"class":30,"line":31},"line",1,[28,33,34],{},"hosts = step.exec(\n",[28,36,38],{"class":30,"line":37},2,[28,39,40],{},"    command = [\"subfinder\", \"-d\", config.var(\"target\")],\n",[28,42,44],{"class":30,"line":43},3,[28,45,46],{},"    stdout = path.file(\"hosts.txt\"),\n",[28,48,50],{"class":30,"line":49},4,[28,51,52],{},")\n",[28,54,56],{"class":30,"line":55},5,[28,57,59],{"emptyLinePlaceholder":58},true,"\n",[28,61,63],{"class":30,"line":62},6,[28,64,65],{},"live = step.exec(\n",[28,67,69],{"class":30,"line":68},7,[28,70,71],{},"    command = [\"httpx\", \"-l\", hosts.output],\n",[28,73,75],{"class":30,"line":74},8,[28,76,77],{},"    stdout = path.file(\"live.txt\"),\n",[28,79,81],{"class":30,"line":80},9,[28,82,52],{},[14,84,85,88,89,92],{},[25,86,87],{},"hosts.output"," is a file reference. The second step never needs to know that\nthe file is called ",[25,90,91],{},"hosts.txt",".",[94,95,97,100,101],"h2",{"id":96},"output-and-outputs",[25,98,99],{},"output"," and ",[25,102,103],{},"outputs",[14,105,106],{},"A step result has:",[108,109,110,123],"table",{},[111,112,113],"thead",{},[114,115,116,120],"tr",{},[117,118,119],"th",{},"Field",[117,121,122],{},"Meaning",[124,125,126,137],"tbody",{},[114,127,128,134],{},[129,130,131],"td",{},[25,132,133],{},"run.output",[129,135,136],{},"the single declared output (file or directory)",[114,138,139,144],{},[129,140,141],{},[25,142,143],{},"run.outputs.\u003Cname>",[129,145,146],{},"a named declared output",[14,148,149,151,152,156,157,159,160,163],{},[25,150,133],{}," exists only when the step declares ",[153,154,155],"strong",{},"exactly one"," output. With\nzero or several, use ",[25,158,143],{},"; using ",[25,161,162],{},".output"," there is an error.",[94,165,167],{"id":166},"where-outputs-come-from","Where outputs come from",[14,169,170,173,174,177,178,180],{},[153,171,172],{},"The runner writes the file from stdout."," ",[25,175,176],{},"stdout = path.file(...)"," exposes\nthat file as ",[25,179,133],{},":",[18,182,184],{"className":20,"code":183,"language":22,"meta":23,"style":23},"hits = step.exec(\n    command = [\"nuclei\", \"-l\", live.output, \"-jsonl\"],\n    stdout = path.file(\"hits.jsonl\"),\n)\n",[25,185,186,191,196,201],{"__ignoreMap":23},[28,187,188],{"class":30,"line":31},[28,189,190],{},"hits = step.exec(\n",[28,192,193],{"class":30,"line":37},[28,194,195],{},"    command = [\"nuclei\", \"-l\", live.output, \"-jsonl\"],\n",[28,197,198],{"class":30,"line":43},[28,199,200],{},"    stdout = path.file(\"hits.jsonl\"),\n",[28,202,203],{"class":30,"line":49},[28,204,52],{},[14,206,207,210],{},[153,208,209],{},"The tool writes the file itself."," The runner only sees argv, so declare the\nfile:",[18,212,214],{"className":20,"code":213,"language":22,"meta":23,"style":23},"scan = step.exec(\n    command = [\"nmap\", \"-sV\", \"-oA\", \"scan\", target],\n    outputs = {\n        \"xml\": path.file(\"scan.xml\"),\n        \"gnmap\": path.file(\"scan.gnmap\"),\n    },\n)\nscan.outputs.xml\n",[25,215,216,221,226,231,236,241,246,250],{"__ignoreMap":23},[28,217,218],{"class":30,"line":31},[28,219,220],{},"scan = step.exec(\n",[28,222,223],{"class":30,"line":37},[28,224,225],{},"    command = [\"nmap\", \"-sV\", \"-oA\", \"scan\", target],\n",[28,227,228],{"class":30,"line":43},[28,229,230],{},"    outputs = {\n",[28,232,233],{"class":30,"line":49},[28,234,235],{},"        \"xml\": path.file(\"scan.xml\"),\n",[28,237,238],{"class":30,"line":55},[28,239,240],{},"        \"gnmap\": path.file(\"scan.gnmap\"),\n",[28,242,243],{"class":30,"line":62},[28,244,245],{},"    },\n",[28,247,248],{"class":30,"line":68},[28,249,52],{},[28,251,252],{"class":30,"line":74},[28,253,254],{},"scan.outputs.xml\n",[14,256,257,173,260,263,264,267,268,271,272,275],{},[153,258,259],{},"The step type owns the destination.",[25,261,262],{},"step.transform"," publishes its\n",[25,265,266],{},"destination","; ",[25,269,270],{},"step.agent"," publishes its declared ",[25,273,274],{},"agent.output"," file:",[18,277,279],{"className":20,"code":278,"language":22,"meta":23,"style":23},"clean = step.transform(\n    source = hits.output,\n    pipeline = transform.jsonl().filter(lambda row: row[\"severity\"] == \"high\"),\n    destination = path.file(\"high.jsonl\"),\n)\nclean.output\n",[25,280,281,286,291,296,301,305],{"__ignoreMap":23},[28,282,283],{"class":30,"line":31},[28,284,285],{},"clean = step.transform(\n",[28,287,288],{"class":30,"line":37},[28,289,290],{},"    source = hits.output,\n",[28,292,293],{"class":30,"line":43},[28,294,295],{},"    pipeline = transform.jsonl().filter(lambda row: row[\"severity\"] == \"high\"),\n",[28,297,298],{"class":30,"line":49},[28,299,300],{},"    destination = path.file(\"high.jsonl\"),\n",[28,302,303],{"class":30,"line":55},[28,304,52],{},[28,306,307],{"class":30,"line":62},[28,308,309],{},"clean.output\n",[94,311,313],{"id":312},"multiple-files","Multiple files",[14,315,316],{},"Use a name → path map. Each name becomes a field:",[18,318,320],{"className":20,"code":319,"language":22,"meta":23,"style":23},"scan.outputs.xml\nscan.outputs.gnmap\n",[25,321,322,326],{"__ignoreMap":23},[28,323,324],{"class":30,"line":31},[28,325,254],{},[28,327,328],{"class":30,"line":37},[28,329,330],{},"scan.outputs.gnmap\n",[14,332,333],{},"When a tool writes an unpredictable tree, publish a directory or a glob instead\nof listing every file:",[18,335,337],{"className":20,"code":336,"language":22,"meta":23,"style":23},"ffuf = step.exec(\n    command = [\"ffuf\", \"-u\", url, \"-o\", \"results\", \"-of\", \"json\"],\n    outputs = {\"results\": path.directory(\"results\")},\n)\n",[25,338,339,344,349,354],{"__ignoreMap":23},[28,340,341],{"class":30,"line":31},[28,342,343],{},"ffuf = step.exec(\n",[28,345,346],{"class":30,"line":37},[28,347,348],{},"    command = [\"ffuf\", \"-u\", url, \"-o\", \"results\", \"-of\", \"json\"],\n",[28,350,351],{"class":30,"line":43},[28,352,353],{},"    outputs = {\"results\": path.directory(\"results\")},\n",[28,355,356],{"class":30,"line":49},[28,357,52],{},[18,359,361],{"className":20,"code":360,"language":22,"meta":23,"style":23},"nuclei = step.exec(\n    command = [\"nuclei\", \"-l\", live.output, \"-jsonl\"],\n    outputs = {\"findings\": path.glob(\"nuclei-*.jsonl\")},\n)\n",[25,362,363,368,372,377],{"__ignoreMap":23},[28,364,365],{"class":30,"line":31},[28,366,367],{},"nuclei = step.exec(\n",[28,369,370],{"class":30,"line":37},[28,371,195],{},[28,373,374],{"class":30,"line":43},[28,375,376],{},"    outputs = {\"findings\": path.glob(\"nuclei-*.jsonl\")},\n",[28,378,379],{"class":30,"line":49},[28,380,52],{},[94,382,384],{"id":383},"passing-outputs-on","Passing outputs on",[14,386,387],{},"An output is a path-like resource. Use it anywhere a file reference is\naccepted:",[18,389,391],{"className":20,"code":390,"language":22,"meta":23,"style":23},"step.exec(command = [\"cat\", clean.output])\nstep.exec(command = [\"nuclei\", \"-l\", live.output])\nstep.exec(stdin = hits.output)\nstep.exec(env = {\"TARGETS\": live.output})\nstep.transform(source = hits.output, ...)\nstep.agent(context = [hits.output], ...)\nstep.module(nuclei, inputs = {\"targets\": live.output})\nartifact_entry(source = hits.output, ...)\n",[25,392,393,398,403,408,413,418,423,428],{"__ignoreMap":23},[28,394,395],{"class":30,"line":31},[28,396,397],{},"step.exec(command = [\"cat\", clean.output])\n",[28,399,400],{"class":30,"line":37},[28,401,402],{},"step.exec(command = [\"nuclei\", \"-l\", live.output])\n",[28,404,405],{"class":30,"line":43},[28,406,407],{},"step.exec(stdin = hits.output)\n",[28,409,410],{"class":30,"line":49},[28,411,412],{},"step.exec(env = {\"TARGETS\": live.output})\n",[28,414,415],{"class":30,"line":55},[28,416,417],{},"step.transform(source = hits.output, ...)\n",[28,419,420],{"class":30,"line":62},[28,421,422],{},"step.agent(context = [hits.output], ...)\n",[28,424,425],{"class":30,"line":68},[28,426,427],{},"step.module(nuclei, inputs = {\"targets\": live.output})\n",[28,429,430],{"class":30,"line":74},[28,431,432],{},"artifact_entry(source = hits.output, ...)\n",[94,434,436],{"id":435},"modules","Modules",[14,438,439],{},"A module declares its own inputs and outputs. The caller sees only the declared\noutputs:",[18,441,443],{"className":20,"code":442,"language":22,"meta":23,"style":23},"scan = step.module(nuclei, inputs = {\"targets\": live.output})\nstep.exec(command = [\"cat\", scan.outputs.findings])\n",[25,444,445,450],{"__ignoreMap":23},[28,446,447],{"class":30,"line":31},[28,448,449],{},"scan = step.module(nuclei, inputs = {\"targets\": live.output})\n",[28,451,452],{"class":30,"line":37},[28,453,454],{},"step.exec(command = [\"cat\", scan.outputs.findings])\n",[14,456,457],{},"A module invocation is isolated: its declared file inputs are copied in, and\nonly its declared outputs are copied back. It never reads the caller's other\nfiles, and it never writes into the caller's workspace.",[94,459,461],{"id":460},"loops","Loops",[14,463,464,465,468],{},"Inside ",[25,466,467],{},"step.for_each",", each iteration runs the body as its own step sequence.\nGive each iteration a distinct output path, then consume the published files\nfrom a later step:",[18,470,472],{"className":20,"code":471,"language":22,"meta":23,"style":23},"step.for_each(\n    items = live.output,\n    concurrency = 8,\n    do = lambda host: step.exec(\n        command = [\"nuclei\", \"-u\", host, \"-jsonl\"],\n        outputs = {\n            \"findings\": path.file(\"findings\u002F{}.jsonl\".format(host)),\n        },\n    ),\n)\n\nstep.for_each(\n    items = path.glob(base = \"findings\", pattern = \"*.jsonl\"),\n    do = lambda path: step.exec(command = [\"cat\", path]),\n)\n",[25,473,474,479,484,489,494,499,504,509,514,519,524,529,534,540,546],{"__ignoreMap":23},[28,475,476],{"class":30,"line":31},[28,477,478],{},"step.for_each(\n",[28,480,481],{"class":30,"line":37},[28,482,483],{},"    items = live.output,\n",[28,485,486],{"class":30,"line":43},[28,487,488],{},"    concurrency = 8,\n",[28,490,491],{"class":30,"line":49},[28,492,493],{},"    do = lambda host: step.exec(\n",[28,495,496],{"class":30,"line":55},[28,497,498],{},"        command = [\"nuclei\", \"-u\", host, \"-jsonl\"],\n",[28,500,501],{"class":30,"line":62},[28,502,503],{},"        outputs = {\n",[28,505,506],{"class":30,"line":68},[28,507,508],{},"            \"findings\": path.file(\"findings\u002F{}.jsonl\".format(host)),\n",[28,510,511],{"class":30,"line":74},[28,512,513],{},"        },\n",[28,515,516],{"class":30,"line":80},[28,517,518],{},"    ),\n",[28,520,522],{"class":30,"line":521},10,[28,523,52],{},[28,525,527],{"class":30,"line":526},11,[28,528,59],{"emptyLinePlaceholder":58},[28,530,532],{"class":30,"line":531},12,[28,533,478],{},[28,535,537],{"class":30,"line":536},13,[28,538,539],{},"    items = path.glob(base = \"findings\", pattern = \"*.jsonl\"),\n",[28,541,543],{"class":30,"line":542},14,[28,544,545],{},"    do = lambda path: step.exec(command = [\"cat\", path]),\n",[28,547,549],{"class":30,"line":548},15,[28,550,52],{},[14,552,553,554,557],{},"Per-iteration result collections (",[25,555,556],{},"scans[i].outputs",") are not available yet;\nthe published files are the interface.",[94,559,561],{"id":560},"isolated-steps","Isolated steps",[14,563,564,565,568,569,568,572,575],{},"By default, ",[25,566,567],{},"script","\u002F",[25,570,571],{},"exec",[25,573,574],{},"agent"," steps in an activity share one workspace.\nTo give every data step its own private filesystem, opt in at the workflow\nlevel:",[18,577,579],{"className":20,"code":578,"language":22,"meta":23,"style":23},"workflow(\n    activities = [main],\n    isolated_steps = True,\n)\n",[25,580,581,586,591,596],{"__ignoreMap":23},[28,582,583],{"class":30,"line":31},[28,584,585],{},"workflow(\n",[28,587,588],{"class":30,"line":37},[28,589,590],{},"    activities = [main],\n",[28,592,593],{"class":30,"line":43},[28,594,595],{},"    isolated_steps = True,\n",[28,597,598],{"class":30,"line":49},[28,599,52],{},[14,601,602],{},"With isolation:",[604,605,606,623,626,629],"ul",{},[607,608,609,610,568,612,568,614,568,617,568,619,622],"li",{},"each ",[25,611,567],{},[25,613,571],{},[25,615,616],{},"transform",[25,618,574],{},[25,620,621],{},"module","\u002Fdataset\u002Fdecision step gets a\nfresh directory;",[607,624,625],{},"declared outputs are the only data that leaves it;",[607,627,628],{},"a later step receives a referenced output by copy, and cannot read anything\nelse the earlier step wrote;",[607,630,631],{},"files a step writes without declaring them are discarded.",[14,633,634,635,638,639,641],{},"Module steps are always isolated, regardless of the flag. ",[25,636,637],{},"for_each"," control\nsteps run in the parent scope, but their body steps are isolated and their\nitems (including glob and batch files) are materialized into each iteration.\nArtifact downloads are isolated too, and must declare ",[25,640,103],{}," so the\ndownloaded files leave the step.",[14,643,644,645,647,648,650],{},"References are the interface either way: ",[25,646,133],{}," \u002F ",[25,649,143],{},".\nPassing a bare path string that another step happened to write is not data\nflow; it only works while the shared workspace is enabled.",[94,652,654],{"id":653},"rules","Rules",[604,656,657,660,668,673,683,686],{},[607,658,659],{},"A step's file names appear once: where the step is defined.",[607,661,662,663,647,665,667],{},"Consumers use ",[25,664,133],{},[25,666,143],{},", never a producer's path.",[607,669,670,672],{},[25,671,162],{}," only exists when exactly one output is declared.",[607,674,675,678,679,682],{},[25,676,677],{},"outputs = {...}"," is the complete contract; it replaces the implicit\n",[25,680,681],{},"stdout"," output.",[607,684,685],{},"Directories and globs are valid outputs for tools that write a tree.",[607,687,688,689,568,691,568,693,695,696,699],{},"Module steps are isolated; by default ",[25,690,567],{},[25,692,571],{},[25,694,574],{}," share the\nactivity workspace, and ",[25,697,698],{},"workflow(isolated_steps = True)"," gives each data\nstep its own private scope.",[94,701,703],{"id":702},"migration","Migration",[14,705,706],{},"Old workflows shared a directory and passed file names between steps. Replace\nthe path with the producer's result:",[18,708,710],{"className":20,"code":709,"language":22,"meta":23,"style":23},"# before\nstep.exec(command = [\"sh\", \"-c\", \"nuclei ... > hits.jsonl\"])\nstep.exec(command = [\"jq\", \".\", path.file(\"hits.jsonl\")])\n\n# after\nhits = step.exec(\n    command = [\"sh\", \"-c\", \"nuclei ... > hits.jsonl\"],\n    outputs = {\"hits\": path.file(\"hits.jsonl\")},\n)\nstep.exec(command = [\"jq\", \".\", hits.outputs.hits])\n",[25,711,712,717,722,727,731,736,740,745,750,754],{"__ignoreMap":23},[28,713,714],{"class":30,"line":31},[28,715,716],{},"# before\n",[28,718,719],{"class":30,"line":37},[28,720,721],{},"step.exec(command = [\"sh\", \"-c\", \"nuclei ... > hits.jsonl\"])\n",[28,723,724],{"class":30,"line":43},[28,725,726],{},"step.exec(command = [\"jq\", \".\", path.file(\"hits.jsonl\")])\n",[28,728,729],{"class":30,"line":49},[28,730,59],{"emptyLinePlaceholder":58},[28,732,733],{"class":30,"line":55},[28,734,735],{},"# after\n",[28,737,738],{"class":30,"line":62},[28,739,190],{},[28,741,742],{"class":30,"line":68},[28,743,744],{},"    command = [\"sh\", \"-c\", \"nuclei ... > hits.jsonl\"],\n",[28,746,747],{"class":30,"line":74},[28,748,749],{},"    outputs = {\"hits\": path.file(\"hits.jsonl\")},\n",[28,751,752],{"class":30,"line":80},[28,753,52],{},[28,755,756],{"class":30,"line":521},[28,757,758],{},"step.exec(command = [\"jq\", \".\", hits.outputs.hits])\n",[760,761,762],"style",{},"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);}",{"title":23,"searchDepth":55,"depth":49,"links":764},[765,767,768,769,770,771,772,773,774],{"id":96,"depth":37,"text":766},"output and outputs",{"id":166,"depth":37,"text":167},{"id":312,"depth":37,"text":313},{"id":383,"depth":37,"text":384},{"id":435,"depth":37,"text":436},{"id":460,"depth":37,"text":461},{"id":560,"depth":37,"text":561},{"id":653,"depth":37,"text":654},{"id":702,"depth":37,"text":703},"Declare what a step produces and pass it to later steps by reference instead of remembering file names.","md",{},"\u002Fworkflows\u002Fstep-outputs",null,{"title":5,"description":775},{"loc":778},"01.workflows\u002F04.step-outputs","m4QBfo5w-gmCIWSS7SEBTyQdKUOKwu0T9IgGz97xSlA",[785,844,860,879,914,930,942,953,964,975,999,1018,1038,1049,1060],{"title":786,"path":787,"stem":788,"children":789},"Workflows","\u002Fworkflows","01.workflows",[790,792,796,800,804,808,809,813,817,821,824,828,832,836,840],{"title":786,"path":787,"stem":791},"01.workflows\u002Findex",{"title":793,"path":794,"stem":795},"Workflow Quick Reference","\u002Fworkflows\u002Fquick-reference","01.workflows\u002F00.quick-reference",{"title":797,"path":798,"stem":799},"Workflows Overview","\u002Fworkflows\u002Foverview","01.workflows\u002F01.overview",{"title":801,"path":802,"stem":803},"Workflow Syntax Reference","\u002Fworkflows\u002Fsyntax-reference","01.workflows\u002F02.syntax-reference",{"title":805,"path":806,"stem":807},"Steps","\u002Fworkflows\u002Fsteps","01.workflows\u002F03.steps",{"title":5,"path":778,"stem":782},{"title":810,"path":811,"stem":812},"Concurrency","\u002Fworkflows\u002Fconcurrency","01.workflows\u002F05.concurrency",{"title":814,"path":815,"stem":816},"Transforms","\u002Fworkflows\u002Ftransforms","01.workflows\u002F06.transforms",{"title":818,"path":819,"stem":820},"For Each","\u002Fworkflows\u002Ffor-each","01.workflows\u002F07.for-each",{"title":436,"path":822,"stem":823},"\u002Fworkflows\u002Fmodules","01.workflows\u002F08.modules",{"title":825,"path":826,"stem":827},"Agents","\u002Fworkflows\u002Fagents","01.workflows\u002F09.agents",{"title":829,"path":830,"stem":831},"Decisions","\u002Fworkflows\u002Fdecisions","01.workflows\u002F10.decisions",{"title":833,"path":834,"stem":835},"Configuration References","\u002Fworkflows\u002Fconfig","01.workflows\u002F11.config",{"title":837,"path":838,"stem":839},"Comparison With Other Automation Systems","\u002Fworkflows\u002Fcomparison","01.workflows\u002F12.comparison",{"title":841,"path":842,"stem":843},"Generate with AI","\u002Fworkflows\u002Fai-generation","01.workflows\u002F13.ai-generation",{"title":845,"path":846,"stem":847,"children":848},"Projects","\u002Fprojects","02.projects",[849,852,856],{"title":850,"path":846,"stem":851},"Projects & Runs","02.projects\u002Findex",{"title":853,"path":854,"stem":855},"Projects Overview","\u002Fprojects\u002Foverview","02.projects\u002F1.overview",{"title":857,"path":858,"stem":859},"Runs & Artifacts","\u002Fprojects\u002Fruns-artifacts","02.projects\u002F2.runs-artifacts",{"title":861,"path":862,"stem":863,"children":864},"Runners","\u002Frunners","03.runners",[865,867,871,875],{"title":861,"path":862,"stem":866},"03.runners\u002Findex",{"title":868,"path":869,"stem":870},"Runner Overview","\u002Frunners\u002Foverview","03.runners\u002F1.overview",{"title":872,"path":873,"stem":874},"Getting Started with Runners","\u002Frunners\u002Fgetting-started","03.runners\u002F2.getting-started",{"title":876,"path":877,"stem":878},"Custom Runner Images","\u002Frunners\u002Fcustom-image","03.runners\u002F3.custom-image",{"title":880,"path":881,"stem":882,"children":883},"Datasets","\u002Fdatasets","04.datasets",[884,886,890,894,898,902,906,910],{"title":880,"path":881,"stem":885},"04.datasets\u002Findex",{"title":887,"path":888,"stem":889},"Datasets Overview","\u002Fdatasets\u002Foverview","04.datasets\u002F1.overview",{"title":891,"path":892,"stem":893},"Dataset Schemas and Identity","\u002Fdatasets\u002Fschema","04.datasets\u002F2.schema",{"title":895,"path":896,"stem":897},"Pushing and Reading Dataset Rows","\u002Fdatasets\u002Fworkflows","04.datasets\u002F3.workflows",{"title":899,"path":900,"stem":901},"Dataset SQL Reference","\u002Fdatasets\u002Fsql","04.datasets\u002F4.sql",{"title":903,"path":904,"stem":905},"Dataset Structured Filters","\u002Fdatasets\u002Ffilters","04.datasets\u002F5.filters",{"title":907,"path":908,"stem":909},"Dataset Saved Views","\u002Fdatasets\u002Fviews","04.datasets\u002F6.views",{"title":911,"path":912,"stem":913},"Datasets API and CLI","\u002Fdatasets\u002Fapi-cli","04.datasets\u002F7.api-cli",{"title":915,"path":916,"stem":917,"children":918},"Agent","\u002Fagent","05.agent",[919,922,926],{"title":920,"path":916,"stem":921},"BH Agent","05.agent\u002Findex",{"title":923,"path":924,"stem":925},"BH Agent Overview","\u002Fagent\u002Foverview","05.agent\u002F1.overview",{"title":927,"path":928,"stem":929},"MCP servers","\u002Fagent\u002Fmcp-servers","05.agent\u002F2.mcp-servers",{"title":931,"path":932,"stem":933,"children":934},"Bhlast","\u002Fbhlast","06.bhlast",[935,938],{"title":936,"path":932,"stem":937},"Bhlast Servers","06.bhlast\u002Findex",{"title":939,"path":940,"stem":941},"Bhlast servers overview","\u002Fbhlast\u002Foverview","06.bhlast\u002F1.overview",{"title":943,"path":944,"stem":945,"children":946},"Notifications","\u002Fnotifications","07.notifications",[947,949],{"title":943,"path":944,"stem":948},"07.notifications\u002Findex",{"title":950,"path":951,"stem":952},"Notifications Overview","\u002Fnotifications\u002Foverview","07.notifications\u002F1.overview",{"title":954,"path":955,"stem":956,"children":957},"Blob Storage","\u002Fblob-storage","08.blob-storage",[958,960],{"title":954,"path":955,"stem":959},"08.blob-storage\u002Findex",{"title":961,"path":962,"stem":963},"Blob Storage Overview","\u002Fblob-storage\u002Foverview","08.blob-storage\u002F1.overview",{"title":965,"path":966,"stem":967,"children":968},"Payloads","\u002Fpayloads","09.payloads",[969,971],{"title":965,"path":966,"stem":970},"09.payloads\u002Findex",{"title":972,"path":973,"stem":974},"Payloads overview","\u002Fpayloads\u002Foverview","09.payloads\u002F1.overview",{"title":976,"path":977,"stem":978,"children":979},"Cve Watcher","\u002Fcve-watcher","10.cve-watcher",[980,983,987,991,995],{"title":981,"path":977,"stem":982},"CVE Watcher","10.cve-watcher\u002Findex",{"title":984,"path":985,"stem":986},"CVE Watcher Overview","\u002Fcve-watcher\u002Foverview","10.cve-watcher\u002F1.overview",{"title":988,"path":989,"stem":990},"CVE Watcher Search and Filters","\u002Fcve-watcher\u002Fsearch","10.cve-watcher\u002F2.search",{"title":992,"path":993,"stem":994},"CVE Watcher Push Notifications","\u002Fcve-watcher\u002Fnotifications","10.cve-watcher\u002F3.notifications",{"title":996,"path":997,"stem":998},"CVE Watcher API and Scopes","\u002Fcve-watcher\u002Fapi","10.cve-watcher\u002F4.api",{"title":1000,"path":1001,"stem":1002,"children":1003},"Developer","\u002Fdeveloper","11.developer",[1004,1006,1010,1014],{"title":1000,"path":1001,"stem":1005},"11.developer\u002Findex",{"title":1007,"path":1008,"stem":1009},"Developer Overview","\u002Fdeveloper\u002Foverview","11.developer\u002F1.overview",{"title":1011,"path":1012,"stem":1013},"Personal Access Token Scopes","\u002Fdeveloper\u002Fscopes","11.developer\u002F2.scopes",{"title":1015,"path":1016,"stem":1017},"Personal Access Tokens","\u002Fdeveloper\u002Fpersonal-access-tokens","11.developer\u002F3.personal-access-tokens",{"title":1019,"path":1020,"stem":1021,"children":1022},"Bh","\u002Fbh","12.bh",[1023,1026,1030,1034],{"title":1024,"path":1020,"stem":1025},"BH CLI","12.bh\u002Findex",{"title":1027,"path":1028,"stem":1029},"BH CLI Overview","\u002Fbh\u002Foverview","12.bh\u002F1.overview",{"title":1031,"path":1032,"stem":1033},"BH CLI Commands","\u002Fbh\u002Fcommands","12.bh\u002F2.commands",{"title":1035,"path":1036,"stem":1037},"BH CLI Examples","\u002Fbh\u002Fexamples","12.bh\u002F3.examples",{"title":1039,"path":1040,"stem":1041,"children":1042},"Billing","\u002Fbilling","13.billing",[1043,1045],{"title":1039,"path":1040,"stem":1044},"13.billing\u002Findex",{"title":1046,"path":1047,"stem":1048},"Billing Overview","\u002Fbilling\u002Foverview","13.billing\u002F1.overview",{"title":1050,"path":1051,"stem":1052,"children":1053},"Tools","\u002Ftools","14.tools",[1054,1056],{"title":1050,"path":1051,"stem":1055},"14.tools\u002Findex",{"title":1057,"path":1058,"stem":1059},"Cookie Lab","\u002Ftools\u002Fcookie-lab","14.tools\u002F1.cookie-lab",{"title":1061,"path":1062,"stem":1063,"children":1064},"Site Policies","\u002Fsite-policies","99.site-policies",[1065,1067,1080,1084,1088,1092,1096,1100,1104],{"title":1061,"path":1062,"stem":1066},"99.site-policies\u002Findex",{"title":1068,"path":1069,"stem":1070,"children":1071},"Privacy Policy","\u002Fsite-policies\u002Fprivacy-policy","99.site-policies\u002F1.privacy-policy",[1072,1076],{"title":1073,"path":1074,"stem":1075},"Company Processors","\u002Fsite-policies\u002Fprivacy-policy\u002Fcompany-processors","99.site-policies\u002Fprivacy-policy\u002F1.company-processors",{"title":1077,"path":1078,"stem":1079},"Data Export Instructions","\u002Fsite-policies\u002Fprivacy-policy\u002Fdata-export-instructions","99.site-policies\u002Fprivacy-policy\u002F2.data-export-instructions",{"title":1081,"path":1082,"stem":1083},"Terms of Service","\u002Fsite-policies\u002Fterms-of-service","99.site-policies\u002F2.terms-of-service",{"title":1085,"path":1086,"stem":1087},"California Resident Notice at Collection","\u002Fsite-policies\u002Fccpa","99.site-policies\u002F3.ccpa",{"title":1089,"path":1090,"stem":1091},"Cancellation Policy","\u002Fsite-policies\u002Fcancellation-policy","99.site-policies\u002F4.cancellation-policy",{"title":1093,"path":1094,"stem":1095},"Refund Policy","\u002Fsite-policies\u002Frefund-policy","99.site-policies\u002F5.refund-policy",{"title":1097,"path":1098,"stem":1099},"Taxes on Services","\u002Fsite-policies\u002Ftaxes-on-services","99.site-policies\u002F6.taxes-on-services",{"title":1101,"path":1102,"stem":1103},"Disclaimer","\u002Fsite-policies\u002Fdisclaimer","99.site-policies\u002F7.disclaimer",{"title":1105,"path":1106,"stem":1107,"children":1108},"Security","\u002Fsite-policies\u002Fsecurity","99.site-policies\u002Fsecurity\u002Findex",[1109,1110,1114],{"title":1105,"path":1106,"stem":1107},{"title":1111,"path":1112,"stem":1113},"Security Overview","\u002Fsite-policies\u002Fsecurity\u002Fsecurity-overview","99.site-policies\u002Fsecurity\u002F1.security-overview",{"title":1115,"path":1116,"stem":1117},"Security Response","\u002Fsite-policies\u002Fsecurity\u002Fsecurity-response","99.site-policies\u002Fsecurity\u002F2.security-response",1794410312375]