[{"data":1,"prerenderedAt":1980},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fcli\u002Fpolicy":3,"docs-nav":1868},{"id":4,"title":5,"body":6,"description":1860,"extension":1861,"meta":1862,"navigation":286,"order":1863,"path":1864,"seo":1865,"stem":1866,"__hash__":1867},"docs\u002Fdocs\u002F3.cli\u002F8.policy.md","Policy and confirmation",{"type":7,"value":8,"toc":1843},"minimark",[9,30,134,141,166,321,325,340,401,406,412,452,465,471,488,491,497,518,724,732,736,746,879,890,930,935,1060,1066,1070,1081,1131,1169,1183,1205,1223,1227,1239,1243,1288,1292,1307,1614,1649,1652,1661,1669,1672,1759,1773,1807,1817,1823,1827,1833,1839],[10,11,12,13,17,18,21,22,25,26,29],"p",{},"Before an Act command runs, ",[14,15,16],"code",{},"jawbd"," classifies it and decides ",[14,19,20],{},"allow",",\n",[14,23,24],{},"confirm",", or ",[14,27,28],{},"deny",". This is not opt-in — it applies to every agent\ndriving jawb, with no flag to switch it off.",[31,32,33,49],"table",{},[34,35,36],"thead",{},[37,38,39,43,46],"tr",{},[40,41,42],"th",{},"Class",[40,44,45],{},"Triggered by",[40,47,48],{},"Default",[50,51,52,66,81,96,119],"tbody",{},[37,53,54,60,64],{},[55,56,57],"td",{},[14,58,59],{},"upload",[55,61,62],{},[14,63,59],{},[55,65,24],{},[37,67,68,73,78],{},[55,69,70],{},[14,71,72],{},"download",[55,74,75,77],{},[14,76,72],{},", or navigation that starts a download",[55,79,80],{},"confirm when the file type is executable or unknown, otherwise allow",[37,82,83,88,93],{},[55,84,85],{},[14,86,87],{},"submit",[55,89,90,92],{},[14,91,87],{},", or a click\u002FEnter on a form's submit control",[55,94,95],{},"allow, unless the form has a password or payment field — then confirm",[37,97,98,103,106],{},[55,99,100],{},[14,101,102],{},"purchase-like",[55,104,105],{},"submitting a form with payment fields, clicking a purchase-lexicon label (buy, pay, place order, subscribe...), or a commerce-adapter checkout",[55,107,108,109,112,113,118],{},"by default needs a human-issued approval — ",[14,110,111],{},"--yes"," never satisfies it (see ",[114,115,117],"a",{"href":116},"#the-purchase-gate","the purchase gate",")",[37,120,121,126,132],{},[55,122,123],{},[14,124,125],{},"credential",[55,127,128,131],{},[14,129,130],{},"fill"," on a password field or a card-number-shaped field",[55,133,24],{},[135,136,138,140],"h2",{"id":137},"confirm-class",[14,139,24],{}," class",[10,142,143,144,146,147,150,151,154,155,158,159,162,163,165],{},"Everything except ",[14,145,102],{}," follows this flow. On an interactive\nterminal, jawb prompts you and, on your answer, retries with a\nsingle-use ",[14,148,149],{},"confirm_token"," (expires after 60s). In ",[14,152,153],{},"--json"," mode or on a\nnon-interactive terminal, jawb exits 5 with ",[14,156,157],{},"E_CONFIRMATION_REQUIRED"," and\nthe token, so a calling agent can surface it or retry with\n",[14,160,161],{},"--confirm-token \u003Ct>",". ",[14,164,111],{}," pre-confirms this class without a prompt:",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-bash shiki shiki-themes github-light github-dark","$ jawb upload --role textbox:Resume resume.txt\nerror: this upload action needs confirmation (E_CONFIRMATION_REQUIRED)\nconfirm token (upload): ct_c4wk43ztqc56vkq0cwzh\nhint: re-run the same command with --confirm-token \u003Ctoken> (or --yes)\n\n$ jawb upload --role textbox:Resume resume.txt --yes\nupload [40] ok: 1 file(s) sent as bytes\n","bash","",[14,174,175,201,225,236,281,288,307],{"__ignoreMap":172},[176,177,180,184,188,191,195,198],"span",{"class":178,"line":179},"line",1,[176,181,183],{"class":182},"sScJk","$",[176,185,187],{"class":186},"sZZnC"," jawb",[176,189,190],{"class":186}," upload",[176,192,194],{"class":193},"sj4cs"," --role",[176,196,197],{"class":186}," textbox:Resume",[176,199,200],{"class":186}," resume.txt\n",[176,202,204,207,210,212,215,218,221],{"class":178,"line":203},2,[176,205,206],{"class":182},"error:",[176,208,209],{"class":186}," this",[176,211,190],{"class":186},[176,213,214],{"class":186}," action",[176,216,217],{"class":186}," needs",[176,219,220],{"class":186}," confirmation",[176,222,224],{"class":223},"sVt8B"," (E_CONFIRMATION_REQUIRED)\n",[176,226,228,230,233],{"class":178,"line":227},3,[176,229,24],{"class":182},[176,231,232],{"class":186}," token",[176,234,235],{"class":223}," (upload): ct_c4wk43ztqc56vkq0cwzh\n",[176,237,239,242,245,248,251,254,257,260,264,267,270,273,276,278],{"class":178,"line":238},4,[176,240,241],{"class":182},"hint:",[176,243,244],{"class":186}," re-run",[176,246,247],{"class":186}," the",[176,249,250],{"class":186}," same",[176,252,253],{"class":186}," command",[176,255,256],{"class":186}," with",[176,258,259],{"class":193}," --confirm-token",[176,261,263],{"class":262},"szBVR"," \u003C",[176,265,266],{"class":186},"toke",[176,268,269],{"class":223},"n",[176,271,272],{"class":262},">",[176,274,275],{"class":223}," (or ",[176,277,111],{"class":193},[176,279,280],{"class":223},")\n",[176,282,284],{"class":178,"line":283},5,[176,285,287],{"emptyLinePlaceholder":286},true,"\n",[176,289,291,293,295,297,299,301,304],{"class":178,"line":290},6,[176,292,183],{"class":182},[176,294,187],{"class":186},[176,296,190],{"class":186},[176,298,194],{"class":193},[176,300,197],{"class":186},[176,302,303],{"class":186}," resume.txt",[176,305,306],{"class":193}," --yes\n",[176,308,310,312,315,318],{"class":178,"line":309},7,[176,311,59],{"class":182},[176,313,314],{"class":223}," [40] ok: 1 file(",[176,316,317],{"class":182},"s",[176,319,320],{"class":223},") sent as bytes\n",[135,322,324],{"id":323},"the-purchase-gate","The purchase gate",[10,326,327,328,330,331,334,335,339],{},"What ",[14,329,16],{}," does when it detects a purchase-like effect is the\n",[14,332,333],{},"purchase.gate"," setting (see ",[114,336,338],{"href":337},"\u002Fdocs\u002Fconfig","Configuration","). It can\nbe set globally and per profile; incognito sessions use the global value.",[31,341,342,353],{},[34,343,344],{},[37,345,346,350],{},[40,347,348],{},[14,349,333],{},[40,351,352],{},"Effect",[50,354,355,366,383],{},[37,356,357,363],{},[55,358,359,362],{},[14,360,361],{},"approve"," (default)",[55,364,365],{},"The action is held until a human approves it (below).",[37,367,368,372],{},[55,369,370],{},[14,371,28],{},[55,373,374,375,378,379,382],{},"The action is refused with ",[14,376,377],{},"E_POLICY_DENIED"," (",[14,380,381],{},"details.reason: \"purchase_denied\"","). Nothing is held, and nobody is asked.",[37,384,385,389],{},[55,386,387],{},[14,388,20],{},[55,390,391,392,395,396,400],{},"The action is not held, and the command's envelope carries the warning ",[14,393,394],{},"W_PURCHASE_UNGATED",". Weaker than the default, so it takes effect only after a human approves it in the current daemon run (see ",[114,397,399],{"href":398},"#weakening-a-safety-setting","weakening a safety setting",").",[402,403,405],"h3",{"id":404},"detection-modes","Detection modes",[10,407,408,411],{},[14,409,410],{},"purchase.detection"," chooses how much jawb treats as a purchase.",[413,414,415,425],"ul",{},[416,417,418,424],"li",{},[419,420,421],"strong",{},[14,422,423],{},"standard"," applies three layers: a label and form classifier; a\nmarker on purchase-like form submissions that the network layer refuses\nunless a human approved the action; and an effect-level hold, during and\nfor 3 s after an agent action, on state-changing requests to a checkout\npath or that carry a card number.",[416,426,427,432,433,435,436,439,440,443,444,447,448,451],{},[419,428,429],{},[14,430,431],{},"strict"," (the default) is everything in ",[14,434,423],{},", plus a\n",[419,437,438],{},"payment-context hold",". A tab enters payment context when its page\nhas a payment field (",[14,441,442],{},"autocomplete=cc-*",", or a card-, CVC- or IBAN-like\nname), when it loads a frame from a known payment provider (Stripe,\nAdyen, Braintree, PayPal, Google Pay, Checkout.com, Square, Klarna), or\nwhen its top-level path names a purchase step such as ",[14,445,446],{},"checkout",". The\ncontext lasts 30 minutes after the last such signal, across navigations\nwithin the same site. While it lasts, every state-changing request from\nthat tab (any non-GET\u002FHEAD\u002FOPTIONS request, a beacon or ping, or a\npage-initiated navigation with a query string) is held if an agent action\nis running, and otherwise refused. A refused request shows up as the\nwarning ",[14,449,450],{},"W_PAYMENT_CONTEXT_REFUSED"," on the tab's next command. An\napproved purchase arms the tab for that action and 60 s after it, so a\nmulti-request checkout or a 3-D Secure step can finish.",[10,453,454,457,458,460,461,464],{},[419,455,456],{},"The trade-off."," ",[14,459,431],{}," holds more. On a checkout-adjacent page you\nwill be asked for approval on requests that are not purchases (a coupon\ncheck, an address update), and a page that opens a WebSocket on such a\npage may not work until a purchase is approved. If that costs more than\nit protects, ",[14,462,463],{},"purchase.detection = \"standard\""," is available, but it is a\nweakening change that needs a human approval each daemon start.",[10,466,467,470],{},[419,468,469],{},"What neither mode catches."," These are known gaps, not edge cases to\nhope away:",[413,472,473,479,485],{},[416,474,475,478],{},[419,476,477],{},"WebSocket handshakes are not blocked in either mode."," Chrome's\nrequest interception does not see them.",[416,480,481,484],{},[419,482,483],{},"A page with no payment signals at all is not detected",", for\nexample a saved-card one-click button on an otherwise neutral page.",[416,486,487],{},"A GET request that the server treats as an order, requests sent more than\n3 s after an agent action when no payment context exists, and a purchase\nthat a hostile page deliberately disguises.",[10,489,490],{},"The purchase gate is a safeguard for honest checkout flows. It is not a\nguarantee against a hostile page.",[135,492,494,496],{"id":493},"purchase-like-class-human-confirmation-only",[14,495,102],{}," class — human confirmation only",[10,498,499,500,503,504,378,507,510,511,514,515,517],{},"Under ",[14,501,502],{},"purchase.gate = \"approve\"",", purchase-like actions are held by the\ndaemon as a ",[419,505,506],{},"pending confirmation",[14,508,509],{},"pc_...",", expires after\n",[14,512,513],{},"approval.timeout_s",", 120 s by default) and return\n",[14,516,157],{}," — but with no token, ever, to the agent that\ntriggered it:",[167,519,521],{"className":169,"code":520,"language":171,"meta":172,"style":172},"$ jawb click --text \"Place order\"\nerror: this purchase-like action is held until a human approves it (E_CONFIRMATION_REQUIRED)\npending purchase-like confirmation: pc_348xpkg9ga5v (no token is issued to this process)\nhint: a human must run `jawb confirm pc_348xpkg9ga5v` in their own terminal; then collect the result with --await-confirm pc_348xpkg9ga5v\n\n$ jawb click --text \"Place order\" --yes\nerror: this purchase-like action is held until a human approves it (E_CONFIRMATION_REQUIRED)\npending purchase-like confirmation: pc_t0na2qwwbqmg (no token is issued to this process)\n",[14,522,523,538,572,606,651,655,670,696],{"__ignoreMap":172},[176,524,525,527,529,532,535],{"class":178,"line":179},[176,526,183],{"class":182},[176,528,187],{"class":186},[176,530,531],{"class":186}," click",[176,533,534],{"class":193}," --text",[176,536,537],{"class":186}," \"Place order\"\n",[176,539,540,542,544,547,549,552,555,558,561,564,567,570],{"class":178,"line":203},[176,541,206],{"class":182},[176,543,209],{"class":186},[176,545,546],{"class":186}," purchase-like",[176,548,214],{"class":186},[176,550,551],{"class":186}," is",[176,553,554],{"class":186}," held",[176,556,557],{"class":186}," until",[176,559,560],{"class":186}," a",[176,562,563],{"class":186}," human",[176,565,566],{"class":186}," approves",[176,568,569],{"class":186}," it",[176,571,224],{"class":223},[176,573,574,577,579,582,585,588,591,593,596,599,601,604],{"class":178,"line":227},[176,575,576],{"class":182},"pending",[176,578,546],{"class":186},[176,580,581],{"class":186}," confirmation:",[176,583,584],{"class":186}," pc_348xpkg9ga5v",[176,586,587],{"class":223}," (no ",[176,589,590],{"class":186},"token",[176,592,551],{"class":186},[176,594,595],{"class":186}," issued",[176,597,598],{"class":186}," to",[176,600,209],{"class":186},[176,602,603],{"class":186}," process",[176,605,280],{"class":223},[176,607,608,610,612,614,617,620,623,626,629,632,635,638,640,643,645,648],{"class":178,"line":238},[176,609,241],{"class":182},[176,611,560],{"class":186},[176,613,563],{"class":186},[176,615,616],{"class":186}," must",[176,618,619],{"class":186}," run",[176,621,622],{"class":186}," `",[176,624,625],{"class":182},"jawb",[176,627,628],{"class":186}," confirm pc_348xpkg9ga5v`",[176,630,631],{"class":223}," in their own terminal; ",[176,633,634],{"class":262},"then",[176,636,637],{"class":182}," collect",[176,639,247],{"class":186},[176,641,642],{"class":186}," result",[176,644,256],{"class":186},[176,646,647],{"class":193}," --await-confirm",[176,649,650],{"class":186}," pc_348xpkg9ga5v\n",[176,652,653],{"class":178,"line":283},[176,654,287],{"emptyLinePlaceholder":286},[176,656,657,659,661,663,665,668],{"class":178,"line":290},[176,658,183],{"class":182},[176,660,187],{"class":186},[176,662,531],{"class":186},[176,664,534],{"class":193},[176,666,667],{"class":186}," \"Place order\"",[176,669,306],{"class":193},[176,671,672,674,676,678,680,682,684,686,688,690,692,694],{"class":178,"line":309},[176,673,206],{"class":182},[176,675,209],{"class":186},[176,677,546],{"class":186},[176,679,214],{"class":186},[176,681,551],{"class":186},[176,683,554],{"class":186},[176,685,557],{"class":186},[176,687,560],{"class":186},[176,689,563],{"class":186},[176,691,566],{"class":186},[176,693,569],{"class":186},[176,695,224],{"class":223},[176,697,699,701,703,705,708,710,712,714,716,718,720,722],{"class":178,"line":698},8,[176,700,576],{"class":182},[176,702,546],{"class":186},[176,704,581],{"class":186},[176,706,707],{"class":186}," pc_t0na2qwwbqmg",[176,709,587],{"class":223},[176,711,590],{"class":186},[176,713,551],{"class":186},[176,715,595],{"class":186},[176,717,598],{"class":186},[176,719,209],{"class":186},[176,721,603],{"class":186},[176,723,280],{"class":223},[10,725,726,728,729,731],{},[14,727,111],{}," and ",[14,730,153],{}," make no difference — the class is human-only in\nevery mode. A human approves it through one of the approval channels\nbelow.",[402,733,735],{"id":734},"approval-channels","Approval channels",[10,737,738,741,742,745],{},[14,739,740],{},"approval.channels"," lists the channels in order of preference. The default is\n",[14,743,744],{},"[\"desktop\", \"prompt\", \"terminal\"]",".",[747,748,749,767,806],"ol",{},[416,750,751,757,758,760,761,764,765,745],{},[419,752,753,754,400],{},"Desktop app (",[14,755,756],{},"desktop"," The jawb desktop app (in development,\nnot yet released) lists pending\nconfirmations and approves or denies them. While the app is open\nit is treated as present, and ",[14,759,16],{}," does not raise its own prompt\nunless ",[14,762,763],{},"prompt"," is listed before ",[14,766,756],{},[416,768,769,457,774,776,777,780,781,784,785,788,789,792,793,797,798,801,802,805],{},[419,770,771,772,400],{},"OS verification prompt (",[14,773,763],{},[14,775,16],{}," itself raises the\noperating system's user-verification dialog when a hold is created, with\nthe text \"Approve purchase on ",[14,778,779],{},"\u003Chost>",": ",[14,782,783],{},"\u003Camount>"," (jawb, profile ",[14,786,787],{},"\u003Cp>",")\".\nApprove with your PIN or biometrics and the purchase proceeds; cancel\nand the hold is denied. Today this exists on ",[419,790,791],{},"Windows only"," (Windows\nHello). macOS and Linux have no verifier yet, so approvals there are\nrecorded as \"asserted\" (see ",[114,794,796],{"href":795},"#assurance-labels","assurance labels",").\nThe prompt is skipped when ",[14,799,800],{},"approval.assurance"," is ",[14,803,804],{},"asserted",", when no\nverifier is available, and for 30 s after you deny a hold on the same\ntab (a quiet period). One prompt shows at a time; further holds queue.",[416,807,808,457,814,817,818,821,822,825,826,828,829,832,833,162,836,838,839,842,843,846,847,850,851,854,855,857,858,861,862,865,866,869,870,872,873,875,876,745],{},[419,809,810,811,400],{},"Terminal (",[14,812,813],{},"terminal",[14,815,816],{},"jawb confirm",". On the interactive terminal\nthat is running the command, jawb shows the summary and asks you to\ntype ",[14,819,820],{},"purchase",". From a separate terminal, at any time before the\npending confirmation expires, run ",[14,823,824],{},"jawb confirm \u003Cpc_id>",": it shows the\nsummary, requires the typed word ",[14,827,820],{}," on an interactive TTY, and\napproves it. The agent that triggered the action re-collects the\nresult with ",[14,830,831],{},"jawb trace --tab \u003Ct>"," or by re-running with\n",[14,834,835],{},"--await-confirm \u003Cpc_id>",[14,837,816],{}," also approves a\n",[114,840,841],{"href":398},"weakening setting change"," (class\n",[14,844,845],{},"config","): it lists the changes and asks for the word ",[14,848,849],{},"weaken","\ninstead.",[852,853],"br",{},"An approval from the terminal still goes through the OS verification\nwhere one is available: jawb lets ",[14,856,16],{},"'s prompt come to the\nforeground, prints \"Verify with Windows Hello on this computer\", and\nwaits until you answer it or the confirmation expires. It then prints\nthe ",[114,859,860],{"href":795},"assurance label"," of the result, for example\n",[14,863,864],{},"approved pc_... (confirmed via tty-verified: the operating system verified you)",". The approval carries the confirmation's ",[14,867,868],{},"digest",", so\nit only approves the request you were shown. ",[14,871,816],{}," needs\n",[14,874,16],{}," API level 12 or later and refuses an older daemon with\n",[14,877,878],{},"E_VERSION_MISMATCH",[10,880,881,882,884,885,889],{},"At the terminal prompts you can type ",[14,883,28],{}," instead to decline the action\n(see ",[114,886,888],{"href":887},"#declining-a-held-action","Declining a held action","). Anything else\nleaves the action held until it expires.",[10,891,892,893,896,897,900,901,801,903,906,907,21,910,913,914,917,918,921,922,925,926,929],{},"When an approval is refused, jawb prints the reason and what it means:\n",[14,894,895],{},"verification_canceled"," (you canceled the OS prompt; still pending, try\nagain), ",[14,898,899],{},"verification_unavailable"," (no verifier could run and\n",[14,902,800],{},[14,904,905],{},"verified","), ",[14,908,909],{},"verification_failed",[14,911,912],{},"verification_in_progress"," (a prompt for it is already open),\n",[14,915,916],{},"digest_mismatch"," (the held request is not the one you were shown),\n",[14,919,920],{},"expired",", ",[14,923,924],{},"denied",", and ",[14,927,928],{},"superseded"," (a newer setting change replaced\nit). Nothing is approved in any of these cases.",[10,931,932,934],{},[14,933,816],{}," itself refuses to run non-interactively:",[167,936,938],{"className":169,"code":937,"language":171,"meta":172,"style":172},"$ jawb confirm pc_from_above\nerror: `jawb confirm` only runs on an interactive terminal (no --json, no --yes, stdin must be a TTY) (E_CONFIRMATION_REQUIRED)\npending confirmation: pc_from_above (no token is issued to this process)\nhint: run `jawb confirm` yourself in a terminal\n",[14,939,940,952,1012,1037],{"__ignoreMap":172},[176,941,942,944,946,949],{"class":178,"line":179},[176,943,183],{"class":182},[176,945,187],{"class":186},[176,947,948],{"class":186}," confirm",[176,950,951],{"class":186}," pc_from_above\n",[176,953,954,956,958,960,963,966,969,972,975,978,981,983,986,989,992,995,997,1000,1002,1005,1008,1010],{"class":178,"line":203},[176,955,206],{"class":182},[176,957,622],{"class":186},[176,959,625],{"class":182},[176,961,962],{"class":186}," confirm`",[176,964,965],{"class":182}," only",[176,967,968],{"class":186}," runs",[176,970,971],{"class":186}," on",[176,973,974],{"class":186}," an",[176,976,977],{"class":186}," interactive",[176,979,980],{"class":186}," terminal",[176,982,587],{"class":223},[176,984,985],{"class":193},"--json,",[176,987,988],{"class":186}," no",[176,990,991],{"class":193}," --yes,",[176,993,994],{"class":186}," stdin",[176,996,616],{"class":186},[176,998,999],{"class":186}," be",[176,1001,560],{"class":186},[176,1003,1004],{"class":186}," TTY",[176,1006,1007],{"class":223},") (",[176,1009,157],{"class":182},[176,1011,280],{"class":223},[176,1013,1014,1016,1018,1021,1023,1025,1027,1029,1031,1033,1035],{"class":178,"line":227},[176,1015,576],{"class":182},[176,1017,581],{"class":186},[176,1019,1020],{"class":186}," pc_from_above",[176,1022,587],{"class":223},[176,1024,590],{"class":186},[176,1026,551],{"class":186},[176,1028,595],{"class":186},[176,1030,598],{"class":186},[176,1032,209],{"class":186},[176,1034,603],{"class":186},[176,1036,280],{"class":223},[176,1038,1039,1041,1043,1045,1047,1049,1052,1055,1057],{"class":178,"line":238},[176,1040,241],{"class":182},[176,1042,619],{"class":186},[176,1044,622],{"class":186},[176,1046,625],{"class":182},[176,1048,962],{"class":186},[176,1050,1051],{"class":182}," yourself",[176,1053,1054],{"class":186}," in",[176,1056,560],{"class":186},[176,1058,1059],{"class":186}," terminal\n",[10,1061,1062,1063,1065],{},"This stops an agent that uses the ",[14,1064,625],{}," CLI as intended from approving\nits own purchase: the CLI sends the separate confirmer credential only\nafter reading your typed confirmation on a real terminal.",[402,1067,1069],{"id":1068},"assurance-labels","Assurance labels",[10,1071,1072,1073,1076,1077,1080],{},"Every approval is recorded with ",[14,1074,1075],{},"confirmed_via",", in the trace, in the\nconfirmation record and in the completed action's step. The label is\n",[14,1078,1079],{},"\u003Cchannel>-\u003Cassurance>",":",[31,1082,1083,1093],{},[34,1084,1085],{},[37,1086,1087,1090],{},[40,1088,1089],{},"Channel prefix",[40,1091,1092],{},"Meaning",[50,1094,1095,1108,1118],{},[37,1096,1097,1102],{},[55,1098,1099],{},[14,1100,1101],{},"tty-",[55,1103,1104,1105,1107],{},"approved through ",[14,1106,816],{}," (terminal)",[37,1109,1110,1115],{},[55,1111,1112],{},[14,1113,1114],{},"desktop-",[55,1116,1117],{},"approved in the desktop app",[37,1119,1120,1125],{},[55,1121,1122],{},[14,1123,1124],{},"prompt-",[55,1126,1127,1128,1130],{},"approved at the prompt ",[14,1129,16],{}," raised itself",[31,1132,1133,1142],{},[34,1134,1135],{},[37,1136,1137,1140],{},[40,1138,1139],{},"Assurance suffix",[40,1141,1092],{},[50,1143,1144,1160],{},[37,1145,1146,1150],{},[55,1147,1148],{},[14,1149,905],{},[55,1151,1152,1153,1155,1156,1159],{},"the operating system reported a successful user verification (Windows Hello) to ",[14,1154,16],{}," itself, so a program that merely read ",[14,1157,1158],{},"confirm.token"," could not have produced it",[37,1161,1162,1166],{},[55,1163,1164],{},[14,1165,804],{},[55,1167,1168],{},"the client claimed a human approved it and jawb could not verify that",[10,1170,1171,1172,728,1175,1178,1179,1182],{},"So ",[14,1173,1174],{},"prompt-verified",[14,1176,1177],{},"desktop-verified"," are the strong results;\n",[14,1180,1181],{},"tty-asserted"," is what you get on macOS and Linux today.",[10,1184,1185,1187,1188,1191,1192,1194,1195,1197,1198,1201,1202,1204],{},[14,1186,800],{}," decides how the OS verification is used:\n",[14,1189,1190],{},"verified-if-available"," (default) verifies when a verifier exists and\notherwise records ",[14,1193,804],{},"; ",[14,1196,905],{}," always verifies and refuses an\napproval (",[14,1199,1200],{},"reason: \"verification_unavailable\"",") when no verifier is\navailable; ",[14,1203,804],{}," never calls the verifier.",[10,1206,1207,1210,1211,1213,1214,1216,1217,400],{},[419,1208,1209],{},"What an asserted approval does not stop."," The daemon cannot tell a\nperson from a program running under your user account. The confirmer\ncredential is a file in the data directory (",[14,1212,1158],{},"), and any\nprocess running as you, including an agent that ignores the CLI, can read\nit and call the approval endpoint directly. Where an approval is only\n",[14,1215,804],{},", treat the purchase prompt as a safeguard for well-behaved\nagents, not as protection against a compromised or prompt-injected one.\nA verified approval closes that gap\n(",[114,1218,1222],{"href":1219,"rel":1220},"https:\u002F\u002Fgithub.com\u002F4hum-ai\u002Fjawb\u002Fblob\u002Fmain\u002Fdocs\u002Farchitecture\u002Fadr\u002F0009-human-confirmation-authority.md",[1221],"nofollow","ADR 0009",[402,1224,1226],{"id":1225},"one-approval-one-action","One approval, one action",[10,1228,1229,1230,1232,1233,1235,1236,400],{},"Each approval authorizes exactly one action. It is bound to the held\nrequest (tab, action, target and arguments), and approving the same\npending confirmation again never runs the action a second time. An\napproval must come before the pending confirmation expires\n(",[14,1231,513],{},"); a request carrying the entry's ",[14,1234,868],{}," that\ndoes not match the held request is refused (",[14,1237,1238],{},"reason: \"digest_mismatch\"",[402,1240,1242],{"id":1241},"weakening-a-safety-setting","Weakening a safety setting",[10,1244,1245,1246,921,1248,21,1250,1252,1253,457,1256,1259,1260,1263,1264,1267,1268,1271,1272,1274,1275,1277,1278,1280,1281,162,1283,1285,1286,745],{},"The settings that protect you (",[14,1247,333],{},[14,1249,410],{},[14,1251,800],{},") have a floor: their built-in default. A value in\nthe configuration file that is weaker than the default does not take\neffect until a human approves it, through the same channels as a\npurchase, and that approval lasts only until the daemon exits. The prompt\nreads \"Allow jawb to weaken a safety setting: ",[14,1254,1255],{},"\u003Ckey>",[14,1257,1258],{},"\u003Cfrom>"," → ",[14,1261,1262],{},"\u003Cto>","\".\nEvery daemon start with a weaker-than-default file asks again. This is\nwhat stops an agent editing ",[14,1265,1266],{},"config.toml"," to switch the gate off. On a\nterminal, ",[14,1269,1270],{},"jawb config set"," asks you to type ",[14,1273,849],{}," on the spot; an\nagent's run, or ",[14,1276,153],{},", exits 5 with the pending ID, and you approve\nit with ",[14,1279,824],{}," and the word ",[14,1282,849],{},[14,1284,111],{}," never\napproves it. See ",[114,1287,338],{"href":337},[402,1289,1291],{"id":1290},"listing-pending-confirmations","Listing pending confirmations",[10,1293,1294,1295,1298,1299,1302,1303,1306],{},"An approvals screen, such as the jawb desktop app, can list every\npurchase-like confirmation still waiting for a human, without knowing\nits ",[14,1296,1297],{},"pc_"," ID, with ",[14,1300,1301],{},"GET \u002Fv1\u002Fconfirmations"," (daemon API level 3 or\nlater; the level is in the ",[14,1304,1305],{},"x-jawb-api"," response header):",[167,1308,1310],{"className":169,"code":1309,"language":171,"meta":172,"style":172},"$ curl -s -H \"Authorization: Bearer $(cat \"$JAWB_DATA_DIR\u002Fdaemon.token\")\" \\\n    http:\u002F\u002F127.0.0.1:4180\u002Fv1\u002Fconfirmations\n{\n  \"command\": \"confirmations\",\n  \"ok\": true,\n  \"result\": {\n    \"confirmations\": [\n      {\n        \"pending\": \"pc_v4kz827jhtw4\",\n        \"class\": \"purchase-like\",\n        \"state\": \"pending\",\n        \"tab\": \"t_qc78dj\",\n        \"action\": \"click\",\n        \"summary\": {\n          \"action\": \"click\",\n          \"target\": { \"id\": 14, \"label\": \"Place order\", \"role\": \"button\" },\n          \"url\": \"http:\u002F\u002F127.0.0.1:8767\u002Fcheckout.html\",\n          \"form\": \"name=Jane Doe\",\n          \"amount\": \"$42.00\"\n        },\n        \"created_ms\": 1791094203991,\n        \"expires_in_ms\": 119648,\n        \"confirmed_via\": null\n      }\n    ]\n  },\n  ...\n}\n",[14,1311,1312,1343,1348,1353,1363,1375,1385,1395,1400,1411,1422,1433,1444,1455,1465,1475,1507,1518,1529,1545,1551,1562,1573,1584,1590,1596,1602,1608],{"__ignoreMap":172},[176,1313,1314,1316,1319,1322,1325,1328,1331,1334,1337,1340],{"class":178,"line":179},[176,1315,183],{"class":182},[176,1317,1318],{"class":186}," curl",[176,1320,1321],{"class":193}," -s",[176,1323,1324],{"class":193}," -H",[176,1326,1327],{"class":186}," \"Authorization: Bearer $(",[176,1329,1330],{"class":182},"cat",[176,1332,1333],{"class":186}," \"",[176,1335,1336],{"class":223},"$JAWB_DATA_DIR",[176,1338,1339],{"class":186},"\u002Fdaemon.token\")\"",[176,1341,1342],{"class":193}," \\\n",[176,1344,1345],{"class":178,"line":203},[176,1346,1347],{"class":186},"    http:\u002F\u002F127.0.0.1:4180\u002Fv1\u002Fconfirmations\n",[176,1349,1350],{"class":178,"line":227},[176,1351,1352],{"class":223},"{\n",[176,1354,1355,1358,1360],{"class":178,"line":238},[176,1356,1357],{"class":182},"  \"command\"",[176,1359,1080],{"class":193},[176,1361,1362],{"class":186}," \"confirmations\",\n",[176,1364,1365,1368,1370,1373],{"class":178,"line":283},[176,1366,1367],{"class":182},"  \"ok\"",[176,1369,1080],{"class":193},[176,1371,1372],{"class":193}," true",[176,1374,21],{"class":186},[176,1376,1377,1380,1382],{"class":178,"line":290},[176,1378,1379],{"class":182},"  \"result\"",[176,1381,1080],{"class":193},[176,1383,1384],{"class":186}," {\n",[176,1386,1387,1390,1392],{"class":178,"line":309},[176,1388,1389],{"class":182},"    \"confirmations\"",[176,1391,1080],{"class":193},[176,1393,1394],{"class":223}," [\n",[176,1396,1397],{"class":178,"line":698},[176,1398,1399],{"class":223},"      {\n",[176,1401,1403,1406,1408],{"class":178,"line":1402},9,[176,1404,1405],{"class":182},"        \"pending\"",[176,1407,1080],{"class":193},[176,1409,1410],{"class":186}," \"pc_v4kz827jhtw4\",\n",[176,1412,1414,1417,1419],{"class":178,"line":1413},10,[176,1415,1416],{"class":182},"        \"class\"",[176,1418,1080],{"class":193},[176,1420,1421],{"class":186}," \"purchase-like\",\n",[176,1423,1425,1428,1430],{"class":178,"line":1424},11,[176,1426,1427],{"class":182},"        \"state\"",[176,1429,1080],{"class":193},[176,1431,1432],{"class":186}," \"pending\",\n",[176,1434,1436,1439,1441],{"class":178,"line":1435},12,[176,1437,1438],{"class":182},"        \"tab\"",[176,1440,1080],{"class":193},[176,1442,1443],{"class":186}," \"t_qc78dj\",\n",[176,1445,1447,1450,1452],{"class":178,"line":1446},13,[176,1448,1449],{"class":182},"        \"action\"",[176,1451,1080],{"class":193},[176,1453,1454],{"class":186}," \"click\",\n",[176,1456,1458,1461,1463],{"class":178,"line":1457},14,[176,1459,1460],{"class":182},"        \"summary\"",[176,1462,1080],{"class":193},[176,1464,1384],{"class":186},[176,1466,1468,1471,1473],{"class":178,"line":1467},15,[176,1469,1470],{"class":182},"          \"action\"",[176,1472,1080],{"class":193},[176,1474,1454],{"class":186},[176,1476,1478,1481,1483,1486,1489,1492,1495,1498,1501,1504],{"class":178,"line":1477},16,[176,1479,1480],{"class":182},"          \"target\"",[176,1482,1080],{"class":193},[176,1484,1485],{"class":186}," {",[176,1487,1488],{"class":186}," \"id\":",[176,1490,1491],{"class":186}," 14,",[176,1493,1494],{"class":186}," \"label\":",[176,1496,1497],{"class":186}," \"Place order\",",[176,1499,1500],{"class":186}," \"role\":",[176,1502,1503],{"class":186}," \"button\"",[176,1505,1506],{"class":186}," },\n",[176,1508,1510,1513,1515],{"class":178,"line":1509},17,[176,1511,1512],{"class":182},"          \"url\"",[176,1514,1080],{"class":193},[176,1516,1517],{"class":186}," \"http:\u002F\u002F127.0.0.1:8767\u002Fcheckout.html\",\n",[176,1519,1521,1524,1526],{"class":178,"line":1520},18,[176,1522,1523],{"class":182},"          \"form\"",[176,1525,1080],{"class":193},[176,1527,1528],{"class":186}," \"name=Jane Doe\",\n",[176,1530,1532,1535,1537,1539,1542],{"class":178,"line":1531},19,[176,1533,1534],{"class":182},"          \"amount\"",[176,1536,1080],{"class":193},[176,1538,1333],{"class":186},[176,1540,1541],{"class":223},"$42",[176,1543,1544],{"class":186},".00\"\n",[176,1546,1548],{"class":178,"line":1547},20,[176,1549,1550],{"class":223},"        },\n",[176,1552,1554,1557,1559],{"class":178,"line":1553},21,[176,1555,1556],{"class":182},"        \"created_ms\"",[176,1558,1080],{"class":193},[176,1560,1561],{"class":186}," 1791094203991,\n",[176,1563,1565,1568,1570],{"class":178,"line":1564},22,[176,1566,1567],{"class":182},"        \"expires_in_ms\"",[176,1569,1080],{"class":193},[176,1571,1572],{"class":186}," 119648,\n",[176,1574,1576,1579,1581],{"class":178,"line":1575},23,[176,1577,1578],{"class":182},"        \"confirmed_via\"",[176,1580,1080],{"class":193},[176,1582,1583],{"class":186}," null\n",[176,1585,1587],{"class":178,"line":1586},24,[176,1588,1589],{"class":223},"      }\n",[176,1591,1593],{"class":178,"line":1592},25,[176,1594,1595],{"class":223},"    ]\n",[176,1597,1599],{"class":178,"line":1598},26,[176,1600,1601],{"class":223},"  },\n",[176,1603,1605],{"class":178,"line":1604},27,[176,1606,1607],{"class":193},"  ...\n",[176,1609,1611],{"class":178,"line":1610},28,[176,1612,1613],{"class":223},"}\n",[10,1615,1616,1617,1620,1621,1623,1624,1626,1627,1630,1631,1634,1635,1637,1638,1641,1642,1645,1646,1648],{},"Each item has the same fields as ",[14,1618,1619],{},"GET \u002Fv1\u002Fconfirmations\u002F\u003Cpc_id>",". The\nlist also holds ",[14,1622,845],{}," confirmations (class ",[14,1625,845],{},", with ",[14,1628,1629],{},"tab"," and\n",[14,1632,1633],{},"action"," null) raised when a safety setting is weakened, so a client must\nnot assume every item is ",[14,1636,102],{},".\nOnly confirmations that are still pending appear, oldest first; once\none is approved, completed, denied or expired, it drops out. The list never\ncontains a token, and listing does not approve anything: approving\nstill needs the confirmer credential. Like every other ",[14,1639,1640],{},"\u002Fv1"," call, it\nneeds the bearer token and is refused when the request carries an\n",[14,1643,1644],{},"Origin"," header. There is no CLI command for it; in a terminal,\n",[14,1647,824],{}," remains the way to approve.",[402,1650,888],{"id":1651},"declining-a-held-action",[10,1653,1654,1655,1657,1658,1660],{},"A held action does not have to wait out its 120 s expiry. Type ",[14,1656,28],{},"\nat the ",[14,1659,824],{}," prompt (or at the inline purchase prompt):",[167,1662,1667],{"className":1663,"code":1665,"language":1666,"meta":172},[1664],"language-text","$ jawb confirm pc_c69grajbdcwm\njawb: t_t9f82t wants to perform a PURCHASE-LIKE action:\n  ...\nType `purchase` to approve it, or `deny` to decline it: deny\ndenied pc_c69grajbdcwm; the held action was not performed\n","text",[14,1668,1665],{"__ignoreMap":172},[10,1670,1671],{},"The action never runs. The agent that triggered it sees the refusal\nwhen it collects the result:",[167,1673,1675],{"className":169,"code":1674,"language":171,"meta":172,"style":172},"$ jawb --json click 14 --await-confirm pc_c69grajbdcwm\n{\"ok\": false, \"error\": {\"code\": \"E_POLICY_DENIED\",\n  \"message\": \"a human denied `pc_c69grajbdcwm`; the action was not performed\",\n  \"details\": {\"pending\": \"pc_c69grajbdcwm\", \"reason\": \"denied\"}}, ...}\n",[14,1676,1677,1696,1721,1737],{"__ignoreMap":172},[176,1678,1679,1681,1683,1686,1688,1691,1693],{"class":178,"line":179},[176,1680,183],{"class":182},[176,1682,187],{"class":186},[176,1684,1685],{"class":193}," --json",[176,1687,531],{"class":186},[176,1689,1690],{"class":193}," 14",[176,1692,647],{"class":193},[176,1694,1695],{"class":186}," pc_c69grajbdcwm\n",[176,1697,1698,1701,1704,1706,1709,1712,1715,1718],{"class":178,"line":203},[176,1699,1700],{"class":223},"{",[176,1702,1703],{"class":182},"\"ok\"",[176,1705,1080],{"class":193},[176,1707,1708],{"class":193}," false",[176,1710,1711],{"class":186},",",[176,1713,1714],{"class":186}," \"error\":",[176,1716,1717],{"class":186}," {\"code\":",[176,1719,1720],{"class":186}," \"E_POLICY_DENIED\",\n",[176,1722,1723,1726,1728,1731,1734],{"class":178,"line":227},[176,1724,1725],{"class":182},"  \"message\"",[176,1727,1080],{"class":193},[176,1729,1730],{"class":186}," \"a human denied `",[176,1732,1733],{"class":182},"pc_c69grajbdcwm",[176,1735,1736],{"class":186},"`; the action was not performed\",\n",[176,1738,1739,1742,1744,1747,1750,1753,1756],{"class":178,"line":238},[176,1740,1741],{"class":182},"  \"details\"",[176,1743,1080],{"class":193},[176,1745,1746],{"class":186}," {\"pending\":",[176,1748,1749],{"class":186}," \"pc_c69grajbdcwm\",",[176,1751,1752],{"class":186}," \"reason\":",[176,1754,1755],{"class":186}," \"denied\"}},",[176,1757,1758],{"class":186}," ...}\n",[10,1760,1761,1762,1765,1766,1769,1770,1772],{},"An approvals screen does the same with ",[14,1763,1764],{},"POST \u002Fv1\u002Fconfirmations\u002F\u003Cpc_id>\u002Fdeny"," (daemon API level 4 or later). It needs\nwhat approving needs: the bearer token, the confirmer credential in the\n",[14,1767,1768],{},"x-jawb-confirmer"," header, and no ",[14,1771,1644],{}," header. After a deny:",[413,1774,1775,1788,1793,1799],{},[416,1776,1777,1779,1780,1783,1784,1787],{},[14,1778,1619],{}," reports ",[14,1781,1782],{},"\"state\": \"denied\""," for 10\nminutes. This is a different state from ",[14,1785,1786],{},"\"expired\"",", which means that\nnobody answered.",[416,1789,1790,1791,745],{},"The confirmation leaves ",[14,1792,1301],{},[416,1794,1795,1796,1798],{},"Denying it again returns the same ",[14,1797,924],{}," record.",[416,1800,1801,1802,728,1804,745],{},"Approving it is refused with ",[14,1803,377],{},[14,1805,1806],{},"reason: \"denied\"",[10,1808,1809,1810,1813,1814,400],{},"A confirmation that was already approved cannot be denied\n(",[14,1811,1812],{},"reason: \"already_approved\"","), and an expired one cannot be either\n(",[14,1815,1816],{},"reason: \"expired\"",[10,1818,1819,1820,1822],{},"The limit described above applies to denying too. Any process running\nas you that can read ",[14,1821,1158],{}," can deny a held action, just as it\ncan approve one. A recorded deny is not proof that a person made the\ndecision.",[135,1824,1825],{"id":28},[14,1826,28],{},[10,1828,1829,1830,1832],{},"Returns ",[14,1831,377],{}," (exit 5). Nothing from the CLI can override it.",[10,1834,1835,1836,400],{},"Every policy decision — class, decision, and whether\u002Fhow it was\nconfirmed — is written to the trace (",[14,1837,1838],{},"jawb trace",[1840,1841,1842],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}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":172,"searchDepth":203,"depth":203,"links":1844},[1845,1847,1850,1859],{"id":137,"depth":203,"text":1846},"confirm class",{"id":323,"depth":203,"text":324,"children":1848},[1849],{"id":404,"depth":227,"text":405},{"id":493,"depth":203,"text":1851,"children":1852},"purchase-like class — human confirmation only",[1853,1854,1855,1856,1857,1858],{"id":734,"depth":227,"text":735},{"id":1068,"depth":227,"text":1069},{"id":1225,"depth":227,"text":1226},{"id":1241,"depth":227,"text":1242},{"id":1290,"depth":227,"text":1291},{"id":1651,"depth":227,"text":888},{"id":28,"depth":203,"text":28},"How jawb classifies actions, the purchase gate, and how a human approves.","md",{},null,"\u002Fdocs\u002Fcli\u002Fpolicy",{"title":5,"description":1860},"docs\u002F3.cli\u002F8.policy","mKVqvHpcSw6BTLKuiff5PLsNrL9Piwf_lZjOpHDqK84",[1869],{"title":1870,"path":1871,"stem":1872,"children":1873},"Documentation","\u002Fdocs","docs\u002F1.index",[1874,1875,1879,1883,1887,1909,1948,1962,1964,1968,1972,1976],{"title":1870,"path":1871,"stem":1872},{"title":1876,"path":1877,"stem":1878},"Protocol adapters","\u002Fdocs\u002Fprotocol","docs\u002F10.protocol",{"title":1880,"path":1881,"stem":1882},"Extensions","\u002Fdocs\u002Fextensions","docs\u002F11.extensions",{"title":1884,"path":1885,"stem":1886},"Roadmap and status","\u002Fdocs\u002Froadmap","docs\u002F12.roadmap",{"title":1888,"path":1889,"stem":1890,"children":1891},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F2.getting-started\u002F1.index",[1892,1893,1897,1901,1905],{"title":1888,"path":1889,"stem":1890},{"title":1894,"path":1895,"stem":1896},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F2.getting-started\u002F2.installation",{"title":1898,"path":1899,"stem":1900},"Desktop app","\u002Fdocs\u002Fgetting-started\u002Fdesktop-app","docs\u002F2.getting-started\u002F3.desktop-app",{"title":1902,"path":1903,"stem":1904},"Running the daemon","\u002Fdocs\u002Fgetting-started\u002Frunning-the-daemon","docs\u002F2.getting-started\u002F4.running-the-daemon",{"title":1906,"path":1907,"stem":1908},"Using the CLI","\u002Fdocs\u002Fgetting-started\u002Fusing-the-cli","docs\u002F2.getting-started\u002F5.using-the-cli",{"title":1910,"path":1911,"stem":1912,"children":1913},"CLI reference","\u002Fdocs\u002Fcli","docs\u002F3.cli\u002F1.index",[1914,1915,1919,1923,1927,1931,1935,1939,1943,1944],{"title":1910,"path":1911,"stem":1912},{"title":1916,"path":1917,"stem":1918},"JSON envelope and exit codes","\u002Fdocs\u002Fcli\u002Fjson-and-exit-codes","docs\u002F3.cli\u002F10.json-and-exit-codes",{"title":1920,"path":1921,"stem":1922},"jawb status","\u002Fdocs\u002Fcli\u002Fstatus","docs\u002F3.cli\u002F2.status",{"title":1924,"path":1925,"stem":1926},"Tabs, profiles and sessions","\u002Fdocs\u002Fcli\u002Ftabs-and-profiles","docs\u002F3.cli\u002F3.tabs-and-profiles",{"title":1928,"path":1929,"stem":1930},"jawb observe [\u003Curl>] [--full] [--interactive-only] [--js]","\u002Fdocs\u002Fcli\u002Fobserve","docs\u002F3.cli\u002F4.observe",{"title":1932,"path":1933,"stem":1934},"jawb read [--format md|text|json] [--element \u003Cid>] [--full] [--js]","\u002Fdocs\u002Fcli\u002Fread","docs\u002F3.cli\u002F5.read",{"title":1936,"path":1937,"stem":1938},"Act commands","\u002Fdocs\u002Fcli\u002Fact","docs\u002F3.cli\u002F6.act",{"title":1940,"path":1941,"stem":1942},"See commands","\u002Fdocs\u002Fcli\u002Fsee","docs\u002F3.cli\u002F7.see",{"title":5,"path":1864,"stem":1866},{"title":1945,"path":1946,"stem":1947},"Install lifecycle and profile settings","\u002Fdocs\u002Fcli\u002Flifecycle","docs\u002F3.cli\u002F9.lifecycle",{"title":1949,"path":1950,"stem":1951,"children":1952},"SDK reference","\u002Fdocs\u002Fsdk","docs\u002F4.sdk\u002F1.index",[1953,1954,1958],{"title":1949,"path":1950,"stem":1951},{"title":1955,"path":1956,"stem":1957},"Rust SDK — jawb-sdk-rust","\u002Fdocs\u002Fsdk\u002Frust-sdk","docs\u002F4.sdk\u002F2.rust-sdk",{"title":1959,"path":1960,"stem":1961},"Website SDK — @4hum-ai\u002Fjawb-sdk","\u002Fdocs\u002Fsdk\u002Fwebsite-sdk","docs\u002F4.sdk\u002F3.website-sdk",{"title":338,"path":337,"stem":1963},"docs\u002F5.config",{"title":1965,"path":1966,"stem":1967},"WebMCP","\u002Fdocs\u002Fwebmcp","docs\u002F6.webmcp",{"title":1969,"path":1970,"stem":1971},"Agents","\u002Fdocs\u002Fagents","docs\u002F7.agents",{"title":1973,"path":1974,"stem":1975},"MCP server","\u002Fdocs\u002Fmcp","docs\u002F8.mcp",{"title":1977,"path":1978,"stem":1979},"Security and trust","\u002Fdocs\u002Fsecurity","docs\u002F9.security",1792595702544]