[{"data":1,"prerenderedAt":4174},["ShallowReactive",2],{"navigation":3,"page:\u002Fconcepts\u002Fhuman-in-the-loop":1019,"surround:\u002Fconcepts\u002Fhuman-in-the-loop":4165},[4,21,82,133,154,1010],[5,6,7,8],"Getting started","\u002Fgetting-started","i-lucide-rocket",[9,12,15,18],[10,6,11,11],"What Kaabist is",0,[13,14,11,11],"API keys and modes","keys-and-modes",[16,17,11,11],"Your first job","first-job",[19,20,11,11],"Understanding the envelope","envelope",[22,23,24,25],"Concepts","\u002Fconcepts","i-lucide-book-open",[26,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79],[27,23,11,11],"Overview",[29,30,11,11],"Programs and versions","programs-and-versions",[32,33,11,11],"Tiers and escalation","tiers-and-escalation",[35,36,11,11],"The http tier","http-tier",[38,39,11,11],"The browser tier","browser-tier",[41,42,11,11],"Sessions","sessions",[44,45,11,11],"Human in the loop","human-in-the-loop",[47,48,11,11],"How healing works","self-healing",[50,51,11,11],"Obstacles and captchas","obstacles",[53,54,11,11],"Validation and warnings","validation-and-warnings",[56,57,11,11],"Credits and billing","credits-and-billing",[59,60,11,11],"Limits","limits",[62,63,11,11],"Locators","locators",[65,66,11,11],"Snapshots","snapshots",[68,69,11,11],"Egress and proxies","egress-and-proxies",[71,72,11,11],"Queueing and fairness","queueing",[74,75,11,11],"Accounts, organisations and roles","accounts-and-roles",[77,78,11,11],"Data retention","data-retention",[80,81,11,11],"Documents and PDFs","documents-and-pdfs",[83,84,85,86],"Guides","\u002Fguides","i-lucide-map",[87,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130],[27,84,11,11],[89,90,11,11],"Authenticated flows","authenticated-flows",[92,93,11,11],"Hosted resolve pages","hosted-resolve",[95,96,11,11],"Lists and pagination","lists-and-pagination",[98,99,11,11],"JSON and network locators","json-and-network-locators",[101,102,11,11],"Schedules and change detection","schedules-and-change-detection",[104,105,11,11],"Webhooks","webhooks",[107,108,11,11],"Bring your own providers","byo-providers",[110,111,11,11],"Testing: replay, dry-run and test mode","testing",[113,114,11,11],"Side-effect safety","side-effect-safety",[116,117,11,11],"Security & data handling","security-and-data",[119,120,11,11],"Migrating from other tools","migrating",[122,123,11,11],"Drift detection and canaries","drift-and-canaries",[125,126,11,11],"SDKs","sdks",[128,129,11,11],"The kaab CLI","cli",[131,132,11,11],"Coding agents (MCP)","mcp",[134,135,136,137],"Panel","\u002Fpanel","i-lucide-layout-dashboard",[138,139,142,145,148,151],[27,135,11,11],[140,141,11,11],"The program builder","builder",[143,144,11,11],"Picking and recording","picking-and-recording",[146,147,11,11],"Taking over a job","takeover",[149,150,11,11],"Getting help","support",[152,153,11,11],"Referrals","referrals",[155,156,157,158],"Reference","\u002Freference","i-lucide-library",[159,160,520,834,837,840,1006,1007],[27,156,11,11],[161,162,11,163],"API","api",[164,166,169,212,222,274,297,316,347,376,389,396,403,410,426,447,454],[27,165,11,11],"\u002Freference\u002Fapi",[167,168,11,11],"Interactive reference","explorer",[170,171,11,172],"Jobs","jobs",[173,176,179,182,185,188,191,194,197,200,203,206,209],[174,175,11,11],"Create job","create-job",[177,178,11,11],"List jobs","list-jobs",[180,181,11,11],"Create job batch","create-job-batch",[183,184,11,11],"Estimate job","estimate-job",[186,187,11,11],"Get job","get-job",[189,190,11,11],"List job steps","list-job-steps",[192,193,11,11],"Get job snapshot","get-job-snapshot",[195,196,11,11],"Get job screenshot","get-job-screenshot",[198,199,11,11],"Get job artifact","get-job-artifact",[201,202,11,11],"Submit job input","submit-job-input",[204,205,11,11],"Resume job","resume-job",[207,208,11,11],"Takeover job","takeover-job",[210,211,11,11],"Cancel job","cancel-job",[213,214,11,215],"Batches","batches",[216,219],[217,218,11,11],"Get batch","get-batch",[220,221,11,11],"List batch jobs","list-batch-jobs",[223,224,11,225],"Programs","programs",[226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271],[227,228,11,11],"Create program","create-program",[230,231,11,11],"List programs","list-programs",[233,234,11,11],"Lint program","lint-program",[236,237,11,11],"Get program","get-program",[239,240,11,11],"Update program","update-program",[242,243,11,11],"Delete program","delete-program",[245,246,11,11],"List program versions","list-program-versions",[248,249,11,11],"Create program version","create-program-version",[251,252,11,11],"Update program version","update-program-version",[254,255,11,11],"Delete program version","delete-program-version",[257,258,11,11],"Get program version","get-program-version",[260,261,11,11],"Publish program version","publish-program-version",[263,264,11,11],"Diff program version","diff-program-version",[266,267,11,11],"Replay program version","replay-program-version",[269,270,11,11],"Set program alias","set-program-alias",[272,273,11,11],"Delete program alias","delete-program-alias",[41,42,11,275],[276,279,282,285,288,291,294],[277,278,11,11],"Create session","create-session",[280,281,11,11],"List sessions","list-sessions",[283,284,11,11],"Get session","get-session",[286,287,11,11],"Update session","update-session",[289,290,11,11],"Delete session","delete-session",[292,293,11,11],"Verify session","verify-session",[295,296,11,11],"Refresh session","refresh-session",[298,299,11,300],"Proposals","proposals",[301,304,307,310,313],[302,303,11,11],"List proposals","list-proposals",[305,306,11,11],"Get proposal","get-proposal",[308,309,11,11],"Approve proposal","approve-proposal",[311,312,11,11],"Reject proposal","reject-proposal",[314,315,11,11],"Edit proposal","edit-proposal",[317,318,11,319],"Schedules","schedules",[320,323,326,329,332,335,338,341,344],[321,322,11,11],"Create schedule","create-schedule",[324,325,11,11],"List schedules","list-schedules",[327,328,11,11],"Get schedule","get-schedule",[330,331,11,11],"Update schedule","update-schedule",[333,334,11,11],"Delete schedule","delete-schedule",[336,337,11,11],"Pause schedule","pause-schedule",[339,340,11,11],"Resume schedule","resume-schedule",[342,343,11,11],"List schedule runs","list-schedule-runs",[345,346,11,11],"Get schedule run diff","get-schedule-run-diff",[104,105,11,348],[349,352,355,358,361,364,367,370,373],[350,351,11,11],"Create webhook","create-webhook",[353,354,11,11],"List webhooks","list-webhooks",[356,357,11,11],"Get webhook","get-webhook",[359,360,11,11],"Update webhook","update-webhook",[362,363,11,11],"Delete webhook","delete-webhook",[365,366,11,11],"Rotate webhook secret","rotate-webhook-secret",[368,369,11,11],"List webhook deliveries","list-webhook-deliveries",[371,372,11,11],"Resend webhook delivery","resend-webhook-delivery",[374,375,11,11],"Test webhook","test-webhook",[377,378,11,379],"Organisation","org",[380,383,386],[381,382,11,11],"Rotate org webhook secret","rotate-org-webhook-secret",[384,385,11,11],"Get org","get-org",[387,388,11,11],"Request data deletion","request-data-deletion",[390,391,11,392],"Credits","credits",[393],[394,395,11,11],"Get credits","get-credits",[397,398,11,399],"Ledger","ledger",[400],[401,402,11,11],"List ledger entries","list-ledger-entries",[404,405,11,406],"Usage","usage",[407],[408,409,11,11],"Get usage","get-usage",[411,412,11,413],"API keys","api-keys",[414,417,420,423],[415,416,11,11],"List API keys","list-api-keys",[418,419,11,11],"Create API key","create-api-key",[421,422,11,11],"Rotate API key","rotate-api-key",[424,425,11,11],"Revoke API key","revoke-api-key",[427,108,11,428],"BYO providers",[429,432,435,438,441,444],[430,431,11,11],"List BYO providers","list-byo-providers",[433,434,11,11],"Create BYO provider","create-byo-provider",[436,437,11,11],"Get BYO provider","get-byo-provider",[439,440,11,11],"Update BYO provider","update-byo-provider",[442,443,11,11],"Delete BYO provider","delete-byo-provider",[445,446,11,11],"Test BYO provider","test-byo-provider",[448,449,11,450],"Sites","sites",[451],[452,453,11,11],"Get site profile","get-site-profile",[455,456,11,457],"Objects","schemas",[458,460,463,466,469,470,473,476,479,482,485,487,490,493,496,499,502,505,508,511,514,517],[27,459,11,11],"\u002Freference\u002Fapi\u002Fschemas",[461,462,11,11],"ApiKey","api-key",[464,465,11,11],"Batch","batch",[467,468,11,11],"ByoProvider","byo-provider",[390,391,11,11],[471,472,11,11],"ErrorResponse","error-response",[474,475,11,11],"ExtractSchema","extract-schema",[477,478,11,11],"Job","job",[480,481,11,11],"LedgerEntry","ledger-entry",[483,484,11,11],"LintResult","lint-result",[486,378,11,11],"Org",[488,489,11,11],"Program","program",[491,492,11,11],"ProgramDefinition","program-definition",[494,495,11,11],"ProgramVersion","program-version",[497,498,11,11],"Proposal","proposal",[500,501,11,11],"Schedule","schedule",[503,504,11,11],"Session","session",[506,507,11,11],"SiteProfile","site-profile",[509,510,11,11],"StepRecord","step-record",[512,513,11,11],"Webhook","webhook",[515,516,11,11],"WebhookDelivery","webhook-delivery",[518,519,11,11],"WebhookEvent","webhook-event",[521,522,11,523],"DSL","dsl",[524,526,529,532,535,538,603,637,640,751,754,756],[27,525,11,11],"\u002Freference\u002Fdsl",[527,528,11,11],"Inputs","inputs",[530,531,11,11],"Options","options",[533,534,11,11],"Policies","policies",[536,537,11,11],"Steps","steps",[539,540,11,541],"Actions","actions",[542,544,546,548,550,552,554,556,558,560,562,565,568,570,573,575,577,579,582,585,587,589,591,594,596,598,600],[27,543,11,11],"\u002Freference\u002Fdsl\u002Factions",[545,545,11,11],"fill",[547,547,11,11],"click",[549,549,11,11],"press",[551,551,11,11],"hover",[553,553,11,11],"select",[555,555,11,11],"check",[557,557,11,11],"uncheck",[559,559,11,11],"upload",[561,561,11,11],"scroll",[563,564,11,11],"wait_for","wait-for",[566,567,11,11],"set_session","set-session",[569,569,11,11],"extract",[571,572,11,11],"capture_response","capture-response",[574,574,11,11],"evaluate",[576,576,11,11],"paginate",[578,578,11,11],"download",[580,581,11,11],"read_pdf","read-pdf",[583,584,11,11],"set_vars","set-vars",[586,586,11,11],"sleep",[588,588,11,11],"reload",[590,590,11,11],"goto",[592,593,11,11],"await_input","await-input",[595,595,11,11],"checkpoint",[597,597,11,11],"screenshot",[599,599,11,11],"when",[601,602,11,11],"loop_until","loop-until",[604,605,11,606],"Conditions","conditions",[607,609,611,613,615,617,619,621,623,625,627,629,631,633,635],[27,608,11,11],"\u002Freference\u002Fdsl\u002Fconditions",[610,610,11,11],"url",[612,612,11,11],"title",[614,614,11,11],"visible",[616,616,11,11],"hidden",[618,618,11,11],"exists",[620,620,11,11],"absent",[622,622,11,11],"text",[624,624,11,11],"count",[626,626,11,11],"network",[628,628,11,11],"var",[630,630,11,11],"landmark",[632,632,11,11],"all",[634,634,11,11],"any",[636,636,11,11],"not",[638,639,11,11],"Targets","targets",[641,642,11,643],"Fields","fields",[644,646,649,651,654,656,659,661,663,666,668,671,672,674,677,679,681,683,685,687,690,693,695,698,701,703,704,707,709,712,714,716,718,720,722,724,726,728,731,733,734,736,738,740,743,745,747,749],[27,645,11,11],"\u002Freference\u002Fdsl\u002Ffields",[647,648,11,11],"allow_suffix","allow-suffix",[650,650,11,11],"attr",[652,653,11,11],"base_url","base-url",[655,655,11,11],"candidates",[657,658,11,11],"case_insensitive","case-insensitive",[660,660,11,11],"country",[662,662,11,11],"currency",[664,665,11,11],"date_format","date-format",[667,667,11,11],"decimal",[669,670,11,11],"false_values","false-values",[642,642,11,11],[673,673,11,11],"flags",[675,676,11,11],"follow_redirects","follow-redirects",[678,678,11,11],"frame",[680,680,11,11],"json",[682,682,11,11],"locale",[684,684,11,11],"many",[686,686,11,11],"max",[688,689,11,11],"max_items","max-items",[691,692,11,11],"max_length","max-length",[694,694,11,11],"min",[696,697,11,11],"min_items","min-items",[699,700,11,11],"min_length","min-length",[702,702,11,11],"name",[626,626,11,11],[705,706,11,11],"null_markers","null-markers",[708,708,11,11],"nullable",[710,711,11,11],"on_invalid","on-invalid",[713,713,11,11],"pattern",[715,715,11,11],"presence",[717,717,11,11],"regex",[719,719,11,11],"required",[721,721,11,11],"role",[723,723,11,11],"sample",[725,725,11,11],"selector",[727,727,11,11],"source",[729,730,11,11],"strip_fragment","strip-fragment",[732,732,11,11],"testid",[622,622,11,11],[735,735,11,11],"thousands",[737,737,11,11],"timezone",[739,739,11,11],"transforms",[741,742,11,11],"true_values","true-values",[744,744,11,11],"type",[746,746,11,11],"unique",[748,748,11,11],"values",[750,750,11,11],"xpath",[752,753,11,11],"Assertions","assertions",[755,739,11,11],"Transforms",[757,758,11,759],"Lint codes","lint",[760,762,765,768,771,774,777,780,783,786,789,792,795,798,801,804,807,810,813,816,819,822,825,828,831],[27,761,11,11],"\u002Freference\u002Fdsl\u002Flint",[763,764,11,11],"E001","e001",[766,767,11,11],"E002","e002",[769,770,11,11],"E003","e003",[772,773,11,11],"E004","e004",[775,776,11,11],"E005","e005",[778,779,11,11],"E006","e006",[781,782,11,11],"E007","e007",[784,785,11,11],"E008","e008",[787,788,11,11],"E009","e009",[790,791,11,11],"E010","e010",[793,794,11,11],"E011","e011",[796,797,11,11],"E012","e012",[799,800,11,11],"E013","e013",[802,803,11,11],"E014","e014",[805,806,11,11],"W001","w001",[808,809,11,11],"W002","w002",[811,812,11,11],"W003","w003",[814,815,11,11],"W004","w004",[817,818,11,11],"W005","w005",[820,821,11,11],"W006","w006",[823,824,11,11],"W007","w007",[826,827,11,11],"W008","w008",[829,830,11,11],"W009","w009",[832,833,11,11],"W010","w010",[835,836,11,11],"Codes","codes",[838,839,11,11],"Events","events",[841,129,11,842],"CLI",[843,845,847,850,853,856,859,862,865,868,871,874,877,880,883,886,889,892,895,898,901,904,907,910,913,916,919,922,925,928,931,934,937,940,943,946,949,952,955,958,961,964,967,970,973,976,979,982,985,988,991,994,997,1000,1003],[27,844,11,11],"\u002Freference\u002Fcli",[846,846,11,11],"kaab",[848,849,11,11],"kaab auth","kaab-auth",[851,852,11,11],"kaab auth login","kaab-auth-login",[854,855,11,11],"kaab auth logout","kaab-auth-logout",[857,858,11,11],"kaab auth status","kaab-auth-status",[860,861,11,11],"kaab completion","kaab-completion",[863,864,11,11],"kaab completion bash","kaab-completion-bash",[866,867,11,11],"kaab completion fish","kaab-completion-fish",[869,870,11,11],"kaab completion powershell","kaab-completion-powershell",[872,873,11,11],"kaab completion zsh","kaab-completion-zsh",[875,876,11,11],"kaab credits","kaab-credits",[878,879,11,11],"kaab jobs","kaab-jobs",[881,882,11,11],"kaab jobs cancel","kaab-jobs-cancel",[884,885,11,11],"kaab jobs get","kaab-jobs-get",[887,888,11,11],"kaab jobs input","kaab-jobs-input",[890,891,11,11],"kaab jobs list","kaab-jobs-list",[893,894,11,11],"kaab jobs resume","kaab-jobs-resume",[896,897,11,11],"kaab jobs run","kaab-jobs-run",[899,900,11,11],"kaab jobs snapshot","kaab-jobs-snapshot",[902,903,11,11],"kaab jobs steps","kaab-jobs-steps",[905,906,11,11],"kaab jobs takeover","kaab-jobs-takeover",[908,909,11,11],"kaab open","kaab-open",[911,912,11,11],"kaab open job","kaab-open-job",[914,915,11,11],"kaab programs","kaab-programs",[917,918,11,11],"kaab programs alias","kaab-programs-alias",[920,921,11,11],"kaab programs alias set","kaab-programs-alias-set",[923,924,11,11],"kaab programs diff","kaab-programs-diff",[926,927,11,11],"kaab programs lint","kaab-programs-lint",[929,930,11,11],"kaab programs list","kaab-programs-list",[932,933,11,11],"kaab programs pull","kaab-programs-pull",[935,936,11,11],"kaab programs push","kaab-programs-push",[938,939,11,11],"kaab proposals","kaab-proposals",[941,942,11,11],"kaab proposals approve","kaab-proposals-approve",[944,945,11,11],"kaab proposals list","kaab-proposals-list",[947,948,11,11],"kaab proposals reject","kaab-proposals-reject",[950,951,11,11],"kaab proposals show","kaab-proposals-show",[953,954,11,11],"kaab schedules","kaab-schedules",[956,957,11,11],"kaab schedules create","kaab-schedules-create",[959,960,11,11],"kaab schedules list","kaab-schedules-list",[962,963,11,11],"kaab schedules pause","kaab-schedules-pause",[965,966,11,11],"kaab schedules resume","kaab-schedules-resume",[968,969,11,11],"kaab schedules runs","kaab-schedules-runs",[971,972,11,11],"kaab sessions","kaab-sessions",[974,975,11,11],"kaab sessions create","kaab-sessions-create",[977,978,11,11],"kaab sessions delete","kaab-sessions-delete",[980,981,11,11],"kaab sessions list","kaab-sessions-list",[983,984,11,11],"kaab sessions verify","kaab-sessions-verify",[986,987,11,11],"kaab usage","kaab-usage",[989,990,11,11],"kaab version","kaab-version",[992,993,11,11],"kaab webhooks","kaab-webhooks",[995,996,11,11],"kaab webhooks create","kaab-webhooks-create",[998,999,11,11],"kaab webhooks deliveries","kaab-webhooks-deliveries",[1001,1002,11,11],"kaab webhooks list","kaab-webhooks-list",[1004,1005,11,11],"kaab webhooks test","kaab-webhooks-test",[125,126,11,11],[1008,1009,11,11],"Plans and pricing","plans",[1011,1012,1013,1014],"Changelog","\u002Fchangelog","i-lucide-history",[1015,1016],[27,1012,11,11],[1017,1018,11,11],"Deprecations","deprecations",{"id":1020,"title":44,"body":1021,"breaking":4156,"date":4157,"description":4158,"extension":4159,"generated":4156,"meta":4160,"navigation":2025,"path":4161,"seo":4162,"stem":4163,"version":4157,"__hash__":4164},"docs\u002F2.concepts\u002F06.human-in-the-loop.md",{"type":1022,"value":1023,"toc":4137},"minimark",[1024,1028,1033,1050,1054,1083,1087,1090,1217,1236,1240,1247,1255,1261,1366,1380,1418,1439,1445,1455,1535,1562,1572,1576,1606,1644,1648,1654,1733,1756,1786,1804,1828,1831,1857,1860,1894,1898,1907,1929,1942,1946,1966,3015,3021,3038,3602,3625,3996,4000,4064,4067,4133],[1025,1026,1027],"p",{},"When a job needs a decision or a value only a person has, it parks: it saves a checkpoint, says what it needs, and waits instead of failing or guessing. You answer through the API, the panel or a hosted page, and the job carries on from where it stopped, never re-running a side effect it cannot prove did not happen.",[1029,1030,1032],"h2",{"id":1031},"when-to-use-it","When to use it",[1025,1034,1035,1036,1039,1040,1043,1044,1049],{},"Plan for parking whenever a program signs in with a one-time code, places an order, or runs against a site that changes without notice. Use ",[1037,1038,592],"code",{}," for values you know will be needed (a code from a phone), handle ",[1037,1041,1042],{},"needs_attention"," for everything Kaabist could not decide on its own, and use ",[1045,1046,1048],"a",{"href":1047},"\u002Fguides\u002Fhosted-resolve","hosted resolve pages"," when the person who can answer is your own customer rather than you.",[1029,1051,1053],{"id":1052},"how-a-step-runs","How a step runs",[1025,1055,1056,1057,1060,1061,1065,1066,1065,1068,1071,1072,1075,1076,1079,1080,1082],{},"Every step is a precondition, an action and a postcondition. For an action on an element, Kaabist first finds the element and waits, up to the step's ",[1037,1058,1059],{},"timeout_ms"," and checking four times a second, for it to be ",[1062,1063,1064],"strong",{},"there",", ",[1062,1067,614],{},[1062,1069,1070],{},"enabled"," and ",[1062,1073,1074],{},"not covered",". Only then does the action run. If the step has an ",[1037,1077,1078],{},"expect",", Kaabist then waits for that too: a step is finished when its postcondition holds, not when its click returned. An ",[1037,1081,1078],{}," on every navigation and every click is the difference between \"the button was clicked\" and \"the page did what the click was for\".",[1029,1084,1086],{"id":1085},"when-a-step-does-not-work","When a step does not work",[1025,1088,1089],{},"Kaabist classifies the failure, then does exactly one thing:",[1091,1092,1093,1106],"table",{},[1094,1095,1096],"thead",{},[1097,1098,1099,1103],"tr",{},[1100,1101,1102],"th",{},"What Kaabist decides",[1100,1104,1105],{},"What happens",[1107,1108,1109,1118,1126,1134,1146,1157,1168,1180,1194],"tbody",{},[1097,1110,1111,1115],{},[1112,1113,1114],"td",{},"a slow page, a dropped connection, a recycled browser",[1112,1116,1117],{},"waits and tries the step again, up to three times with backoff",[1097,1119,1120,1123],{},[1112,1121,1122],{},"the page needs a heavier tier",[1112,1124,1125],{},"takes a checkpoint and continues the job at the next tier",[1097,1127,1128,1131],{},[1112,1129,1130],{},"the element moved, and the new one is a confident match",[1112,1132,1133],{},"uses it for the rest of this job and reports it",[1097,1135,1136,1139],{},[1112,1137,1138],{},"the element moved, and the match is not confident",[1112,1140,1141,1142,1145],{},"parks ",[1037,1143,1144],{},"needs_attention: drift",", with proposals",[1097,1147,1148,1151],{},[1112,1149,1150],{},"the session has expired",[1112,1152,1153,1154],{},"runs the session's refresh program, or parks ",[1037,1155,1156],{},"session_expired",[1097,1158,1159,1162],{},[1112,1160,1161],{},"a dialog is in the way",[1112,1163,1164,1165],{},"dismisses it, or parks ",[1037,1166,1167],{},"needs_attention: obstacle",[1097,1169,1170,1173],{},[1112,1171,1172],{},"a captcha",[1112,1174,1175,1176,1179],{},"follows ",[1037,1177,1178],{},"policies.captcha",": park, solve or fail",[1097,1181,1182,1188],{},[1112,1183,1184,1185,1187],{},"the target or ",[1037,1186,1078],{}," fails on the step's own page",[1112,1189,1141,1190,1193],{},[1037,1191,1192],{},"needs_attention: unknown_page",", naming the selector",[1097,1195,1196,1199],{},[1112,1197,1198],{},"anything else",[1112,1200,1201,1202,1205,1206,1209,1210,1213,1214],{},"the step's ",[1037,1203,1204],{},"on_error",": ",[1037,1207,1208],{},"fail"," (the default), ",[1037,1211,1212],{},"skip"," or ",[1037,1215,1216],{},"park",[1025,1218,1219,1220,1223,1224,1227,1228,1231,1232,1235],{},"Two step keys change this. ",[1037,1221,1222],{},"optional: true"," turns a failure into a ",[1037,1225,1226],{},"step_skipped"," warning and moves on. ",[1037,1229,1230],{},"retry: { \"max\": 3, \"backoff_ms\": 1000 }"," sets how many times (0 to 5) a transient failure is retried. A step marked ",[1037,1233,1234],{},"side_effect: true"," can have neither.",[1029,1237,1239],{"id":1238},"parking","Parking",[1025,1241,1242,1243,1246],{},"A parked job releases its worker and holds no credits. Time parked is not billed and does not count against ",[1037,1244,1245],{},"max_duration_ms",". There are two parked states.",[1248,1249,1251,1254],"h3",{"id":1250},"awaiting_input-planned",[1037,1252,1253],{},"awaiting_input",": planned",[1025,1256,1257,1258,1260],{},"An ",[1037,1259,592],{}," step asks for a named value:",[1262,1263,1267],"pre",{"className":1264,"code":1265,"language":680,"meta":1266,"style":1266},"language-json shiki shiki-themes kaab-code kaab-code kaab-code","{ \"await_input\": { \"name\": \"otp\", \"prompt\": \"SMS code\", \"type\": \"string\", \"pattern\": \"^[0-9]{6}$\",\n  \"ttl\": \"5m\", \"expires\": \"24h\", \"collect\": \"api\" } }\n","",[1037,1268,1269,1332],{"__ignoreMap":1266},[1270,1271,1274,1278,1282,1286,1289,1292,1294,1298,1301,1304,1306,1309,1311,1314,1316,1319,1321,1324,1326,1329],"span",{"class":1272,"line":1273},"line",1,[1270,1275,1277],{"class":1276},"sTzsn","{ ",[1270,1279,1281],{"class":1280},"sqn18","\"await_input\"",[1270,1283,1285],{"class":1284},"sQm2-",":",[1270,1287,1288],{"class":1276}," { ",[1270,1290,1291],{"class":1280},"\"name\"",[1270,1293,1285],{"class":1284},[1270,1295,1297],{"class":1296},"suOy4"," \"otp\"",[1270,1299,1300],{"class":1284},",",[1270,1302,1303],{"class":1280}," \"prompt\"",[1270,1305,1285],{"class":1284},[1270,1307,1308],{"class":1296}," \"SMS code\"",[1270,1310,1300],{"class":1284},[1270,1312,1313],{"class":1280}," \"type\"",[1270,1315,1285],{"class":1284},[1270,1317,1318],{"class":1296}," \"string\"",[1270,1320,1300],{"class":1284},[1270,1322,1323],{"class":1280}," \"pattern\"",[1270,1325,1285],{"class":1284},[1270,1327,1328],{"class":1296}," \"^[0-9]{6}$\"",[1270,1330,1331],{"class":1284},",\n",[1270,1333,1335,1338,1340,1343,1345,1348,1350,1353,1355,1358,1360,1363],{"class":1272,"line":1334},2,[1270,1336,1337],{"class":1280},"  \"ttl\"",[1270,1339,1285],{"class":1284},[1270,1341,1342],{"class":1296}," \"5m\"",[1270,1344,1300],{"class":1284},[1270,1346,1347],{"class":1280}," \"expires\"",[1270,1349,1285],{"class":1284},[1270,1351,1352],{"class":1296}," \"24h\"",[1270,1354,1300],{"class":1284},[1270,1356,1357],{"class":1280}," \"collect\"",[1270,1359,1285],{"class":1284},[1270,1361,1362],{"class":1296}," \"api\"",[1270,1364,1365],{"class":1276}," } }\n",[1025,1367,1368,1369,1372,1373,1071,1376,1379],{},"The job's envelope carries ",[1037,1370,1371],{},"input_request"," with the name, prompt, type, pattern, a screenshot of the page, ",[1037,1374,1375],{},"keep_alive_until",[1037,1377,1378],{},"expires_at",". Two clocks run:",[1381,1382,1383,1400],"ul",{},[1384,1385,1386,1391,1392,1395,1396,1399],"li",{},[1062,1387,1388],{},[1037,1389,1390],{},"ttl"," (default ",[1037,1393,1394],{},"5m",", at most ",[1037,1397,1398],{},"15m","): the browser stays open on the page. An answer inside it carries on in that page, still signed in.",[1384,1401,1402,1391,1407,1395,1410,1413,1414,1417],{},[1062,1403,1404],{},[1037,1405,1406],{},"expires",[1037,1408,1409],{},"24h",[1037,1411,1412],{},"7d","): after the browser is released the job keeps waiting, checkpointed. An answer now reopens the checkpoint and carries on, a few seconds slower. Past it, the job fails with ",[1037,1415,1416],{},"input_expired",".",[1025,1419,1420,1423,1424,1427,1428,1431,1432,1434,1435,1438],{},[1037,1421,1422],{},"collect: \"api\""," means your code answers. ",[1037,1425,1426],{},"collect: \"hosted\""," puts a ",[1037,1429,1430],{},"resolve_url"," in ",[1037,1433,1371],{},", a page where your own end user types the value; set ",[1037,1436,1437],{},"hosted.notify"," to have Kaabist e-mail it.",[1248,1440,1442,1444],{"id":1441},"needs_attention-unplanned",[1037,1443,1042],{},": unplanned",[1025,1446,1447,1448,1071,1451,1454],{},"The job could not continue without a decision. Kaabist writes a checkpoint and an attention bundle, and the envelope's ",[1037,1449,1450],{},"reason",[1037,1452,1453],{},"attention.reason"," say why:",[1091,1456,1457,1467],{},[1094,1458,1459],{},[1097,1460,1461,1464],{},[1100,1462,1463],{},"Reason",[1100,1465,1466],{},"Meaning",[1107,1468,1469,1479,1489,1502,1511,1521],{},[1097,1470,1471,1476],{},[1112,1472,1473],{},[1037,1474,1475],{},"drift",[1112,1477,1478],{},"a field or target moved and the healer was not confident of the replacement",[1097,1480,1481,1486],{},[1112,1482,1483],{},[1037,1484,1485],{},"obstacle",[1112,1487,1488],{},"something covers the page that the obstacle layer could not dismiss",[1097,1490,1491,1496],{},[1112,1492,1493],{},[1037,1494,1495],{},"unknown_page",[1112,1497,1498,1499,1501],{},"the job is somewhere it did not expect, or a target or ",[1037,1500,1078],{}," failed on its own page",[1097,1503,1504,1508],{},[1112,1505,1506],{},[1037,1507,1156],{},[1112,1509,1510],{},"the session stopped working and could not be refreshed unattended",[1097,1512,1513,1518],{},[1112,1514,1515],{},[1037,1516,1517],{},"side_effect_ambiguous",[1112,1519,1520],{},"a side-effect step started and was never confirmed",[1097,1522,1523,1528],{},[1112,1524,1525],{},[1037,1526,1527],{},"captcha",[1112,1529,1530,1531,1534],{},"a captcha, with ",[1037,1532,1533],{},"policies.captcha: \"park\""," or a solver that could not finish",[1025,1536,1537,1540,1541,1544,1545,1547,1548,1065,1550,1552,1553,1555,1556,1558,1559,1417],{},[1037,1538,1539],{},"attention"," carries the step, a plain ",[1037,1542,1543],{},"detail",", a screenshot and snapshot, the ",[1037,1546,595],{}," it will resume from, any ",[1037,1549,299],{},[1037,1551,1378],{}," (seven days by default), and ",[1037,1554,540],{},", the resume actions this park accepts. Past ",[1037,1557,1378],{},", the job fails with ",[1037,1560,1561],{},"timeout",[1025,1563,1564,1565,1213,1568,1571],{},"Each park sends a webhook event, ",[1037,1566,1567],{},"job.awaiting_input",[1037,1569,1570],{},"job.needs_attention",", and appears in the panel's attention inbox.",[1029,1573,1575],{"id":1574},"answering-an-input","Answering an input",[1262,1577,1581],{"className":1578,"code":1579,"language":1580,"meta":1266,"style":1266},"language-http shiki shiki-themes kaab-code kaab-code kaab-code","POST \u002Fv1\u002Fjobs\u002F{id}\u002Finput\n{ \"otp\": \"482913\" }\n","http",[1037,1582,1583,1591],{"__ignoreMap":1266},[1270,1584,1585,1588],{"class":1272,"line":1273},[1270,1586,1587],{"class":1280},"POST",[1270,1589,1590],{"class":1276}," \u002Fv1\u002Fjobs\u002F{id}\u002Finput\n",[1270,1592,1593,1595,1598,1600,1603],{"class":1272,"line":1334},[1270,1594,1277],{"class":1276},[1270,1596,1597],{"class":1280},"\"otp\"",[1270,1599,1285],{"class":1284},[1270,1601,1602],{"class":1296}," \"482913\"",[1270,1604,1605],{"class":1276}," }\n",[1025,1607,1608,1609,1612,1613,1616,1617,1205,1620,1623,1624,1627,1628,1631,1632,1635,1636,1639,1640,1643],{},"or ",[1037,1610,1611],{},"{ \"values\": { \"otp\": \"482913\" } }",". The value is checked against the step's type and pattern, lands in ",[1037,1614,1615],{},"vars.otp",", and the job answers ",[1037,1618,1619],{},"200",[1037,1621,1622],{},"running"," when the browser was still open, ",[1037,1625,1626],{},"queued"," when it has to reopen the checkpoint. ",[1037,1629,1630],{},"409 job_not_waiting"," means the job is not waiting for input; ",[1037,1633,1634],{},"410 input_expired"," means it stopped waiting; ",[1037,1637,1638],{},"402 insufficient_credits"," means the job cannot reserve its credits again, and it stays parked. A ",[1037,1641,1642],{},"secret","-typed value never appears in any log, snapshot or response.",[1029,1645,1647],{"id":1646},"the-five-resume-actions","The five resume actions",[1025,1649,1650,1653],{},[1037,1651,1652],{},"POST \u002Fv1\u002Fjobs\u002F{id}\u002Fresume"," takes exactly one of:",[1091,1655,1656,1666],{},[1094,1657,1658],{},[1097,1659,1660,1663],{},[1100,1661,1662],{},"Body",[1100,1664,1665],{},"What it does",[1107,1667,1668,1682,1692,1706,1720],{},[1097,1669,1670,1675],{},[1112,1671,1672],{},[1037,1673,1674],{},"{ \"apply\": \"prp_…\", \"promote\": false, \"remember\": \"none\" }",[1112,1676,1677,1678,1681],{},"applies a proposal from ",[1037,1679,1680],{},"attention.proposals"," and carries on",[1097,1683,1684,1689],{},[1112,1685,1686],{},[1037,1687,1688],{},"{ \"skip_step\": true }",[1112,1690,1691],{},"skips the step that parked and carries on with the next",[1097,1693,1694,1699],{},[1112,1695,1696],{},[1037,1697,1698],{},"{ \"retry_from\": \"logged_in\" }",[1112,1700,1701,1702,1705],{},"runs again from a checkpoint, by name or by id (",[1037,1703,1704],{},"attention.checkpoint",")",[1097,1707,1708,1713],{},[1112,1709,1710],{},[1037,1711,1712],{},"{ \"continue\": true }",[1112,1714,1715,1716,1719],{},"carries on after a ",[1045,1717,147],{"href":1718},"\u002Fpanel\u002Ftakeover",", from the page the person left",[1097,1721,1722,1727],{},[1112,1723,1724],{},[1037,1725,1726],{},"{ \"abort\": true }",[1112,1728,1729,1730],{},"ends the job as ",[1037,1731,1732],{},"canceled",[1025,1734,1735,1736,1738,1739,1741,1742,1744,1745,1748,1749,1071,1752,1755],{},"The answer is ",[1037,1737,1619],{}," with the job, ",[1037,1740,1626],{}," (or ",[1037,1743,1732],{}," after ",[1037,1746,1747],{},"abort","). ",[1037,1750,1751],{},"promote",[1037,1753,1754],{},"remember"," decide whether a fix outlives this job:",[1381,1757,1758,1767,1780],{},[1384,1759,1760,1071,1763,1766],{},[1037,1761,1762],{},"promote: false",[1037,1764,1765],{},"remember: \"none\""," (the defaults) apply the fix to this job only.",[1384,1768,1769,1772,1773,1776,1777,1417],{},[1037,1770,1771],{},"promote: true"," publishes a new program version with the fix, moving ",[1037,1774,1775],{},"latest"," but not ",[1037,1778,1779],{},"production",[1384,1781,1782,1785],{},[1037,1783,1784],{},"remember: \"site\""," records a dismissed obstacle on the site's profile, so later jobs dismiss it without asking.",[1025,1787,1788,1789,1792,1793,1796,1797,1800,1801,1803],{},"Both are approvals and are recorded in the audit log. Refusals: ",[1037,1790,1791],{},"409"," when the job is not parked, ",[1037,1794,1795],{},"409 fence_open"," for a ",[1037,1798,1799],{},"retry_from"," across a side effect that ran, and ",[1037,1802,1638],{},", with the job left parked.",[1025,1805,1806,1807,1065,1809,1071,1812,1815,1816,1819,1820,1065,1823,1213,1825,1417],{},"A resume soon after the park (the browser is held for a few minutes) carries on in the same page. Later, the run reopens the checkpoint's storage state and URL and checks that it really is back where it stopped. If the checkpoint's URL now lands somewhere else (a page behind a single sign-on hop), ",[1037,1808,1799],{},[1037,1810,1811],{},"apply",[1037,1813,1814],{},"continue"," replay from the newest earlier checkpoint whose page opens, or from the start, never across a side effect that ran. Data extracted before the park stays in the result, and ",[1037,1817,1818],{},"meta.resumed_from"," says how the run carried on: ",[1037,1821,1822],{},"page",[1037,1824,595],{},[1037,1826,1827],{},"replay",[1029,1829,92],{"id":1830},"hosted-resolve-pages",[1025,1832,1833,1834,1837,1838,1840,1841,1844,1845,1848,1849,1213,1852,1854,1855,1417],{},"A hosted resolve page (",[1037,1835,1836],{},"app.kaab.ist\u002Fr\u002F\u003Ctoken>",") lets someone without a Kaabist account finish one parked job. It exists when a hosted ",[1037,1839,592],{}," parks (",[1037,1842,1843],{},"input_request.resolve_url","), or when someone in your panel shares a parked job (",[1037,1846,1847],{},"attention.resolve_url","). The page can take the input, apply a proposed fix, open a takeover, and, if the person who shared it allowed it, abort. It never offers ",[1037,1850,1851],{},"skip_step",[1037,1853,1799],{},", which are decisions about the program. A fix applied there affects only that job. The link is the credential: it opens one job, expires with the park, and stops working when the job finishes. See ",[1045,1856,92],{"href":1047},[1029,1858,1859],{"id":147},"Takeover",[1025,1861,1862,1865,1866,1869,1870,1873,1874,1876,1877,1880,1881,1883,1884,1887,1888,1891,1892,1417],{},[1037,1863,1864],{},"POST \u002Fv1\u002Fjobs\u002F{id}\u002Ftakeover"," opens a live browser on a parked job, restored from its checkpoint, and answers ",[1037,1867,1868],{},"201"," with a ",[1037,1871,1872],{},"live_url"," and a token valid for fifteen minutes. A person drives the page, then resumes with ",[1037,1875,1814],{},". What they did is recorded and becomes an ",[1037,1878,1879],{},"insert_steps"," proposal on the program version; it is never inserted into your program without approval. The job stays parked until the ",[1037,1882,1814],{},". ",[1037,1885,1886],{},"503 live_unavailable"," means no browser was free; retry after ",[1037,1889,1890],{},"Retry-After",". See ",[1045,1893,146],{"href":1718},[1029,1895,1897],{"id":1896},"checkpoints-and-side-effects","Checkpoints and side effects",[1025,1899,1900,1901,1903,1904,1906],{},"A ",[1037,1902,595],{}," step saves the page's URL, the program's variables and the browser's storage state. It is what a parked job comes back to and what ",[1037,1905,1799],{}," rewinds to. Every park also writes a checkpoint of its own.",[1025,1908,1909,1910,1912,1913,1916,1917,1919,1920,1922,1923,1925,1926,1928],{},"A step marked ",[1037,1911,1234],{}," (placing an order, sending a message) runs behind a ",[1062,1914,1915],{},"fence",": Kaabist records that it is about to act, then records that it acted once the step's ",[1037,1918,1078],{}," holds. If the worker stops in between, nobody can know whether the order was placed, so nobody guesses: the job parks as ",[1037,1921,1517],{},". For the same reason, no retry and no ",[1037,1924,1799],{}," ever rewinds past a side effect that ran, and a job inside an open fence cannot be canceled (",[1037,1927,1795],{},").",[1025,1930,1931,1934,1935,1938,1939,1417],{},[1037,1932,1933],{},"dry_run: true"," on a job runs until the first side-effect step, stops there, and returns ",[1037,1936,1937],{},"succeeded"," with everything extracted up to that point and ",[1037,1940,1941],{},"meta.dry_run: true",[1029,1943,1945],{"id":1944},"worked-example","Worked example",[1025,1947,1948,1951,1952,1955,1956,1958,1959,1961,1962,1965],{},[1062,1949,1950],{},"A login that parks for a code."," The site at ",[1037,1953,1954],{},"https:\u002F\u002Fportal.example.com"," asks for a six-digit code after the password. The program parks on ",[1037,1957,592],{}," with ",[1037,1960,1422],{},"; the client reads ",[1037,1963,1964],{},"input_request.prompt",", gets the code, and posts it. The SDK wait helpers do this with an input handler:",[1967,1968,1969,2373,2522],"code-group",{},[1262,1970,1975],{"className":1971,"code":1972,"filename":1973,"language":1974,"meta":1266,"style":1266},"language-ts shiki shiki-themes kaab-code kaab-code kaab-code","await kaab.programs.push({ ...definition, name }, { publish: true });\n\n\u002F\u002F `password` is declared `{ \"type\": \"secret\" }` in the program: it is encrypted at rest, never\n\u002F\u002F returned, and redacted from logs, step records and snapshots.\nconst job = await kaab.jobs.create({\n  program: name,\n  inputs: {\n    base_url: `${site}`,\n    password: process.env.LOGIN_PASSWORD ?? \"secret\",\n  },\n});\n\n\u002F\u002F The job parks at the code; `onInput` answers it and the wait goes on.\nconst done = await kaab.jobs.wait(job.id, {\n  timeoutMs: 300_000,\n  onInput: async (request) => {\n    console.log(`${job.id} asks for ${request.name}`);\n    return askForCode(request.prompt ?? request.name);\n  },\n});\nconsole.log(`${done.id}: ${done.status}; session saved: ${done.meta.session?.saved === true}`);\n","TypeScript","ts",[1037,1976,1977,2021,2027,2034,2040,2067,2080,2091,2116,2145,2153,2159,2164,2170,2203,2216,2235,2274,2299,2306,2311],{"__ignoreMap":1266},[1270,1978,1979,1982,1986,1989,1991,1994,1997,2000,2003,2005,2008,2010,2013,2015,2018],{"class":1272,"line":1273},[1270,1980,1981],{"class":1280},"await",[1270,1983,1985],{"class":1984},"sHJIl"," kaab",[1270,1987,1417],{"class":1988},"sJugJ",[1270,1990,224],{"class":1984},[1270,1992,1993],{"class":1988},".push",[1270,1995,1996],{"class":1276},"({ ",[1270,1998,1999],{"class":1280},"...",[1270,2001,2002],{"class":1276},"definition",[1270,2004,1300],{"class":1284},[1270,2006,2007],{"class":1276}," name }",[1270,2009,1300],{"class":1284},[1270,2011,2012],{"class":1276}," { publish",[1270,2014,1285],{"class":1280},[1270,2016,2017],{"class":1984}," true",[1270,2019,2020],{"class":1276}," });\n",[1270,2022,2023],{"class":1272,"line":1334},[1270,2024,2026],{"emptyLinePlaceholder":2025},true,"\n",[1270,2028,2030],{"class":1272,"line":2029},3,[1270,2031,2033],{"class":2032},"sKog0","\u002F\u002F `password` is declared `{ \"type\": \"secret\" }` in the program: it is encrypted at rest, never\n",[1270,2035,2037],{"class":1272,"line":2036},4,[1270,2038,2039],{"class":2032},"\u002F\u002F returned, and redacted from logs, step records and snapshots.\n",[1270,2041,2043,2046,2049,2052,2055,2057,2059,2061,2064],{"class":1272,"line":2042},5,[1270,2044,2045],{"class":1280},"const",[1270,2047,2048],{"class":1984}," job",[1270,2050,2051],{"class":1280}," =",[1270,2053,2054],{"class":1280}," await",[1270,2056,1985],{"class":1984},[1270,2058,1417],{"class":1988},[1270,2060,171],{"class":1984},[1270,2062,2063],{"class":1988},".create",[1270,2065,2066],{"class":1276},"({\n",[1270,2068,2070,2073,2075,2078],{"class":1272,"line":2069},6,[1270,2071,2072],{"class":1276},"  program",[1270,2074,1285],{"class":1280},[1270,2076,2077],{"class":1276}," name",[1270,2079,1331],{"class":1284},[1270,2081,2083,2086,2088],{"class":1272,"line":2082},7,[1270,2084,2085],{"class":1276},"  inputs",[1270,2087,1285],{"class":1280},[1270,2089,2090],{"class":1276}," {\n",[1270,2092,2094,2097,2099,2102,2105,2108,2111,2114],{"class":1272,"line":2093},8,[1270,2095,2096],{"class":1276},"    base_url",[1270,2098,1285],{"class":1280},[1270,2100,2101],{"class":1296}," `",[1270,2103,2104],{"class":1280},"${",[1270,2106,2107],{"class":1276},"site",[1270,2109,2110],{"class":1280},"}",[1270,2112,2113],{"class":1296},"`",[1270,2115,1331],{"class":1284},[1270,2117,2119,2122,2124,2127,2129,2132,2134,2137,2140,2143],{"class":1272,"line":2118},9,[1270,2120,2121],{"class":1276},"    password",[1270,2123,1285],{"class":1280},[1270,2125,2126],{"class":1984}," process",[1270,2128,1417],{"class":1276},[1270,2130,2131],{"class":1984},"env",[1270,2133,1417],{"class":1276},[1270,2135,2136],{"class":1984},"LOGIN_PASSWORD",[1270,2138,2139],{"class":1280}," ??",[1270,2141,2142],{"class":1296}," \"secret\"",[1270,2144,1331],{"class":1284},[1270,2146,2148,2151],{"class":1272,"line":2147},10,[1270,2149,2150],{"class":1276},"  }",[1270,2152,1331],{"class":1284},[1270,2154,2156],{"class":1272,"line":2155},11,[1270,2157,2158],{"class":1276},"});\n",[1270,2160,2162],{"class":1272,"line":2161},12,[1270,2163,2026],{"emptyLinePlaceholder":2025},[1270,2165,2167],{"class":1272,"line":2166},13,[1270,2168,2169],{"class":2032},"\u002F\u002F The job parks at the code; `onInput` answers it and the wait goes on.\n",[1270,2171,2173,2175,2178,2180,2182,2184,2186,2188,2191,2194,2196,2199,2201],{"class":1272,"line":2172},14,[1270,2174,2045],{"class":1280},[1270,2176,2177],{"class":1984}," done",[1270,2179,2051],{"class":1280},[1270,2181,2054],{"class":1280},[1270,2183,1985],{"class":1984},[1270,2185,1417],{"class":1988},[1270,2187,171],{"class":1984},[1270,2189,2190],{"class":1988},".wait",[1270,2192,2193],{"class":1276},"(",[1270,2195,478],{"class":1984},[1270,2197,2198],{"class":1276},".id",[1270,2200,1300],{"class":1284},[1270,2202,2090],{"class":1276},[1270,2204,2206,2209,2211,2214],{"class":1272,"line":2205},15,[1270,2207,2208],{"class":1276},"  timeoutMs",[1270,2210,1285],{"class":1280},[1270,2212,2213],{"class":1984}," 300_000",[1270,2215,1331],{"class":1284},[1270,2217,2219,2222,2224,2227,2230,2233],{"class":1272,"line":2218},16,[1270,2220,2221],{"class":1988},"  onInput",[1270,2223,1285],{"class":1280},[1270,2225,2226],{"class":1280}," async",[1270,2228,2229],{"class":1276}," (request) ",[1270,2231,2232],{"class":1280},"=>",[1270,2234,2090],{"class":1276},[1270,2236,2238,2241,2244,2246,2248,2250,2252,2254,2256,2259,2261,2264,2267,2269,2271],{"class":1272,"line":2237},17,[1270,2239,2240],{"class":1984},"    console",[1270,2242,2243],{"class":1988},".log",[1270,2245,2193],{"class":1276},[1270,2247,2113],{"class":1296},[1270,2249,2104],{"class":1280},[1270,2251,478],{"class":1984},[1270,2253,2198],{"class":1276},[1270,2255,2110],{"class":1280},[1270,2257,2258],{"class":1296}," asks for ",[1270,2260,2104],{"class":1280},[1270,2262,2263],{"class":1984},"request",[1270,2265,2266],{"class":1276},".name",[1270,2268,2110],{"class":1280},[1270,2270,2113],{"class":1296},[1270,2272,2273],{"class":1276},");\n",[1270,2275,2277,2280,2283,2285,2287,2290,2293,2296],{"class":1272,"line":2276},18,[1270,2278,2279],{"class":1280},"    return",[1270,2281,2282],{"class":1988}," askForCode",[1270,2284,2193],{"class":1276},[1270,2286,2263],{"class":1984},[1270,2288,2289],{"class":1276},".prompt ",[1270,2291,2292],{"class":1280},"??",[1270,2294,2295],{"class":1984}," request",[1270,2297,2298],{"class":1276},".name);\n",[1270,2300,2302,2304],{"class":1272,"line":2301},19,[1270,2303,2150],{"class":1276},[1270,2305,1331],{"class":1284},[1270,2307,2309],{"class":1272,"line":2308},20,[1270,2310,2158],{"class":1276},[1270,2312,2314,2317,2319,2321,2323,2325,2328,2330,2332,2334,2336,2338,2341,2343,2346,2348,2350,2352,2355,2357,2359,2362,2365,2367,2369,2371],{"class":1272,"line":2313},21,[1270,2315,2316],{"class":1984},"console",[1270,2318,2243],{"class":1988},[1270,2320,2193],{"class":1276},[1270,2322,2113],{"class":1296},[1270,2324,2104],{"class":1280},[1270,2326,2327],{"class":1984},"done",[1270,2329,2198],{"class":1276},[1270,2331,2110],{"class":1280},[1270,2333,1205],{"class":1296},[1270,2335,2104],{"class":1280},[1270,2337,2327],{"class":1984},[1270,2339,2340],{"class":1276},".status",[1270,2342,2110],{"class":1280},[1270,2344,2345],{"class":1296},"; session saved: ",[1270,2347,2104],{"class":1280},[1270,2349,2327],{"class":1984},[1270,2351,1417],{"class":1276},[1270,2353,2354],{"class":1984},"meta",[1270,2356,1417],{"class":1276},[1270,2358,504],{"class":1984},[1270,2360,2361],{"class":1276},"?.saved ",[1270,2363,2364],{"class":1280},"===",[1270,2366,2017],{"class":1984},[1270,2368,2110],{"class":1280},[1270,2370,2113],{"class":1296},[1270,2372,2273],{"class":1276},[1262,2374,2379],{"className":2375,"code":2376,"filename":2377,"language":2378,"meta":1266,"style":1266},"language-python shiki shiki-themes kaab-code kaab-code kaab-code","# password is declared {\"type\": \"secret\"} in the program: encrypted at rest, never returned,\n# and redacted from logs, step records and snapshots.\npassword = os.environ.get(\"LOGIN_PASSWORD\", \"secret\")\njob = kaab.jobs.create(program=name, inputs={\"base_url\": f\"{site}\", \"password\": password})\n# The job parks at the code; on_input answers it and the wait goes on.\ndone = kaab.jobs.wait(job.id, timeout=300, on_input=ask_for_code)\n","Python","python",[1037,2380,2381,2386,2391,2425,2483,2488],{"__ignoreMap":1266},[1270,2382,2383],{"class":1272,"line":1273},[1270,2384,2385],{"class":2032},"# password is declared {\"type\": \"secret\"} in the program: encrypted at rest, never returned,\n",[1270,2387,2388],{"class":1272,"line":1334},[1270,2389,2390],{"class":2032},"# and redacted from logs, step records and snapshots.\n",[1270,2392,2393,2396,2399,2402,2404,2407,2409,2412,2414,2417,2419,2422],{"class":1272,"line":2029},[1270,2394,2395],{"class":1276},"password ",[1270,2397,2398],{"class":1280},"=",[1270,2400,2401],{"class":1276}," os",[1270,2403,1417],{"class":1284},[1270,2405,2406],{"class":1276},"environ",[1270,2408,1417],{"class":1284},[1270,2410,2411],{"class":1988},"get",[1270,2413,2193],{"class":1284},[1270,2415,2416],{"class":1296},"\"LOGIN_PASSWORD\"",[1270,2418,1065],{"class":1284},[1270,2420,2421],{"class":1296},"\"secret\"",[1270,2423,2424],{"class":1284},")\n",[1270,2426,2427,2430,2432,2434,2436,2438,2440,2443,2446,2448,2451,2453,2456,2459,2461,2464,2467,2469,2471,2473,2475,2477,2480],{"class":1272,"line":2036},[1270,2428,2429],{"class":1276},"job ",[1270,2431,2398],{"class":1280},[1270,2433,1985],{"class":1276},[1270,2435,1417],{"class":1284},[1270,2437,171],{"class":1276},[1270,2439,1417],{"class":1284},[1270,2441,2442],{"class":1988},"create",[1270,2444,2445],{"class":1284},"(program",[1270,2447,2398],{"class":1280},[1270,2449,2450],{"class":1284},"name, inputs",[1270,2452,2398],{"class":1280},[1270,2454,2455],{"class":1284},"{",[1270,2457,2458],{"class":1296},"\"base_url\"",[1270,2460,1205],{"class":1284},[1270,2462,2463],{"class":1280},"f",[1270,2465,2466],{"class":1296},"\"",[1270,2468,2455],{"class":1984},[1270,2470,2107],{"class":1284},[1270,2472,2110],{"class":1984},[1270,2474,2466],{"class":1296},[1270,2476,1065],{"class":1284},[1270,2478,2479],{"class":1296},"\"password\"",[1270,2481,2482],{"class":1284},": password})\n",[1270,2484,2485],{"class":1272,"line":2042},[1270,2486,2487],{"class":2032},"# The job parks at the code; on_input answers it and the wait goes on.\n",[1270,2489,2490,2493,2495,2497,2499,2501,2503,2506,2509,2511,2514,2517,2519],{"class":1272,"line":2069},[1270,2491,2492],{"class":1276},"done ",[1270,2494,2398],{"class":1280},[1270,2496,1985],{"class":1276},[1270,2498,1417],{"class":1284},[1270,2500,171],{"class":1276},[1270,2502,1417],{"class":1284},[1270,2504,2505],{"class":1988},"wait",[1270,2507,2508],{"class":1284},"(job.id, timeout",[1270,2510,2398],{"class":1280},[1270,2512,2513],{"class":1984},"300",[1270,2515,2516],{"class":1284},", on_input",[1270,2518,2398],{"class":1280},[1270,2520,2521],{"class":1284},"ask_for_code)\n",[1262,2523,2528],{"className":2524,"code":2525,"filename":2526,"language":2527,"meta":1266,"style":1266},"language-go shiki shiki-themes kaab-code kaab-code kaab-code","name := fmt.Sprintf(\"login-2fa-example-%x\", time.Now().UnixMilli())\npublish := true\nif _, err := c.Programs.Push(ctx, definition, kaab.PushOptions{Name: name, Publish: &publish}); err != nil {\n    log.Fatal(err)\n}\ndefer func() { _ = c.Programs.Delete(ctx, name) }()\n\n\u002F\u002F password is declared {\"type\": \"secret\"} in the program: encrypted at rest, never returned,\n\u002F\u002F and redacted from logs, step records and snapshots.\npassword := os.Getenv(\"LOGIN_PASSWORD\")\nif password == \"\" {\n    password = \"secret\"\n}\nbody, err := kaab.Body[client.CreateJobJSONBody](map[string]any{\n    \"program\": name,\n    \"inputs\":  map[string]any{\"base_url\": site + \"\", \"password\": password},\n})\nif err != nil {\n    log.Fatal(err)\n}\njob, err := c.Jobs.Create(ctx, body)\nif err != nil {\n    log.Fatal(err)\n}\n\u002F\u002F The job parks at the code; OnInput answers it and the wait goes on.\ndone, err := c.Jobs.Wait(ctx, job.ID, kaab.WaitOptions{Timeout: 5 * time.Minute, OnInput: askForCode})\nif err != nil {\n    log.Fatal(err)\n}\nif done.Status != \"succeeded\" {\n    log.Fatalf(\"job %s is %s\", done.ID, done.Status)\n}\nfmt.Printf(\"%s: signed in\\n\", done.ID)\n","Go","go",[1037,2529,2530,2569,2579,2622,2633,2638,2659,2663,2668,2673,2691,2706,2716,2720,2762,2770,2807,2812,2825,2833,2837,2853,2866,2875,2880,2886,2921,2934,2943,2948,2963,2989,2994],{"__ignoreMap":1266},[1270,2531,2532,2535,2538,2541,2544,2546,2549,2552,2554,2557,2560,2563,2566],{"class":1272,"line":1273},[1270,2533,2534],{"class":1276},"name ",[1270,2536,2537],{"class":1280},":=",[1270,2539,2540],{"class":1276}," fmt.",[1270,2542,2543],{"class":1988},"Sprintf",[1270,2545,2193],{"class":1276},[1270,2547,2548],{"class":1296},"\"login-2fa-example-",[1270,2550,2551],{"class":1984},"%x",[1270,2553,2466],{"class":1296},[1270,2555,2556],{"class":1276},", time.",[1270,2558,2559],{"class":1988},"Now",[1270,2561,2562],{"class":1276},"().",[1270,2564,2565],{"class":1988},"UnixMilli",[1270,2567,2568],{"class":1276},"())\n",[1270,2570,2571,2574,2576],{"class":1272,"line":1334},[1270,2572,2573],{"class":1276},"publish ",[1270,2575,2537],{"class":1280},[1270,2577,2578],{"class":1984}," true\n",[1270,2580,2581,2584,2587,2589,2592,2595,2598,2600,2602,2605,2608,2611,2614,2617,2620],{"class":1272,"line":2029},[1270,2582,2583],{"class":1280},"if",[1270,2585,2586],{"class":1276}," _, err ",[1270,2588,2537],{"class":1280},[1270,2590,2591],{"class":1276}," c.Programs.",[1270,2593,2594],{"class":1988},"Push",[1270,2596,2597],{"class":1276},"(ctx, definition, ",[1270,2599,846],{"class":1988},[1270,2601,1417],{"class":1276},[1270,2603,2604],{"class":1988},"PushOptions",[1270,2606,2607],{"class":1276},"{Name: name, Publish: ",[1270,2609,2610],{"class":1280},"&",[1270,2612,2613],{"class":1276},"publish}); err ",[1270,2615,2616],{"class":1280},"!=",[1270,2618,2619],{"class":1984}," nil",[1270,2621,2090],{"class":1276},[1270,2623,2624,2627,2630],{"class":1272,"line":2036},[1270,2625,2626],{"class":1276},"    log.",[1270,2628,2629],{"class":1988},"Fatal",[1270,2631,2632],{"class":1276},"(err)\n",[1270,2634,2635],{"class":1272,"line":2042},[1270,2636,2637],{"class":1276},"}\n",[1270,2639,2640,2643,2646,2649,2651,2653,2656],{"class":1272,"line":2069},[1270,2641,2642],{"class":1280},"defer",[1270,2644,2645],{"class":1280}," func",[1270,2647,2648],{"class":1276},"() { _ ",[1270,2650,2398],{"class":1280},[1270,2652,2591],{"class":1276},[1270,2654,2655],{"class":1988},"Delete",[1270,2657,2658],{"class":1276},"(ctx, name) }()\n",[1270,2660,2661],{"class":1272,"line":2082},[1270,2662,2026],{"emptyLinePlaceholder":2025},[1270,2664,2665],{"class":1272,"line":2093},[1270,2666,2667],{"class":2032},"\u002F\u002F password is declared {\"type\": \"secret\"} in the program: encrypted at rest, never returned,\n",[1270,2669,2670],{"class":1272,"line":2118},[1270,2671,2672],{"class":2032},"\u002F\u002F and redacted from logs, step records and snapshots.\n",[1270,2674,2675,2677,2679,2682,2685,2687,2689],{"class":1272,"line":2147},[1270,2676,2395],{"class":1276},[1270,2678,2537],{"class":1280},[1270,2680,2681],{"class":1276}," os.",[1270,2683,2684],{"class":1988},"Getenv",[1270,2686,2193],{"class":1276},[1270,2688,2416],{"class":1296},[1270,2690,2424],{"class":1276},[1270,2692,2693,2695,2698,2701,2704],{"class":1272,"line":2155},[1270,2694,2583],{"class":1280},[1270,2696,2697],{"class":1276}," password ",[1270,2699,2700],{"class":1280},"==",[1270,2702,2703],{"class":1296}," \"\"",[1270,2705,2090],{"class":1276},[1270,2707,2708,2711,2713],{"class":1272,"line":2161},[1270,2709,2710],{"class":1276},"    password ",[1270,2712,2398],{"class":1280},[1270,2714,2715],{"class":1296}," \"secret\"\n",[1270,2717,2718],{"class":1272,"line":2166},[1270,2719,2637],{"class":1276},[1270,2721,2722,2725,2727,2730,2732,2735,2738,2740,2743,2746,2749,2751,2754,2757,2759],{"class":1272,"line":2172},[1270,2723,2724],{"class":1276},"body, err ",[1270,2726,2537],{"class":1280},[1270,2728,2729],{"class":1276}," kaab.",[1270,2731,1662],{"class":1988},[1270,2733,2734],{"class":1276},"[",[1270,2736,2737],{"class":1988},"client",[1270,2739,1417],{"class":1276},[1270,2741,2742],{"class":1988},"CreateJobJSONBody",[1270,2744,2745],{"class":1276},"](",[1270,2747,2748],{"class":1280},"map",[1270,2750,2734],{"class":1276},[1270,2752,2753],{"class":1280},"string",[1270,2755,2756],{"class":1276},"]",[1270,2758,634],{"class":1988},[1270,2760,2761],{"class":1276},"{\n",[1270,2763,2764,2767],{"class":1272,"line":2205},[1270,2765,2766],{"class":1296},"    \"program\"",[1270,2768,2769],{"class":1276},": name,\n",[1270,2771,2772,2775,2778,2780,2782,2784,2786,2788,2790,2792,2795,2798,2800,2802,2804],{"class":1272,"line":2218},[1270,2773,2774],{"class":1296},"    \"inputs\"",[1270,2776,2777],{"class":1276},":  ",[1270,2779,2748],{"class":1280},[1270,2781,2734],{"class":1276},[1270,2783,2753],{"class":1280},[1270,2785,2756],{"class":1276},[1270,2787,634],{"class":1988},[1270,2789,2455],{"class":1276},[1270,2791,2458],{"class":1296},[1270,2793,2794],{"class":1276},": site ",[1270,2796,2797],{"class":1280},"+",[1270,2799,2703],{"class":1296},[1270,2801,1065],{"class":1276},[1270,2803,2479],{"class":1296},[1270,2805,2806],{"class":1276},": password},\n",[1270,2808,2809],{"class":1272,"line":2237},[1270,2810,2811],{"class":1276},"})\n",[1270,2813,2814,2816,2819,2821,2823],{"class":1272,"line":2276},[1270,2815,2583],{"class":1280},[1270,2817,2818],{"class":1276}," err ",[1270,2820,2616],{"class":1280},[1270,2822,2619],{"class":1984},[1270,2824,2090],{"class":1276},[1270,2826,2827,2829,2831],{"class":1272,"line":2301},[1270,2828,2626],{"class":1276},[1270,2830,2629],{"class":1988},[1270,2832,2632],{"class":1276},[1270,2834,2835],{"class":1272,"line":2308},[1270,2836,2637],{"class":1276},[1270,2838,2839,2842,2844,2847,2850],{"class":1272,"line":2313},[1270,2840,2841],{"class":1276},"job, err ",[1270,2843,2537],{"class":1280},[1270,2845,2846],{"class":1276}," c.Jobs.",[1270,2848,2849],{"class":1988},"Create",[1270,2851,2852],{"class":1276},"(ctx, body)\n",[1270,2854,2856,2858,2860,2862,2864],{"class":1272,"line":2855},22,[1270,2857,2583],{"class":1280},[1270,2859,2818],{"class":1276},[1270,2861,2616],{"class":1280},[1270,2863,2619],{"class":1984},[1270,2865,2090],{"class":1276},[1270,2867,2869,2871,2873],{"class":1272,"line":2868},23,[1270,2870,2626],{"class":1276},[1270,2872,2629],{"class":1988},[1270,2874,2632],{"class":1276},[1270,2876,2878],{"class":1272,"line":2877},24,[1270,2879,2637],{"class":1276},[1270,2881,2883],{"class":1272,"line":2882},25,[1270,2884,2885],{"class":2032},"\u002F\u002F The job parks at the code; OnInput answers it and the wait goes on.\n",[1270,2887,2889,2892,2894,2896,2899,2902,2904,2906,2909,2912,2915,2918],{"class":1272,"line":2888},26,[1270,2890,2891],{"class":1276},"done, err ",[1270,2893,2537],{"class":1280},[1270,2895,2846],{"class":1276},[1270,2897,2898],{"class":1988},"Wait",[1270,2900,2901],{"class":1276},"(ctx, job.ID, ",[1270,2903,846],{"class":1988},[1270,2905,1417],{"class":1276},[1270,2907,2908],{"class":1988},"WaitOptions",[1270,2910,2911],{"class":1276},"{Timeout: ",[1270,2913,2914],{"class":1984},"5",[1270,2916,2917],{"class":1280}," *",[1270,2919,2920],{"class":1276}," time.Minute, OnInput: askForCode})\n",[1270,2922,2924,2926,2928,2930,2932],{"class":1272,"line":2923},27,[1270,2925,2583],{"class":1280},[1270,2927,2818],{"class":1276},[1270,2929,2616],{"class":1280},[1270,2931,2619],{"class":1984},[1270,2933,2090],{"class":1276},[1270,2935,2937,2939,2941],{"class":1272,"line":2936},28,[1270,2938,2626],{"class":1276},[1270,2940,2629],{"class":1988},[1270,2942,2632],{"class":1276},[1270,2944,2946],{"class":1272,"line":2945},29,[1270,2947,2637],{"class":1276},[1270,2949,2951,2953,2956,2958,2961],{"class":1272,"line":2950},30,[1270,2952,2583],{"class":1280},[1270,2954,2955],{"class":1276}," done.Status ",[1270,2957,2616],{"class":1280},[1270,2959,2960],{"class":1296}," \"succeeded\"",[1270,2962,2090],{"class":1276},[1270,2964,2966,2968,2971,2973,2976,2979,2982,2984,2986],{"class":1272,"line":2965},31,[1270,2967,2626],{"class":1276},[1270,2969,2970],{"class":1988},"Fatalf",[1270,2972,2193],{"class":1276},[1270,2974,2975],{"class":1296},"\"job ",[1270,2977,2978],{"class":1984},"%s",[1270,2980,2981],{"class":1296}," is ",[1270,2983,2978],{"class":1984},[1270,2985,2466],{"class":1296},[1270,2987,2988],{"class":1276},", done.ID, done.Status)\n",[1270,2990,2992],{"class":1272,"line":2991},32,[1270,2993,2637],{"class":1276},[1270,2995,2997,3000,3003,3005,3007,3009,3012],{"class":1272,"line":2996},33,[1270,2998,2999],{"class":1276},"fmt.",[1270,3001,3002],{"class":1988},"Printf",[1270,3004,2193],{"class":1276},[1270,3006,2466],{"class":1296},[1270,3008,2978],{"class":1984},[1270,3010,3011],{"class":1296},": signed in\\n\"",[1270,3013,3014],{"class":1276},", done.ID)\n",[1025,3016,3017,3018,3020],{},"The job answers ",[1037,3019,1622],{}," and carries on in the same page, signs in, and reads the 40-row report.",[1025,3022,3023,3026,3027,3030,3031,3034,3035,3037],{},[1062,3024,3025],{},"The same code, from your end user."," Change ",[1037,3028,3029],{},"collect"," to ",[1037,3032,3033],{},"\"hosted\""," and the envelope carries a ",[1037,3036,1430],{},". Send it to the person who has the phone; they type the code on Kaabist's page, and your client sees the job finish:",[1967,3039,3040],{},[1262,3041,3043],{"className":1971,"code":3042,"filename":1973,"language":1974,"meta":1266,"style":1266},"const definition = {\n  kaab: \"1\",\n  name,\n  inputs: { email: \"string\", password: \"secret\" },\n  options: { max_tier: \"browser\" },\n  steps: [\n    { goto: `${site}\u002Flogin`, expect: { visible: \"input[name=email]\" } },\n    { fill: \"input[name=email]\", value: \"{{inputs.email}}\" },\n    { fill: \"input[name=password]\", value: \"{{inputs.password}}\" },\n    { click: \"form button[type=submit]\", expect: { visible: \"input[name=code]\" } },\n    {\n      await_input: {\n        name: \"otp\",\n        prompt: \"The six-digit code we sent you\",\n        pattern: \"^[0-9]{6}$\",\n        collect: \"hosted\", \u002F\u002F a page at input_request.resolve_url collects it\n        hosted: { notify: \"none\" }, \u002F\u002F or { notify: \"email\", to: \"{{inputs.email}}\" }\n      },\n    },\n    { fill: \"input[name=code]\", value: \"{{vars.otp}}\" },\n    { click: \"form button[type=submit]\", expect: { url: \"**\u002Fdashboard\" } },\n    { extract: { heading: \"h1\" } },\n  ],\n};\nawait kaab.programs.create({ name, definition, publish: true });\n\nconst job = await kaab.jobs.create({\n  program: name,\n  inputs: { email: \"dev@kaab.ist\", password: \"secret\" },\n});\n\u002F\u002F Without an onInput handler, wait returns as soon as the job parks.\nconst parked = await kaab.jobs.wait(job.id, { timeoutMs: 120_000 });\nconsole.log(`${parked.id} is ${parked.status}: answer at ${parked.input_request?.resolve_url}`);\n",[1037,3044,3045,3056,3068,3075,3102,3121,3131,3169,3192,3214,3241,3246,3255,3266,3278,3289,3304,3326,3333,3340,3361,3387,3406,3413,3418,3448,3452,3472,3482,3507,3511,3516,3553],{"__ignoreMap":1266},[1270,3046,3047,3049,3052,3054],{"class":1272,"line":1273},[1270,3048,2045],{"class":1280},[1270,3050,3051],{"class":1984}," definition",[1270,3053,2051],{"class":1280},[1270,3055,2090],{"class":1276},[1270,3057,3058,3061,3063,3066],{"class":1272,"line":1334},[1270,3059,3060],{"class":1276},"  kaab",[1270,3062,1285],{"class":1280},[1270,3064,3065],{"class":1296}," \"1\"",[1270,3067,1331],{"class":1284},[1270,3069,3070,3073],{"class":1272,"line":2029},[1270,3071,3072],{"class":1276},"  name",[1270,3074,1331],{"class":1284},[1270,3076,3077,3079,3081,3084,3086,3088,3090,3093,3095,3097,3100],{"class":1272,"line":2036},[1270,3078,2085],{"class":1276},[1270,3080,1285],{"class":1280},[1270,3082,3083],{"class":1276}," { email",[1270,3085,1285],{"class":1280},[1270,3087,1318],{"class":1296},[1270,3089,1300],{"class":1284},[1270,3091,3092],{"class":1276}," password",[1270,3094,1285],{"class":1280},[1270,3096,2142],{"class":1296},[1270,3098,3099],{"class":1276}," }",[1270,3101,1331],{"class":1284},[1270,3103,3104,3107,3109,3112,3114,3117,3119],{"class":1272,"line":2042},[1270,3105,3106],{"class":1276},"  options",[1270,3108,1285],{"class":1280},[1270,3110,3111],{"class":1276}," { max_tier",[1270,3113,1285],{"class":1280},[1270,3115,3116],{"class":1296}," \"browser\"",[1270,3118,3099],{"class":1276},[1270,3120,1331],{"class":1284},[1270,3122,3123,3126,3128],{"class":1272,"line":2069},[1270,3124,3125],{"class":1276},"  steps",[1270,3127,1285],{"class":1280},[1270,3129,3130],{"class":1276}," [\n",[1270,3132,3133,3136,3138,3140,3142,3144,3146,3149,3151,3154,3156,3159,3161,3164,3167],{"class":1272,"line":2082},[1270,3134,3135],{"class":1276},"    { goto",[1270,3137,1285],{"class":1280},[1270,3139,2101],{"class":1296},[1270,3141,2104],{"class":1280},[1270,3143,2107],{"class":1276},[1270,3145,2110],{"class":1280},[1270,3147,3148],{"class":1296},"\u002Flogin`",[1270,3150,1300],{"class":1284},[1270,3152,3153],{"class":1276}," expect",[1270,3155,1285],{"class":1280},[1270,3157,3158],{"class":1276}," { visible",[1270,3160,1285],{"class":1280},[1270,3162,3163],{"class":1296}," \"input[name=email]\"",[1270,3165,3166],{"class":1276}," } }",[1270,3168,1331],{"class":1284},[1270,3170,3171,3174,3176,3178,3180,3183,3185,3188,3190],{"class":1272,"line":2093},[1270,3172,3173],{"class":1276},"    { fill",[1270,3175,1285],{"class":1280},[1270,3177,3163],{"class":1296},[1270,3179,1300],{"class":1284},[1270,3181,3182],{"class":1276}," value",[1270,3184,1285],{"class":1280},[1270,3186,3187],{"class":1296}," \"{{inputs.email}}\"",[1270,3189,3099],{"class":1276},[1270,3191,1331],{"class":1284},[1270,3193,3194,3196,3198,3201,3203,3205,3207,3210,3212],{"class":1272,"line":2118},[1270,3195,3173],{"class":1276},[1270,3197,1285],{"class":1280},[1270,3199,3200],{"class":1296}," \"input[name=password]\"",[1270,3202,1300],{"class":1284},[1270,3204,3182],{"class":1276},[1270,3206,1285],{"class":1280},[1270,3208,3209],{"class":1296}," \"{{inputs.password}}\"",[1270,3211,3099],{"class":1276},[1270,3213,1331],{"class":1284},[1270,3215,3216,3219,3221,3224,3226,3228,3230,3232,3234,3237,3239],{"class":1272,"line":2147},[1270,3217,3218],{"class":1276},"    { click",[1270,3220,1285],{"class":1280},[1270,3222,3223],{"class":1296}," \"form button[type=submit]\"",[1270,3225,1300],{"class":1284},[1270,3227,3153],{"class":1276},[1270,3229,1285],{"class":1280},[1270,3231,3158],{"class":1276},[1270,3233,1285],{"class":1280},[1270,3235,3236],{"class":1296}," \"input[name=code]\"",[1270,3238,3166],{"class":1276},[1270,3240,1331],{"class":1284},[1270,3242,3243],{"class":1272,"line":2155},[1270,3244,3245],{"class":1276},"    {\n",[1270,3247,3248,3251,3253],{"class":1272,"line":2161},[1270,3249,3250],{"class":1276},"      await_input",[1270,3252,1285],{"class":1280},[1270,3254,2090],{"class":1276},[1270,3256,3257,3260,3262,3264],{"class":1272,"line":2166},[1270,3258,3259],{"class":1276},"        name",[1270,3261,1285],{"class":1280},[1270,3263,1297],{"class":1296},[1270,3265,1331],{"class":1284},[1270,3267,3268,3271,3273,3276],{"class":1272,"line":2172},[1270,3269,3270],{"class":1276},"        prompt",[1270,3272,1285],{"class":1280},[1270,3274,3275],{"class":1296}," \"The six-digit code we sent you\"",[1270,3277,1331],{"class":1284},[1270,3279,3280,3283,3285,3287],{"class":1272,"line":2205},[1270,3281,3282],{"class":1276},"        pattern",[1270,3284,1285],{"class":1280},[1270,3286,1328],{"class":1296},[1270,3288,1331],{"class":1284},[1270,3290,3291,3294,3296,3299,3301],{"class":1272,"line":2218},[1270,3292,3293],{"class":1276},"        collect",[1270,3295,1285],{"class":1280},[1270,3297,3298],{"class":1296}," \"hosted\"",[1270,3300,1300],{"class":1284},[1270,3302,3303],{"class":2032}," \u002F\u002F a page at input_request.resolve_url collects it\n",[1270,3305,3306,3309,3311,3314,3316,3319,3321,3323],{"class":1272,"line":2237},[1270,3307,3308],{"class":1276},"        hosted",[1270,3310,1285],{"class":1280},[1270,3312,3313],{"class":1276}," { notify",[1270,3315,1285],{"class":1280},[1270,3317,3318],{"class":1296}," \"none\"",[1270,3320,3099],{"class":1276},[1270,3322,1300],{"class":1284},[1270,3324,3325],{"class":2032}," \u002F\u002F or { notify: \"email\", to: \"{{inputs.email}}\" }\n",[1270,3327,3328,3331],{"class":1272,"line":2276},[1270,3329,3330],{"class":1276},"      }",[1270,3332,1331],{"class":1284},[1270,3334,3335,3338],{"class":1272,"line":2301},[1270,3336,3337],{"class":1276},"    }",[1270,3339,1331],{"class":1284},[1270,3341,3342,3344,3346,3348,3350,3352,3354,3357,3359],{"class":1272,"line":2308},[1270,3343,3173],{"class":1276},[1270,3345,1285],{"class":1280},[1270,3347,3236],{"class":1296},[1270,3349,1300],{"class":1284},[1270,3351,3182],{"class":1276},[1270,3353,1285],{"class":1280},[1270,3355,3356],{"class":1296}," \"{{vars.otp}}\"",[1270,3358,3099],{"class":1276},[1270,3360,1331],{"class":1284},[1270,3362,3363,3365,3367,3369,3371,3373,3375,3378,3380,3383,3385],{"class":1272,"line":2313},[1270,3364,3218],{"class":1276},[1270,3366,1285],{"class":1280},[1270,3368,3223],{"class":1296},[1270,3370,1300],{"class":1284},[1270,3372,3153],{"class":1276},[1270,3374,1285],{"class":1280},[1270,3376,3377],{"class":1276}," { url",[1270,3379,1285],{"class":1280},[1270,3381,3382],{"class":1296}," \"**\u002Fdashboard\"",[1270,3384,3166],{"class":1276},[1270,3386,1331],{"class":1284},[1270,3388,3389,3392,3394,3397,3399,3402,3404],{"class":1272,"line":2855},[1270,3390,3391],{"class":1276},"    { extract",[1270,3393,1285],{"class":1280},[1270,3395,3396],{"class":1276}," { heading",[1270,3398,1285],{"class":1280},[1270,3400,3401],{"class":1296}," \"h1\"",[1270,3403,3166],{"class":1276},[1270,3405,1331],{"class":1284},[1270,3407,3408,3411],{"class":1272,"line":2868},[1270,3409,3410],{"class":1276},"  ]",[1270,3412,1331],{"class":1284},[1270,3414,3415],{"class":1272,"line":2877},[1270,3416,3417],{"class":1276},"};\n",[1270,3419,3420,3422,3424,3426,3428,3430,3433,3435,3437,3439,3442,3444,3446],{"class":1272,"line":2882},[1270,3421,1981],{"class":1280},[1270,3423,1985],{"class":1984},[1270,3425,1417],{"class":1988},[1270,3427,224],{"class":1984},[1270,3429,2063],{"class":1988},[1270,3431,3432],{"class":1276},"({ name",[1270,3434,1300],{"class":1284},[1270,3436,3051],{"class":1276},[1270,3438,1300],{"class":1284},[1270,3440,3441],{"class":1276}," publish",[1270,3443,1285],{"class":1280},[1270,3445,2017],{"class":1984},[1270,3447,2020],{"class":1276},[1270,3449,3450],{"class":1272,"line":2888},[1270,3451,2026],{"emptyLinePlaceholder":2025},[1270,3453,3454,3456,3458,3460,3462,3464,3466,3468,3470],{"class":1272,"line":2923},[1270,3455,2045],{"class":1280},[1270,3457,2048],{"class":1984},[1270,3459,2051],{"class":1280},[1270,3461,2054],{"class":1280},[1270,3463,1985],{"class":1984},[1270,3465,1417],{"class":1988},[1270,3467,171],{"class":1984},[1270,3469,2063],{"class":1988},[1270,3471,2066],{"class":1276},[1270,3473,3474,3476,3478,3480],{"class":1272,"line":2936},[1270,3475,2072],{"class":1276},[1270,3477,1285],{"class":1280},[1270,3479,2077],{"class":1276},[1270,3481,1331],{"class":1284},[1270,3483,3484,3486,3488,3490,3492,3495,3497,3499,3501,3503,3505],{"class":1272,"line":2945},[1270,3485,2085],{"class":1276},[1270,3487,1285],{"class":1280},[1270,3489,3083],{"class":1276},[1270,3491,1285],{"class":1280},[1270,3493,3494],{"class":1296}," \"dev@kaab.ist\"",[1270,3496,1300],{"class":1284},[1270,3498,3092],{"class":1276},[1270,3500,1285],{"class":1280},[1270,3502,2142],{"class":1296},[1270,3504,3099],{"class":1276},[1270,3506,1331],{"class":1284},[1270,3508,3509],{"class":1272,"line":2950},[1270,3510,2158],{"class":1276},[1270,3512,3513],{"class":1272,"line":2965},[1270,3514,3515],{"class":2032},"\u002F\u002F Without an onInput handler, wait returns as soon as the job parks.\n",[1270,3517,3518,3520,3523,3525,3527,3529,3531,3533,3535,3537,3539,3541,3543,3546,3548,3551],{"class":1272,"line":2991},[1270,3519,2045],{"class":1280},[1270,3521,3522],{"class":1984}," parked",[1270,3524,2051],{"class":1280},[1270,3526,2054],{"class":1280},[1270,3528,1985],{"class":1984},[1270,3530,1417],{"class":1988},[1270,3532,171],{"class":1984},[1270,3534,2190],{"class":1988},[1270,3536,2193],{"class":1276},[1270,3538,478],{"class":1984},[1270,3540,2198],{"class":1276},[1270,3542,1300],{"class":1284},[1270,3544,3545],{"class":1276}," { timeoutMs",[1270,3547,1285],{"class":1280},[1270,3549,3550],{"class":1984}," 120_000",[1270,3552,2020],{"class":1276},[1270,3554,3555,3557,3559,3561,3563,3565,3568,3570,3572,3574,3576,3578,3580,3582,3585,3587,3589,3591,3593,3596,3598,3600],{"class":1272,"line":2996},[1270,3556,2316],{"class":1984},[1270,3558,2243],{"class":1988},[1270,3560,2193],{"class":1276},[1270,3562,2113],{"class":1296},[1270,3564,2104],{"class":1280},[1270,3566,3567],{"class":1984},"parked",[1270,3569,2198],{"class":1276},[1270,3571,2110],{"class":1280},[1270,3573,2981],{"class":1296},[1270,3575,2104],{"class":1280},[1270,3577,3567],{"class":1984},[1270,3579,2340],{"class":1276},[1270,3581,2110],{"class":1280},[1270,3583,3584],{"class":1296},": answer at ",[1270,3586,2104],{"class":1280},[1270,3588,3567],{"class":1984},[1270,3590,1417],{"class":1276},[1270,3592,1371],{"class":1984},[1270,3594,3595],{"class":1276},"?.resolve_url",[1270,3597,2110],{"class":1280},[1270,3599,2113],{"class":1296},[1270,3601,2273],{"class":1276},[1025,3603,3604,3607,3608,3611,3612,3615,3616,3618,3619,3621,3622,3624],{},[1062,3605,3606],{},"An order that must not be placed twice."," The shop at ",[1037,3609,3610],{},"https:\u002F\u002Fcheckout.example.com"," takes orders with a non-idempotent ",[1037,3613,3614],{},"POST \u002Forders",". A program that fills the order form marks its submit step ",[1037,3617,1234],{}," and follows it with a checkpoint. Run it with ",[1037,3620,1933],{}," and the job stops before the submit, returning what it read and ",[1037,3623,1941],{},", with no order placed:",[1967,3626,3627],{},[1262,3628,3630],{"className":1971,"code":3629,"filename":1973,"language":1974,"meta":1266,"style":1266},"const definition = {\n  kaab: \"1\",\n  name,\n  inputs: { sku: \"string\", qty: { type: \"number\", default: 1, min: 1, max: 40 } },\n  options: { max_tier: \"browser\" },\n  steps: [\n    { goto: `${site}\u002Forders\u002Fnew`, expect: { visible: \"#order-form\" } },\n    { fill: \"input[name=sku]\", value: \"{{inputs.sku}}\" },\n    { fill: \"input[name=qty]\", value: \"{{inputs.qty}}\" },\n    {\n      \u002F\u002F Never retried or replayed blindly: if the run is cut here, the job parks instead.\n      click: \"#order-form button[type=submit]\",\n      side_effect: true,\n      expect: { url: \"**\u002Forders\u002F*\" },\n    },\n    \u002F\u002F Anything after this resumes from here, not from the start: the order is not placed again.\n    { checkpoint: \"order-placed\" },\n    {\n      extract: { order: \"h1\", sku: \"#order-sku\", qty: { selector: \"#order-qty\", type: \"integer\" } },\n    },\n  ],\n};\nawait kaab.programs.create({ name, definition, publish: true });\n",[1037,3631,3632,3642,3652,3658,3719,3735,3743,3777,3799,3821,3825,3830,3842,3853,3871,3877,3882,3896,3900,3952,3958,3964,3968],{"__ignoreMap":1266},[1270,3633,3634,3636,3638,3640],{"class":1272,"line":1273},[1270,3635,2045],{"class":1280},[1270,3637,3051],{"class":1984},[1270,3639,2051],{"class":1280},[1270,3641,2090],{"class":1276},[1270,3643,3644,3646,3648,3650],{"class":1272,"line":1334},[1270,3645,3060],{"class":1276},[1270,3647,1285],{"class":1280},[1270,3649,3065],{"class":1296},[1270,3651,1331],{"class":1284},[1270,3653,3654,3656],{"class":1272,"line":2029},[1270,3655,3072],{"class":1276},[1270,3657,1331],{"class":1284},[1270,3659,3660,3662,3664,3667,3669,3671,3673,3676,3678,3681,3683,3686,3688,3691,3693,3696,3698,3701,3703,3705,3707,3710,3712,3715,3717],{"class":1272,"line":2036},[1270,3661,2085],{"class":1276},[1270,3663,1285],{"class":1280},[1270,3665,3666],{"class":1276}," { sku",[1270,3668,1285],{"class":1280},[1270,3670,1318],{"class":1296},[1270,3672,1300],{"class":1284},[1270,3674,3675],{"class":1276}," qty",[1270,3677,1285],{"class":1280},[1270,3679,3680],{"class":1276}," { type",[1270,3682,1285],{"class":1280},[1270,3684,3685],{"class":1296}," \"number\"",[1270,3687,1300],{"class":1284},[1270,3689,3690],{"class":1276}," default",[1270,3692,1285],{"class":1280},[1270,3694,3695],{"class":1984}," 1",[1270,3697,1300],{"class":1284},[1270,3699,3700],{"class":1276}," min",[1270,3702,1285],{"class":1280},[1270,3704,3695],{"class":1984},[1270,3706,1300],{"class":1284},[1270,3708,3709],{"class":1276}," max",[1270,3711,1285],{"class":1280},[1270,3713,3714],{"class":1984}," 40",[1270,3716,3166],{"class":1276},[1270,3718,1331],{"class":1284},[1270,3720,3721,3723,3725,3727,3729,3731,3733],{"class":1272,"line":2042},[1270,3722,3106],{"class":1276},[1270,3724,1285],{"class":1280},[1270,3726,3111],{"class":1276},[1270,3728,1285],{"class":1280},[1270,3730,3116],{"class":1296},[1270,3732,3099],{"class":1276},[1270,3734,1331],{"class":1284},[1270,3736,3737,3739,3741],{"class":1272,"line":2069},[1270,3738,3125],{"class":1276},[1270,3740,1285],{"class":1280},[1270,3742,3130],{"class":1276},[1270,3744,3745,3747,3749,3751,3753,3755,3757,3760,3762,3764,3766,3768,3770,3773,3775],{"class":1272,"line":2082},[1270,3746,3135],{"class":1276},[1270,3748,1285],{"class":1280},[1270,3750,2101],{"class":1296},[1270,3752,2104],{"class":1280},[1270,3754,2107],{"class":1276},[1270,3756,2110],{"class":1280},[1270,3758,3759],{"class":1296},"\u002Forders\u002Fnew`",[1270,3761,1300],{"class":1284},[1270,3763,3153],{"class":1276},[1270,3765,1285],{"class":1280},[1270,3767,3158],{"class":1276},[1270,3769,1285],{"class":1280},[1270,3771,3772],{"class":1296}," \"#order-form\"",[1270,3774,3166],{"class":1276},[1270,3776,1331],{"class":1284},[1270,3778,3779,3781,3783,3786,3788,3790,3792,3795,3797],{"class":1272,"line":2093},[1270,3780,3173],{"class":1276},[1270,3782,1285],{"class":1280},[1270,3784,3785],{"class":1296}," \"input[name=sku]\"",[1270,3787,1300],{"class":1284},[1270,3789,3182],{"class":1276},[1270,3791,1285],{"class":1280},[1270,3793,3794],{"class":1296}," \"{{inputs.sku}}\"",[1270,3796,3099],{"class":1276},[1270,3798,1331],{"class":1284},[1270,3800,3801,3803,3805,3808,3810,3812,3814,3817,3819],{"class":1272,"line":2118},[1270,3802,3173],{"class":1276},[1270,3804,1285],{"class":1280},[1270,3806,3807],{"class":1296}," \"input[name=qty]\"",[1270,3809,1300],{"class":1284},[1270,3811,3182],{"class":1276},[1270,3813,1285],{"class":1280},[1270,3815,3816],{"class":1296}," \"{{inputs.qty}}\"",[1270,3818,3099],{"class":1276},[1270,3820,1331],{"class":1284},[1270,3822,3823],{"class":1272,"line":2147},[1270,3824,3245],{"class":1276},[1270,3826,3827],{"class":1272,"line":2155},[1270,3828,3829],{"class":2032},"      \u002F\u002F Never retried or replayed blindly: if the run is cut here, the job parks instead.\n",[1270,3831,3832,3835,3837,3840],{"class":1272,"line":2161},[1270,3833,3834],{"class":1276},"      click",[1270,3836,1285],{"class":1280},[1270,3838,3839],{"class":1296}," \"#order-form button[type=submit]\"",[1270,3841,1331],{"class":1284},[1270,3843,3844,3847,3849,3851],{"class":1272,"line":2166},[1270,3845,3846],{"class":1276},"      side_effect",[1270,3848,1285],{"class":1280},[1270,3850,2017],{"class":1984},[1270,3852,1331],{"class":1284},[1270,3854,3855,3858,3860,3862,3864,3867,3869],{"class":1272,"line":2172},[1270,3856,3857],{"class":1276},"      expect",[1270,3859,1285],{"class":1280},[1270,3861,3377],{"class":1276},[1270,3863,1285],{"class":1280},[1270,3865,3866],{"class":1296}," \"**\u002Forders\u002F*\"",[1270,3868,3099],{"class":1276},[1270,3870,1331],{"class":1284},[1270,3872,3873,3875],{"class":1272,"line":2205},[1270,3874,3337],{"class":1276},[1270,3876,1331],{"class":1284},[1270,3878,3879],{"class":1272,"line":2218},[1270,3880,3881],{"class":2032},"    \u002F\u002F Anything after this resumes from here, not from the start: the order is not placed again.\n",[1270,3883,3884,3887,3889,3892,3894],{"class":1272,"line":2237},[1270,3885,3886],{"class":1276},"    { checkpoint",[1270,3888,1285],{"class":1280},[1270,3890,3891],{"class":1296}," \"order-placed\"",[1270,3893,3099],{"class":1276},[1270,3895,1331],{"class":1284},[1270,3897,3898],{"class":1272,"line":2276},[1270,3899,3245],{"class":1276},[1270,3901,3902,3905,3907,3910,3912,3914,3916,3919,3921,3924,3926,3928,3930,3933,3935,3938,3940,3943,3945,3948,3950],{"class":1272,"line":2301},[1270,3903,3904],{"class":1276},"      extract",[1270,3906,1285],{"class":1280},[1270,3908,3909],{"class":1276}," { order",[1270,3911,1285],{"class":1280},[1270,3913,3401],{"class":1296},[1270,3915,1300],{"class":1284},[1270,3917,3918],{"class":1276}," sku",[1270,3920,1285],{"class":1280},[1270,3922,3923],{"class":1296}," \"#order-sku\"",[1270,3925,1300],{"class":1284},[1270,3927,3675],{"class":1276},[1270,3929,1285],{"class":1280},[1270,3931,3932],{"class":1276}," { selector",[1270,3934,1285],{"class":1280},[1270,3936,3937],{"class":1296}," \"#order-qty\"",[1270,3939,1300],{"class":1284},[1270,3941,3942],{"class":1276}," type",[1270,3944,1285],{"class":1280},[1270,3946,3947],{"class":1296}," \"integer\"",[1270,3949,3166],{"class":1276},[1270,3951,1331],{"class":1284},[1270,3953,3954,3956],{"class":1272,"line":2308},[1270,3955,3337],{"class":1276},[1270,3957,1331],{"class":1284},[1270,3959,3960,3962],{"class":1272,"line":2313},[1270,3961,3410],{"class":1276},[1270,3963,1331],{"class":1284},[1270,3965,3966],{"class":1272,"line":2855},[1270,3967,3417],{"class":1276},[1270,3969,3970,3972,3974,3976,3978,3980,3982,3984,3986,3988,3990,3992,3994],{"class":1272,"line":2868},[1270,3971,1981],{"class":1280},[1270,3973,1985],{"class":1984},[1270,3975,1417],{"class":1988},[1270,3977,224],{"class":1984},[1270,3979,2063],{"class":1988},[1270,3981,3432],{"class":1276},[1270,3983,1300],{"class":1284},[1270,3985,3051],{"class":1276},[1270,3987,1300],{"class":1284},[1270,3989,3441],{"class":1276},[1270,3991,1285],{"class":1280},[1270,3993,2017],{"class":1984},[1270,3995,2020],{"class":1276},[1029,3997,3999],{"id":3998},"pitfalls","Pitfalls",[1381,4001,4002,4019,4032,4043,4058],{},[1384,4003,4004,4007,4008,1071,4010,4013,4014,1071,4016,4018],{},[1062,4005,4006],{},"Treating parked as failed."," A client that only handles ",[1037,4009,1937],{},[1037,4011,4012],{},"failed"," lets parked jobs expire. Handle ",[1037,4015,1253],{},[1037,4017,1042],{},", or subscribe to their webhook events.",[1384,4020,4021,4026,4027,1213,4029,4031],{},[1062,4022,4023,4025],{},[1037,4024,1851],{}," on a step that mattered."," The job carries on without it; data that step would have produced is missing. Prefer ",[1037,4028,1811],{},[1037,4030,1799],{}," when a proposal or a checkpoint fits.",[1384,4033,4034,4039,4040,4042],{},[1062,4035,4036,4038],{},[1037,4037,1771],{}," by reflex."," It publishes a new version and moves ",[1037,4041,1775],{},". Apply transiently, then approve the proposal in the review queue once you have looked at it.",[1384,4044,4045,4048,4049,4051,4052,4054,4055,4057],{},[1062,4046,4047],{},"Retrying a side effect by hand."," After ",[1037,4050,1517],{},", check on the site whether the order exists before you choose ",[1037,4053,1851],{}," (it ran) or ",[1037,4056,1799],{}," an earlier checkpoint where that is allowed.",[1384,4059,4060,4063],{},[1062,4061,4062],{},"Sharing a resolve link widely."," Whoever holds it can act on that job. Send it only to the person meant to answer.",[1029,4065,155],{"id":4066},"reference",[1381,4068,4069,4087,4103,4117,4126],{},[1384,4070,4071,1065,4075,1065,4079,1065,4083],{},[1045,4072,4074],{"href":4073},"\u002Freference\u002Fapi\u002Fjobs\u002Fsubmit-job-input","Submit a job input",[1045,4076,4078],{"href":4077},"\u002Freference\u002Fapi\u002Fjobs\u002Fresume-job","resume a job",[1045,4080,4082],{"href":4081},"\u002Freference\u002Fapi\u002Fjobs\u002Ftakeover-job","take over a job",[1045,4084,4086],{"href":4085},"\u002Freference\u002Fapi\u002Fjobs\u002Fcancel-job","cancel a job",[1384,4088,4089,1065,4094,1065,4099],{},[1045,4090,4092],{"href":4091},"\u002Freference\u002Fdsl\u002Factions\u002Fawait-input",[1037,4093,593],{},[1045,4095,4097],{"href":4096},"\u002Freference\u002Fdsl\u002Factions\u002Fcheckpoint",[1037,4098,595],{},[1045,4100,4102],{"href":4101},"\u002Freference\u002Fdsl\u002Fsteps","step keys",[1384,4104,4105,1065,4109,1065,4113],{},[1045,4106,4108],{"href":4107},"\u002Freference\u002Fcodes#attention-reasons","Attention reasons",[1045,4110,4112],{"href":4111},"\u002Freference\u002Fcodes#job-statuses","job statuses",[1045,4114,4116],{"href":4115},"\u002Freference\u002Fcodes#errors","error codes",[1384,4118,4119,1065,4123],{},[1045,4120,4122],{"href":4121},"\u002Freference\u002Fapi\u002Fschemas\u002Fproposal","The proposal object",[1045,4124,839],{"href":4125},"\u002Freference\u002Fevents",[1384,4127,4128],{},[1045,4129,4131],{"href":4130},"\u002Freference\u002Fcli\u002Fkaab-proposals-approve",[1037,4132,941],{},[4134,4135,4136],"style",{},"html pre.shiki code .sTzsn, html code.shiki .sTzsn{--shiki-light:var(--kaab-code-foreground);--shiki-default:var(--kaab-code-foreground);--shiki-dark:var(--kaab-code-foreground)}html pre.shiki code .sqn18, html code.shiki .sqn18{--shiki-light:var(--kaab-code-token-keyword);--shiki-default:var(--kaab-code-token-keyword);--shiki-dark:var(--kaab-code-token-keyword)}html pre.shiki code .sQm2-, html code.shiki .sQm2-{--shiki-light:var(--kaab-code-token-punctuation);--shiki-default:var(--kaab-code-token-punctuation);--shiki-dark:var(--kaab-code-token-punctuation)}html pre.shiki code .suOy4, html code.shiki .suOy4{--shiki-light:var(--kaab-code-token-string-expression);--shiki-default:var(--kaab-code-token-string-expression);--shiki-dark:var(--kaab-code-token-string-expression)}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 .sHJIl, html code.shiki .sHJIl{--shiki-light:var(--kaab-code-token-constant);--shiki-default:var(--kaab-code-token-constant);--shiki-dark:var(--kaab-code-token-constant)}html pre.shiki code .sJugJ, html code.shiki .sJugJ{--shiki-light:var(--kaab-code-token-function);--shiki-default:var(--kaab-code-token-function);--shiki-dark:var(--kaab-code-token-function)}html pre.shiki code .sKog0, html code.shiki .sKog0{--shiki-light:var(--kaab-code-token-comment);--shiki-default:var(--kaab-code-token-comment);--shiki-dark:var(--kaab-code-token-comment)}",{"title":1266,"searchDepth":2029,"depth":2029,"links":4138},[4139,4140,4141,4142,4148,4149,4150,4151,4152,4153,4154,4155],{"id":1031,"depth":1334,"text":1032},{"id":1052,"depth":1334,"text":1053},{"id":1085,"depth":1334,"text":1086},{"id":1238,"depth":1334,"text":1239,"children":4143},[4144,4146],{"id":1250,"depth":2029,"text":4145},"awaiting_input: planned",{"id":1441,"depth":2029,"text":4147},"needs_attention: unplanned",{"id":1574,"depth":1334,"text":1575},{"id":1646,"depth":1334,"text":1647},{"id":1830,"depth":1334,"text":92},{"id":147,"depth":1334,"text":1859},{"id":1896,"depth":1334,"text":1897},{"id":1944,"depth":1334,"text":1945},{"id":3998,"depth":1334,"text":3999},{"id":4066,"depth":1334,"text":155},false,null,"How a job parks for a person (awaiting_input and needs_attention) and the ways to answer it: inputs, the five resume actions, hosted pages and takeover.","md",{},"\u002Fconcepts\u002Fhuman-in-the-loop",{"title":44,"description":4158},"2.concepts\u002F06.human-in-the-loop","lUQHrByBLpO7u0kHplHsNIIiyzbPR_o8ojw0NzOQZtY",[4166,4170],{"title":41,"path":4167,"stem":4168,"description":4169,"children":-1},"\u002Fconcepts\u002Fsessions","2.concepts\u002F05.sessions","Staying signed in across jobs: what a session stores, how jobs bind and lock it, how Kaabist checks it, what happens when it expires, and refresh programs.",{"title":47,"path":4171,"stem":4172,"description":4173,"children":-1},"\u002Fconcepts\u002Fself-healing","2.concepts\u002F07.self-healing","What Kaabist does when an element your program points at moves, how confident it has to be, and why a person approves every change to a program.",1793591003142]