[{"data":1,"prerenderedAt":4205},["ShallowReactive",2],{"navigation":3,"page:\u002Fguides\u002Fauthenticated-flows":1019,"surround:\u002Fguides\u002Fauthenticated-flows":4198},[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":89,"body":1021,"breaking":4189,"date":4190,"description":4191,"extension":4192,"generated":4189,"meta":4193,"navigation":1930,"path":4194,"seo":4195,"stem":4196,"version":4190,"__hash__":4197},"docs\u002F3.guides\u002F01.authenticated-flows.md",{"type":1022,"value":1023,"toc":4177},"minimark",[1024,1028,1033,1041,1053,1056,1060,1065,1077,1163,1173,1666,1670,1676,1765,1780,1808,1818,1822,1829,1848,1867,1878,2810,2814,2827,2862,2865,2906,2928,2932,2939,3959,3962,4020,4024,4092,4095,4173],[1025,1026,1027],"p",{},"This guide builds a program that signs in to a site protected by a password and a one-time code:\nthe credentials come from secret inputs, the job parks to ask you for the code, and the signed-in\nstate is saved as a session. The next job with that session skips the login entirely, so you are\nasked for a code once, not on every run.",[1029,1030,1032],"h2",{"id":1031},"when-to-use-it","When to use it",[1025,1034,1035,1036,1040],{},"Use this pattern when ",[1037,1038,1039],"strong",{},"you"," (your backend, your script, an operator) can supply the one-time\ncode: you read it from an authenticator, a shared mailbox, or an SMS gateway, and answer through\nthe API or the SDK.",[1025,1042,1043,1044,1047,1048,1052],{},"When the code arrives on ",[1037,1045,1046],{},"someone else's"," phone, such as your customer's, do not relay it\nthrough your own systems. Declare the input as hosted instead and send that person a link to a\npage where they type it themselves: see ",[1049,1050,92],"a",{"href":1051},"\u002Fguides\u002Fhosted-resolve",". The\nprogram is the same apart from one key.",[1025,1054,1055],{},"If a site needs no second factor, you still want the session part of this guide: sign in once,\nsave the session, and stop sending the password on every job.",[1029,1057,1059],{"id":1058},"the-building-blocks","The building blocks",[1061,1062,1064],"h3",{"id":1063},"secret-inputs","Secret inputs",[1025,1066,1067,1068,1072,1073,1076],{},"Declare the password as a ",[1069,1070,1071],"code",{},"secret"," input. Its value is given per job and never appears in the\njob's ",[1069,1074,1075],{},"meta",", in logs, in snapshots, in screenshots or in webhooks; a field the value was filled\ninto is redacted.",[1078,1079,1083],"pre",{"className":1080,"code":1081,"language":680,"meta":1082,"style":1082},"language-json shiki shiki-themes kaab-code kaab-code kaab-code","\"inputs\": {\n  \"email\": { \"type\": \"string\", \"default\": \"dev@kaab.ist\" },\n  \"password\": { \"type\": \"secret\" }\n}\n","",[1069,1084,1085,1098,1137,1157],{"__ignoreMap":1082},[1086,1087,1090,1094],"span",{"class":1088,"line":1089},"line",1,[1086,1091,1093],{"class":1092},"suOy4","\"inputs\"",[1086,1095,1097],{"class":1096},"sTzsn",": {\n",[1086,1099,1101,1105,1109,1112,1115,1117,1120,1123,1126,1128,1131,1134],{"class":1088,"line":1100},2,[1086,1102,1104],{"class":1103},"sqn18","  \"email\"",[1086,1106,1108],{"class":1107},"sQm2-",":",[1086,1110,1111],{"class":1096}," { ",[1086,1113,1114],{"class":1103},"\"type\"",[1086,1116,1108],{"class":1107},[1086,1118,1119],{"class":1092}," \"string\"",[1086,1121,1122],{"class":1107},",",[1086,1124,1125],{"class":1103}," \"default\"",[1086,1127,1108],{"class":1107},[1086,1129,1130],{"class":1092}," \"dev@kaab.ist\"",[1086,1132,1133],{"class":1096}," }",[1086,1135,1136],{"class":1107},",\n",[1086,1138,1140,1143,1145,1147,1149,1151,1154],{"class":1088,"line":1139},3,[1086,1141,1142],{"class":1103},"  \"password\"",[1086,1144,1108],{"class":1107},[1086,1146,1111],{"class":1096},[1086,1148,1114],{"class":1103},[1086,1150,1108],{"class":1107},[1086,1152,1153],{"class":1092}," \"secret\"",[1086,1155,1156],{"class":1096}," }\n",[1086,1158,1160],{"class":1088,"line":1159},4,[1086,1161,1162],{"class":1096},"}\n",[1025,1164,1165,1166,1168,1169,1172],{},"A secret can be filled into a field, and nothing else: lint refuses a program that reads a secret\nin an ",[1069,1167,569],{}," or renders it into a URL (",[1049,1170,799],{"href":1171},"\u002Freference\u002Fdsl\u002Flint\u002Fe013",").",[1174,1175,1176,1315,1428],"code-group",{},[1078,1177,1182],{"className":1178,"code":1179,"filename":1180,"language":1181,"meta":1082,"style":1082},"language-ts shiki shiki-themes kaab-code kaab-code kaab-code","\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","TypeScript","ts",[1069,1183,1184,1190,1195,1225,1237,1248,1273,1301,1309],{"__ignoreMap":1082},[1086,1185,1186],{"class":1088,"line":1089},[1086,1187,1189],{"class":1188},"sKog0","\u002F\u002F `password` is declared `{ \"type\": \"secret\" }` in the program: it is encrypted at rest, never\n",[1086,1191,1192],{"class":1088,"line":1100},[1086,1193,1194],{"class":1188},"\u002F\u002F returned, and redacted from logs, step records and snapshots.\n",[1086,1196,1197,1200,1204,1207,1210,1213,1217,1219,1222],{"class":1088,"line":1139},[1086,1198,1199],{"class":1103},"const",[1086,1201,1203],{"class":1202},"sHJIl"," job",[1086,1205,1206],{"class":1103}," =",[1086,1208,1209],{"class":1103}," await",[1086,1211,1212],{"class":1202}," kaab",[1086,1214,1216],{"class":1215},"sJugJ",".",[1086,1218,171],{"class":1202},[1086,1220,1221],{"class":1215},".create",[1086,1223,1224],{"class":1096},"({\n",[1086,1226,1227,1230,1232,1235],{"class":1088,"line":1159},[1086,1228,1229],{"class":1096},"  program",[1086,1231,1108],{"class":1103},[1086,1233,1234],{"class":1096}," name",[1086,1236,1136],{"class":1107},[1086,1238,1240,1243,1245],{"class":1088,"line":1239},5,[1086,1241,1242],{"class":1096},"  inputs",[1086,1244,1108],{"class":1103},[1086,1246,1247],{"class":1096}," {\n",[1086,1249,1251,1254,1256,1259,1262,1265,1268,1271],{"class":1088,"line":1250},6,[1086,1252,1253],{"class":1096},"    base_url",[1086,1255,1108],{"class":1103},[1086,1257,1258],{"class":1092}," `",[1086,1260,1261],{"class":1103},"${",[1086,1263,1264],{"class":1096},"site",[1086,1266,1267],{"class":1103},"}",[1086,1269,1270],{"class":1092},"`",[1086,1272,1136],{"class":1107},[1086,1274,1276,1279,1281,1284,1286,1289,1291,1294,1297,1299],{"class":1088,"line":1275},7,[1086,1277,1278],{"class":1096},"    password",[1086,1280,1108],{"class":1103},[1086,1282,1283],{"class":1202}," process",[1086,1285,1216],{"class":1096},[1086,1287,1288],{"class":1202},"env",[1086,1290,1216],{"class":1096},[1086,1292,1293],{"class":1202},"LOGIN_PASSWORD",[1086,1295,1296],{"class":1103}," ??",[1086,1298,1153],{"class":1092},[1086,1300,1136],{"class":1107},[1086,1302,1304,1307],{"class":1088,"line":1303},8,[1086,1305,1306],{"class":1096},"  }",[1086,1308,1136],{"class":1107},[1086,1310,1312],{"class":1088,"line":1311},9,[1086,1313,1314],{"class":1096},"});\n",[1078,1316,1321],{"className":1317,"code":1318,"filename":1319,"language":1320,"meta":1082,"style":1082},"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","Python","python",[1069,1322,1323,1328,1333,1369],{"__ignoreMap":1082},[1086,1324,1325],{"class":1088,"line":1089},[1086,1326,1327],{"class":1188},"# password is declared {\"type\": \"secret\"} in the program: encrypted at rest, never returned,\n",[1086,1329,1330],{"class":1088,"line":1100},[1086,1331,1332],{"class":1188},"# and redacted from logs, step records and snapshots.\n",[1086,1334,1335,1338,1341,1344,1346,1349,1351,1354,1357,1360,1363,1366],{"class":1088,"line":1139},[1086,1336,1337],{"class":1096},"password ",[1086,1339,1340],{"class":1103},"=",[1086,1342,1343],{"class":1096}," os",[1086,1345,1216],{"class":1107},[1086,1347,1348],{"class":1096},"environ",[1086,1350,1216],{"class":1107},[1086,1352,1353],{"class":1215},"get",[1086,1355,1356],{"class":1107},"(",[1086,1358,1359],{"class":1092},"\"LOGIN_PASSWORD\"",[1086,1361,1362],{"class":1107},", ",[1086,1364,1365],{"class":1092},"\"secret\"",[1086,1367,1368],{"class":1107},")\n",[1086,1370,1371,1374,1376,1378,1380,1382,1384,1387,1390,1392,1395,1397,1400,1403,1406,1409,1412,1414,1416,1418,1420,1422,1425],{"class":1088,"line":1159},[1086,1372,1373],{"class":1096},"job ",[1086,1375,1340],{"class":1103},[1086,1377,1212],{"class":1096},[1086,1379,1216],{"class":1107},[1086,1381,171],{"class":1096},[1086,1383,1216],{"class":1107},[1086,1385,1386],{"class":1215},"create",[1086,1388,1389],{"class":1107},"(program",[1086,1391,1340],{"class":1103},[1086,1393,1394],{"class":1107},"name, inputs",[1086,1396,1340],{"class":1103},[1086,1398,1399],{"class":1107},"{",[1086,1401,1402],{"class":1092},"\"base_url\"",[1086,1404,1405],{"class":1107},": ",[1086,1407,1408],{"class":1103},"f",[1086,1410,1411],{"class":1092},"\"",[1086,1413,1399],{"class":1202},[1086,1415,1264],{"class":1107},[1086,1417,1267],{"class":1202},[1086,1419,1411],{"class":1092},[1086,1421,1362],{"class":1107},[1086,1423,1424],{"class":1092},"\"password\"",[1086,1426,1427],{"class":1107},": password})\n",[1078,1429,1434],{"className":1430,"code":1431,"filename":1432,"language":1433,"meta":1082,"style":1082},"language-go shiki shiki-themes kaab-code kaab-code kaab-code","\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","Go","go",[1069,1435,1436,1441,1446,1465,1481,1491,1495,1538,1546,1583,1589,1605,1617,1622,1639,1652,1661],{"__ignoreMap":1082},[1086,1437,1438],{"class":1088,"line":1089},[1086,1439,1440],{"class":1188},"\u002F\u002F password is declared {\"type\": \"secret\"} in the program: encrypted at rest, never returned,\n",[1086,1442,1443],{"class":1088,"line":1100},[1086,1444,1445],{"class":1188},"\u002F\u002F and redacted from logs, step records and snapshots.\n",[1086,1447,1448,1450,1453,1456,1459,1461,1463],{"class":1088,"line":1139},[1086,1449,1337],{"class":1096},[1086,1451,1452],{"class":1103},":=",[1086,1454,1455],{"class":1096}," os.",[1086,1457,1458],{"class":1215},"Getenv",[1086,1460,1356],{"class":1096},[1086,1462,1359],{"class":1092},[1086,1464,1368],{"class":1096},[1086,1466,1467,1470,1473,1476,1479],{"class":1088,"line":1159},[1086,1468,1469],{"class":1103},"if",[1086,1471,1472],{"class":1096}," password ",[1086,1474,1475],{"class":1103},"==",[1086,1477,1478],{"class":1092}," \"\"",[1086,1480,1247],{"class":1096},[1086,1482,1483,1486,1488],{"class":1088,"line":1239},[1086,1484,1485],{"class":1096},"    password ",[1086,1487,1340],{"class":1103},[1086,1489,1490],{"class":1092}," \"secret\"\n",[1086,1492,1493],{"class":1088,"line":1250},[1086,1494,1162],{"class":1096},[1086,1496,1497,1500,1502,1505,1508,1511,1514,1516,1519,1522,1525,1527,1530,1533,1535],{"class":1088,"line":1275},[1086,1498,1499],{"class":1096},"body, err ",[1086,1501,1452],{"class":1103},[1086,1503,1504],{"class":1096}," kaab.",[1086,1506,1507],{"class":1215},"Body",[1086,1509,1510],{"class":1096},"[",[1086,1512,1513],{"class":1215},"client",[1086,1515,1216],{"class":1096},[1086,1517,1518],{"class":1215},"CreateJobJSONBody",[1086,1520,1521],{"class":1096},"](",[1086,1523,1524],{"class":1103},"map",[1086,1526,1510],{"class":1096},[1086,1528,1529],{"class":1103},"string",[1086,1531,1532],{"class":1096},"]",[1086,1534,634],{"class":1215},[1086,1536,1537],{"class":1096},"{\n",[1086,1539,1540,1543],{"class":1088,"line":1303},[1086,1541,1542],{"class":1092},"    \"program\"",[1086,1544,1545],{"class":1096},": name,\n",[1086,1547,1548,1551,1554,1556,1558,1560,1562,1564,1566,1568,1571,1574,1576,1578,1580],{"class":1088,"line":1311},[1086,1549,1550],{"class":1092},"    \"inputs\"",[1086,1552,1553],{"class":1096},":  ",[1086,1555,1524],{"class":1103},[1086,1557,1510],{"class":1096},[1086,1559,1529],{"class":1103},[1086,1561,1532],{"class":1096},[1086,1563,634],{"class":1215},[1086,1565,1399],{"class":1096},[1086,1567,1402],{"class":1092},[1086,1569,1570],{"class":1096},": site ",[1086,1572,1573],{"class":1103},"+",[1086,1575,1478],{"class":1092},[1086,1577,1362],{"class":1096},[1086,1579,1424],{"class":1092},[1086,1581,1582],{"class":1096},": password},\n",[1086,1584,1586],{"class":1088,"line":1585},10,[1086,1587,1588],{"class":1096},"})\n",[1086,1590,1592,1594,1597,1600,1603],{"class":1088,"line":1591},11,[1086,1593,1469],{"class":1103},[1086,1595,1596],{"class":1096}," err ",[1086,1598,1599],{"class":1103},"!=",[1086,1601,1602],{"class":1202}," nil",[1086,1604,1247],{"class":1096},[1086,1606,1608,1611,1614],{"class":1088,"line":1607},12,[1086,1609,1610],{"class":1096},"    log.",[1086,1612,1613],{"class":1215},"Fatal",[1086,1615,1616],{"class":1096},"(err)\n",[1086,1618,1620],{"class":1088,"line":1619},13,[1086,1621,1162],{"class":1096},[1086,1623,1625,1628,1630,1633,1636],{"class":1088,"line":1624},14,[1086,1626,1627],{"class":1096},"job, err ",[1086,1629,1452],{"class":1103},[1086,1631,1632],{"class":1096}," c.Jobs.",[1086,1634,1635],{"class":1215},"Create",[1086,1637,1638],{"class":1096},"(ctx, body)\n",[1086,1640,1642,1644,1646,1648,1650],{"class":1088,"line":1641},15,[1086,1643,1469],{"class":1103},[1086,1645,1596],{"class":1096},[1086,1647,1599],{"class":1103},[1086,1649,1602],{"class":1202},[1086,1651,1247],{"class":1096},[1086,1653,1655,1657,1659],{"class":1088,"line":1654},16,[1086,1656,1610],{"class":1096},[1086,1658,1613],{"class":1215},[1086,1660,1616],{"class":1096},[1086,1662,1664],{"class":1088,"line":1663},17,[1086,1665,1162],{"class":1096},[1061,1667,1669],{"id":1668},"parking-for-the-code","Parking for the code",[1025,1671,1672,1673,1675],{},"An ",[1069,1674,592],{}," step stops the job and asks for a named value:",[1078,1677,1679],{"className":1080,"code":1678,"language":680,"meta":1082,"style":1082},"{ \"await_input\": { \"name\": \"otp\", \"prompt\": \"The code from your authenticator\", \"type\": \"string\",\n  \"pattern\": \"^[0-9]{6}$\", \"ttl\": \"5m\", \"expires\": \"24h\", \"collect\": \"api\" } }\n",[1069,1680,1681,1722],{"__ignoreMap":1082},[1086,1682,1683,1686,1689,1691,1693,1696,1698,1701,1703,1706,1708,1711,1713,1716,1718,1720],{"class":1088,"line":1089},[1086,1684,1685],{"class":1096},"{ ",[1086,1687,1688],{"class":1103},"\"await_input\"",[1086,1690,1108],{"class":1107},[1086,1692,1111],{"class":1096},[1086,1694,1695],{"class":1103},"\"name\"",[1086,1697,1108],{"class":1107},[1086,1699,1700],{"class":1092}," \"otp\"",[1086,1702,1122],{"class":1107},[1086,1704,1705],{"class":1103}," \"prompt\"",[1086,1707,1108],{"class":1107},[1086,1709,1710],{"class":1092}," \"The code from your authenticator\"",[1086,1712,1122],{"class":1107},[1086,1714,1715],{"class":1103}," \"type\"",[1086,1717,1108],{"class":1107},[1086,1719,1119],{"class":1092},[1086,1721,1136],{"class":1107},[1086,1723,1724,1727,1729,1732,1734,1737,1739,1742,1744,1747,1749,1752,1754,1757,1759,1762],{"class":1088,"line":1100},[1086,1725,1726],{"class":1103},"  \"pattern\"",[1086,1728,1108],{"class":1107},[1086,1730,1731],{"class":1092}," \"^[0-9]{6}$\"",[1086,1733,1122],{"class":1107},[1086,1735,1736],{"class":1103}," \"ttl\"",[1086,1738,1108],{"class":1107},[1086,1740,1741],{"class":1092}," \"5m\"",[1086,1743,1122],{"class":1107},[1086,1745,1746],{"class":1103}," \"expires\"",[1086,1748,1108],{"class":1107},[1086,1750,1751],{"class":1092}," \"24h\"",[1086,1753,1122],{"class":1107},[1086,1755,1756],{"class":1103}," \"collect\"",[1086,1758,1108],{"class":1107},[1086,1760,1761],{"class":1092}," \"api\"",[1086,1763,1764],{"class":1096}," } }\n",[1025,1766,1767,1768,1771,1772,1775,1776,1779],{},"The job's status becomes ",[1069,1769,1770],{},"awaiting_input",", the ",[1069,1773,1774],{},"job.awaiting_input"," event is sent, and the\nenvelope carries an ",[1069,1777,1778],{},"input_request"," with the name, the prompt, the pattern, a screenshot of the\npage and two deadlines:",[1781,1782,1783,1790],"ul",{},[1784,1785,1786,1789],"li",{},[1069,1787,1788],{},"ttl"," (default 5 minutes, at most 15) is how long the browser stays open on the page. Answer\ninside it and the run carries on in that same page.",[1784,1791,1792,1795,1796,1798,1799,1801,1802,1804,1805,1216],{},[1069,1793,1794],{},"expires"," (at most 7 days) is how long the job waits for the value at all. Answer after ",[1069,1797,1788],{},"\nbut before ",[1069,1800,1794],{}," and the job restores its last checkpoint and continues; past ",[1069,1803,1794],{}," the\nanswer is refused with ",[1069,1806,1807],{},"410 input_expired",[1025,1809,1810,1811,1814,1815,1216],{},"The value you send lands in ",[1069,1812,1813],{},"vars.otp",", which the next step fills in with ",[1069,1816,1817],{},"{{vars.otp}}",[1061,1819,1821],{"id":1820},"answering","Answering",[1025,1823,1824,1825,1828],{},"Post the value to ",[1069,1826,1827],{},"POST \u002Fv1\u002Fjobs\u002F{id}\u002Finput",", keyed by the input's name:",[1078,1830,1832],{"className":1080,"code":1831,"language":680,"meta":1082,"style":1082},"{ \"otp\": \"482913\" }\n",[1069,1833,1834],{"__ignoreMap":1082},[1086,1835,1836,1838,1841,1843,1846],{"class":1088,"line":1089},[1086,1837,1685],{"class":1096},[1086,1839,1840],{"class":1103},"\"otp\"",[1086,1842,1108],{"class":1107},[1086,1844,1845],{"class":1092}," \"482913\"",[1086,1847,1156],{"class":1096},[1025,1849,1850,1851,1854,1855,1858,1859,1862,1863,1866],{},"The job answers ",[1069,1852,1853],{},"200"," and is ",[1069,1856,1857],{},"running"," again, or ",[1069,1860,1861],{},"queued"," when its browser was already released.\n",[1069,1864,1865],{},"409 job_not_waiting"," means the job is not parked on an input any more.",[1025,1868,1869,1870,1873,1874,1877],{},"With an SDK, ",[1069,1871,1872],{},"jobs.wait"," does this for you: give it an ",[1069,1875,1876],{},"onInput"," handler, and whenever the job parks\non an input, the handler's return value is posted and the wait continues to the end.",[1174,1879,1880,2234,2360],{},[1078,1881,1883],{"className":1178,"code":1882,"filename":1180,"language":1181,"meta":1082,"style":1082},"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",[1069,1884,1885,1926,1932,1936,1940,1960,1970,1978,1996,2018,2024,2028,2032,2037,2068,2080,2098,2136,2161,2168,2173],{"__ignoreMap":1082},[1086,1886,1887,1890,1892,1894,1896,1899,1902,1905,1908,1910,1913,1915,1918,1920,1923],{"class":1088,"line":1089},[1086,1888,1889],{"class":1103},"await",[1086,1891,1212],{"class":1202},[1086,1893,1216],{"class":1215},[1086,1895,224],{"class":1202},[1086,1897,1898],{"class":1215},".push",[1086,1900,1901],{"class":1096},"({ ",[1086,1903,1904],{"class":1103},"...",[1086,1906,1907],{"class":1096},"definition",[1086,1909,1122],{"class":1107},[1086,1911,1912],{"class":1096}," name }",[1086,1914,1122],{"class":1107},[1086,1916,1917],{"class":1096}," { publish",[1086,1919,1108],{"class":1103},[1086,1921,1922],{"class":1202}," true",[1086,1924,1925],{"class":1096}," });\n",[1086,1927,1928],{"class":1088,"line":1100},[1086,1929,1931],{"emptyLinePlaceholder":1930},true,"\n",[1086,1933,1934],{"class":1088,"line":1139},[1086,1935,1189],{"class":1188},[1086,1937,1938],{"class":1088,"line":1159},[1086,1939,1194],{"class":1188},[1086,1941,1942,1944,1946,1948,1950,1952,1954,1956,1958],{"class":1088,"line":1239},[1086,1943,1199],{"class":1103},[1086,1945,1203],{"class":1202},[1086,1947,1206],{"class":1103},[1086,1949,1209],{"class":1103},[1086,1951,1212],{"class":1202},[1086,1953,1216],{"class":1215},[1086,1955,171],{"class":1202},[1086,1957,1221],{"class":1215},[1086,1959,1224],{"class":1096},[1086,1961,1962,1964,1966,1968],{"class":1088,"line":1250},[1086,1963,1229],{"class":1096},[1086,1965,1108],{"class":1103},[1086,1967,1234],{"class":1096},[1086,1969,1136],{"class":1107},[1086,1971,1972,1974,1976],{"class":1088,"line":1275},[1086,1973,1242],{"class":1096},[1086,1975,1108],{"class":1103},[1086,1977,1247],{"class":1096},[1086,1979,1980,1982,1984,1986,1988,1990,1992,1994],{"class":1088,"line":1303},[1086,1981,1253],{"class":1096},[1086,1983,1108],{"class":1103},[1086,1985,1258],{"class":1092},[1086,1987,1261],{"class":1103},[1086,1989,1264],{"class":1096},[1086,1991,1267],{"class":1103},[1086,1993,1270],{"class":1092},[1086,1995,1136],{"class":1107},[1086,1997,1998,2000,2002,2004,2006,2008,2010,2012,2014,2016],{"class":1088,"line":1311},[1086,1999,1278],{"class":1096},[1086,2001,1108],{"class":1103},[1086,2003,1283],{"class":1202},[1086,2005,1216],{"class":1096},[1086,2007,1288],{"class":1202},[1086,2009,1216],{"class":1096},[1086,2011,1293],{"class":1202},[1086,2013,1296],{"class":1103},[1086,2015,1153],{"class":1092},[1086,2017,1136],{"class":1107},[1086,2019,2020,2022],{"class":1088,"line":1585},[1086,2021,1306],{"class":1096},[1086,2023,1136],{"class":1107},[1086,2025,2026],{"class":1088,"line":1591},[1086,2027,1314],{"class":1096},[1086,2029,2030],{"class":1088,"line":1607},[1086,2031,1931],{"emptyLinePlaceholder":1930},[1086,2033,2034],{"class":1088,"line":1619},[1086,2035,2036],{"class":1188},"\u002F\u002F The job parks at the code; `onInput` answers it and the wait goes on.\n",[1086,2038,2039,2041,2044,2046,2048,2050,2052,2054,2057,2059,2061,2064,2066],{"class":1088,"line":1624},[1086,2040,1199],{"class":1103},[1086,2042,2043],{"class":1202}," done",[1086,2045,1206],{"class":1103},[1086,2047,1209],{"class":1103},[1086,2049,1212],{"class":1202},[1086,2051,1216],{"class":1215},[1086,2053,171],{"class":1202},[1086,2055,2056],{"class":1215},".wait",[1086,2058,1356],{"class":1096},[1086,2060,478],{"class":1202},[1086,2062,2063],{"class":1096},".id",[1086,2065,1122],{"class":1107},[1086,2067,1247],{"class":1096},[1086,2069,2070,2073,2075,2078],{"class":1088,"line":1641},[1086,2071,2072],{"class":1096},"  timeoutMs",[1086,2074,1108],{"class":1103},[1086,2076,2077],{"class":1202}," 300_000",[1086,2079,1136],{"class":1107},[1086,2081,2082,2085,2087,2090,2093,2096],{"class":1088,"line":1654},[1086,2083,2084],{"class":1215},"  onInput",[1086,2086,1108],{"class":1103},[1086,2088,2089],{"class":1103}," async",[1086,2091,2092],{"class":1096}," (request) ",[1086,2094,2095],{"class":1103},"=>",[1086,2097,1247],{"class":1096},[1086,2099,2100,2103,2106,2108,2110,2112,2114,2116,2118,2121,2123,2126,2129,2131,2133],{"class":1088,"line":1663},[1086,2101,2102],{"class":1202},"    console",[1086,2104,2105],{"class":1215},".log",[1086,2107,1356],{"class":1096},[1086,2109,1270],{"class":1092},[1086,2111,1261],{"class":1103},[1086,2113,478],{"class":1202},[1086,2115,2063],{"class":1096},[1086,2117,1267],{"class":1103},[1086,2119,2120],{"class":1092}," asks for ",[1086,2122,1261],{"class":1103},[1086,2124,2125],{"class":1202},"request",[1086,2127,2128],{"class":1096},".name",[1086,2130,1267],{"class":1103},[1086,2132,1270],{"class":1092},[1086,2134,2135],{"class":1096},");\n",[1086,2137,2139,2142,2145,2147,2149,2152,2155,2158],{"class":1088,"line":2138},18,[1086,2140,2141],{"class":1103},"    return",[1086,2143,2144],{"class":1215}," askForCode",[1086,2146,1356],{"class":1096},[1086,2148,2125],{"class":1202},[1086,2150,2151],{"class":1096},".prompt ",[1086,2153,2154],{"class":1103},"??",[1086,2156,2157],{"class":1202}," request",[1086,2159,2160],{"class":1096},".name);\n",[1086,2162,2164,2166],{"class":1088,"line":2163},19,[1086,2165,1306],{"class":1096},[1086,2167,1136],{"class":1107},[1086,2169,2171],{"class":1088,"line":2170},20,[1086,2172,1314],{"class":1096},[1086,2174,2176,2179,2181,2183,2185,2187,2190,2192,2194,2196,2198,2200,2203,2205,2208,2210,2212,2214,2216,2218,2220,2223,2226,2228,2230,2232],{"class":1088,"line":2175},21,[1086,2177,2178],{"class":1202},"console",[1086,2180,2105],{"class":1215},[1086,2182,1356],{"class":1096},[1086,2184,1270],{"class":1092},[1086,2186,1261],{"class":1103},[1086,2188,2189],{"class":1202},"done",[1086,2191,2063],{"class":1096},[1086,2193,1267],{"class":1103},[1086,2195,1405],{"class":1092},[1086,2197,1261],{"class":1103},[1086,2199,2189],{"class":1202},[1086,2201,2202],{"class":1096},".status",[1086,2204,1267],{"class":1103},[1086,2206,2207],{"class":1092},"; session saved: ",[1086,2209,1261],{"class":1103},[1086,2211,2189],{"class":1202},[1086,2213,1216],{"class":1096},[1086,2215,1075],{"class":1202},[1086,2217,1216],{"class":1096},[1086,2219,504],{"class":1202},[1086,2221,2222],{"class":1096},"?.saved ",[1086,2224,2225],{"class":1103},"===",[1086,2227,1922],{"class":1202},[1086,2229,1267],{"class":1103},[1086,2231,1270],{"class":1092},[1086,2233,2135],{"class":1096},[1078,2235,2237],{"className":1317,"code":2236,"filename":1319,"language":1320,"meta":1082,"style":1082},"# 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",[1069,2238,2239,2243,2247,2273,2321,2326],{"__ignoreMap":1082},[1086,2240,2241],{"class":1088,"line":1089},[1086,2242,1327],{"class":1188},[1086,2244,2245],{"class":1088,"line":1100},[1086,2246,1332],{"class":1188},[1086,2248,2249,2251,2253,2255,2257,2259,2261,2263,2265,2267,2269,2271],{"class":1088,"line":1139},[1086,2250,1337],{"class":1096},[1086,2252,1340],{"class":1103},[1086,2254,1343],{"class":1096},[1086,2256,1216],{"class":1107},[1086,2258,1348],{"class":1096},[1086,2260,1216],{"class":1107},[1086,2262,1353],{"class":1215},[1086,2264,1356],{"class":1107},[1086,2266,1359],{"class":1092},[1086,2268,1362],{"class":1107},[1086,2270,1365],{"class":1092},[1086,2272,1368],{"class":1107},[1086,2274,2275,2277,2279,2281,2283,2285,2287,2289,2291,2293,2295,2297,2299,2301,2303,2305,2307,2309,2311,2313,2315,2317,2319],{"class":1088,"line":1159},[1086,2276,1373],{"class":1096},[1086,2278,1340],{"class":1103},[1086,2280,1212],{"class":1096},[1086,2282,1216],{"class":1107},[1086,2284,171],{"class":1096},[1086,2286,1216],{"class":1107},[1086,2288,1386],{"class":1215},[1086,2290,1389],{"class":1107},[1086,2292,1340],{"class":1103},[1086,2294,1394],{"class":1107},[1086,2296,1340],{"class":1103},[1086,2298,1399],{"class":1107},[1086,2300,1402],{"class":1092},[1086,2302,1405],{"class":1107},[1086,2304,1408],{"class":1103},[1086,2306,1411],{"class":1092},[1086,2308,1399],{"class":1202},[1086,2310,1264],{"class":1107},[1086,2312,1267],{"class":1202},[1086,2314,1411],{"class":1092},[1086,2316,1362],{"class":1107},[1086,2318,1424],{"class":1092},[1086,2320,1427],{"class":1107},[1086,2322,2323],{"class":1088,"line":1239},[1086,2324,2325],{"class":1188},"# The job parks at the code; on_input answers it and the wait goes on.\n",[1086,2327,2328,2331,2333,2335,2337,2339,2341,2344,2347,2349,2352,2355,2357],{"class":1088,"line":1250},[1086,2329,2330],{"class":1096},"done ",[1086,2332,1340],{"class":1103},[1086,2334,1212],{"class":1096},[1086,2336,1216],{"class":1107},[1086,2338,171],{"class":1096},[1086,2340,1216],{"class":1107},[1086,2342,2343],{"class":1215},"wait",[1086,2345,2346],{"class":1107},"(job.id, timeout",[1086,2348,1340],{"class":1103},[1086,2350,2351],{"class":1202},"300",[1086,2353,2354],{"class":1107},", on_input",[1086,2356,1340],{"class":1103},[1086,2358,2359],{"class":1107},"ask_for_code)\n",[1078,2361,2363],{"className":1430,"code":2362,"filename":1432,"language":1433,"meta":1082,"style":1082},"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",[1069,2364,2365,2403,2413,2453,2461,2465,2486,2490,2494,2498,2514,2526,2534,2538,2570,2576,2608,2612,2624,2632,2636,2648,2661,2670,2675,2681,2716,2729,2738,2743,2758,2784,2789],{"__ignoreMap":1082},[1086,2366,2367,2370,2372,2375,2378,2380,2383,2386,2388,2391,2394,2397,2400],{"class":1088,"line":1089},[1086,2368,2369],{"class":1096},"name ",[1086,2371,1452],{"class":1103},[1086,2373,2374],{"class":1096}," fmt.",[1086,2376,2377],{"class":1215},"Sprintf",[1086,2379,1356],{"class":1096},[1086,2381,2382],{"class":1092},"\"login-2fa-example-",[1086,2384,2385],{"class":1202},"%x",[1086,2387,1411],{"class":1092},[1086,2389,2390],{"class":1096},", time.",[1086,2392,2393],{"class":1215},"Now",[1086,2395,2396],{"class":1096},"().",[1086,2398,2399],{"class":1215},"UnixMilli",[1086,2401,2402],{"class":1096},"())\n",[1086,2404,2405,2408,2410],{"class":1088,"line":1100},[1086,2406,2407],{"class":1096},"publish ",[1086,2409,1452],{"class":1103},[1086,2411,2412],{"class":1202}," true\n",[1086,2414,2415,2417,2420,2422,2425,2428,2431,2433,2435,2438,2441,2444,2447,2449,2451],{"class":1088,"line":1139},[1086,2416,1469],{"class":1103},[1086,2418,2419],{"class":1096}," _, err ",[1086,2421,1452],{"class":1103},[1086,2423,2424],{"class":1096}," c.Programs.",[1086,2426,2427],{"class":1215},"Push",[1086,2429,2430],{"class":1096},"(ctx, definition, ",[1086,2432,846],{"class":1215},[1086,2434,1216],{"class":1096},[1086,2436,2437],{"class":1215},"PushOptions",[1086,2439,2440],{"class":1096},"{Name: name, Publish: ",[1086,2442,2443],{"class":1103},"&",[1086,2445,2446],{"class":1096},"publish}); err ",[1086,2448,1599],{"class":1103},[1086,2450,1602],{"class":1202},[1086,2452,1247],{"class":1096},[1086,2454,2455,2457,2459],{"class":1088,"line":1159},[1086,2456,1610],{"class":1096},[1086,2458,1613],{"class":1215},[1086,2460,1616],{"class":1096},[1086,2462,2463],{"class":1088,"line":1239},[1086,2464,1162],{"class":1096},[1086,2466,2467,2470,2473,2476,2478,2480,2483],{"class":1088,"line":1250},[1086,2468,2469],{"class":1103},"defer",[1086,2471,2472],{"class":1103}," func",[1086,2474,2475],{"class":1096},"() { _ ",[1086,2477,1340],{"class":1103},[1086,2479,2424],{"class":1096},[1086,2481,2482],{"class":1215},"Delete",[1086,2484,2485],{"class":1096},"(ctx, name) }()\n",[1086,2487,2488],{"class":1088,"line":1275},[1086,2489,1931],{"emptyLinePlaceholder":1930},[1086,2491,2492],{"class":1088,"line":1303},[1086,2493,1440],{"class":1188},[1086,2495,2496],{"class":1088,"line":1311},[1086,2497,1445],{"class":1188},[1086,2499,2500,2502,2504,2506,2508,2510,2512],{"class":1088,"line":1585},[1086,2501,1337],{"class":1096},[1086,2503,1452],{"class":1103},[1086,2505,1455],{"class":1096},[1086,2507,1458],{"class":1215},[1086,2509,1356],{"class":1096},[1086,2511,1359],{"class":1092},[1086,2513,1368],{"class":1096},[1086,2515,2516,2518,2520,2522,2524],{"class":1088,"line":1591},[1086,2517,1469],{"class":1103},[1086,2519,1472],{"class":1096},[1086,2521,1475],{"class":1103},[1086,2523,1478],{"class":1092},[1086,2525,1247],{"class":1096},[1086,2527,2528,2530,2532],{"class":1088,"line":1607},[1086,2529,1485],{"class":1096},[1086,2531,1340],{"class":1103},[1086,2533,1490],{"class":1092},[1086,2535,2536],{"class":1088,"line":1619},[1086,2537,1162],{"class":1096},[1086,2539,2540,2542,2544,2546,2548,2550,2552,2554,2556,2558,2560,2562,2564,2566,2568],{"class":1088,"line":1624},[1086,2541,1499],{"class":1096},[1086,2543,1452],{"class":1103},[1086,2545,1504],{"class":1096},[1086,2547,1507],{"class":1215},[1086,2549,1510],{"class":1096},[1086,2551,1513],{"class":1215},[1086,2553,1216],{"class":1096},[1086,2555,1518],{"class":1215},[1086,2557,1521],{"class":1096},[1086,2559,1524],{"class":1103},[1086,2561,1510],{"class":1096},[1086,2563,1529],{"class":1103},[1086,2565,1532],{"class":1096},[1086,2567,634],{"class":1215},[1086,2569,1537],{"class":1096},[1086,2571,2572,2574],{"class":1088,"line":1641},[1086,2573,1542],{"class":1092},[1086,2575,1545],{"class":1096},[1086,2577,2578,2580,2582,2584,2586,2588,2590,2592,2594,2596,2598,2600,2602,2604,2606],{"class":1088,"line":1654},[1086,2579,1550],{"class":1092},[1086,2581,1553],{"class":1096},[1086,2583,1524],{"class":1103},[1086,2585,1510],{"class":1096},[1086,2587,1529],{"class":1103},[1086,2589,1532],{"class":1096},[1086,2591,634],{"class":1215},[1086,2593,1399],{"class":1096},[1086,2595,1402],{"class":1092},[1086,2597,1570],{"class":1096},[1086,2599,1573],{"class":1103},[1086,2601,1478],{"class":1092},[1086,2603,1362],{"class":1096},[1086,2605,1424],{"class":1092},[1086,2607,1582],{"class":1096},[1086,2609,2610],{"class":1088,"line":1663},[1086,2611,1588],{"class":1096},[1086,2613,2614,2616,2618,2620,2622],{"class":1088,"line":2138},[1086,2615,1469],{"class":1103},[1086,2617,1596],{"class":1096},[1086,2619,1599],{"class":1103},[1086,2621,1602],{"class":1202},[1086,2623,1247],{"class":1096},[1086,2625,2626,2628,2630],{"class":1088,"line":2163},[1086,2627,1610],{"class":1096},[1086,2629,1613],{"class":1215},[1086,2631,1616],{"class":1096},[1086,2633,2634],{"class":1088,"line":2170},[1086,2635,1162],{"class":1096},[1086,2637,2638,2640,2642,2644,2646],{"class":1088,"line":2175},[1086,2639,1627],{"class":1096},[1086,2641,1452],{"class":1103},[1086,2643,1632],{"class":1096},[1086,2645,1635],{"class":1215},[1086,2647,1638],{"class":1096},[1086,2649,2651,2653,2655,2657,2659],{"class":1088,"line":2650},22,[1086,2652,1469],{"class":1103},[1086,2654,1596],{"class":1096},[1086,2656,1599],{"class":1103},[1086,2658,1602],{"class":1202},[1086,2660,1247],{"class":1096},[1086,2662,2664,2666,2668],{"class":1088,"line":2663},23,[1086,2665,1610],{"class":1096},[1086,2667,1613],{"class":1215},[1086,2669,1616],{"class":1096},[1086,2671,2673],{"class":1088,"line":2672},24,[1086,2674,1162],{"class":1096},[1086,2676,2678],{"class":1088,"line":2677},25,[1086,2679,2680],{"class":1188},"\u002F\u002F The job parks at the code; OnInput answers it and the wait goes on.\n",[1086,2682,2684,2687,2689,2691,2694,2697,2699,2701,2704,2707,2710,2713],{"class":1088,"line":2683},26,[1086,2685,2686],{"class":1096},"done, err ",[1086,2688,1452],{"class":1103},[1086,2690,1632],{"class":1096},[1086,2692,2693],{"class":1215},"Wait",[1086,2695,2696],{"class":1096},"(ctx, job.ID, ",[1086,2698,846],{"class":1215},[1086,2700,1216],{"class":1096},[1086,2702,2703],{"class":1215},"WaitOptions",[1086,2705,2706],{"class":1096},"{Timeout: ",[1086,2708,2709],{"class":1202},"5",[1086,2711,2712],{"class":1103}," *",[1086,2714,2715],{"class":1096}," time.Minute, OnInput: askForCode})\n",[1086,2717,2719,2721,2723,2725,2727],{"class":1088,"line":2718},27,[1086,2720,1469],{"class":1103},[1086,2722,1596],{"class":1096},[1086,2724,1599],{"class":1103},[1086,2726,1602],{"class":1202},[1086,2728,1247],{"class":1096},[1086,2730,2732,2734,2736],{"class":1088,"line":2731},28,[1086,2733,1610],{"class":1096},[1086,2735,1613],{"class":1215},[1086,2737,1616],{"class":1096},[1086,2739,2741],{"class":1088,"line":2740},29,[1086,2742,1162],{"class":1096},[1086,2744,2746,2748,2751,2753,2756],{"class":1088,"line":2745},30,[1086,2747,1469],{"class":1103},[1086,2749,2750],{"class":1096}," done.Status ",[1086,2752,1599],{"class":1103},[1086,2754,2755],{"class":1092}," \"succeeded\"",[1086,2757,1247],{"class":1096},[1086,2759,2761,2763,2766,2768,2771,2774,2777,2779,2781],{"class":1088,"line":2760},31,[1086,2762,1610],{"class":1096},[1086,2764,2765],{"class":1215},"Fatalf",[1086,2767,1356],{"class":1096},[1086,2769,2770],{"class":1092},"\"job ",[1086,2772,2773],{"class":1202},"%s",[1086,2775,2776],{"class":1092}," is ",[1086,2778,2773],{"class":1202},[1086,2780,1411],{"class":1092},[1086,2782,2783],{"class":1096},", done.ID, done.Status)\n",[1086,2785,2787],{"class":1088,"line":2786},32,[1086,2788,1162],{"class":1096},[1086,2790,2792,2795,2798,2800,2802,2804,2807],{"class":1088,"line":2791},33,[1086,2793,2794],{"class":1096},"fmt.",[1086,2796,2797],{"class":1215},"Printf",[1086,2799,1356],{"class":1096},[1086,2801,1411],{"class":1092},[1086,2803,2773],{"class":1202},[1086,2805,2806],{"class":1092},": signed in\\n\"",[1086,2808,2809],{"class":1096},", done.ID)\n",[1061,2811,2813],{"id":2812},"saving-the-session","Saving the session",[1025,2815,2816,2817,2819,2820,2823,2824,1108],{},"A ",[1069,2818,595],{}," with ",[1069,2821,2822],{},"save_session"," writes the browser's signed-in state to a named\n",[1049,2825,504],{"href":2826},"\u002Fconcepts\u002Fsessions",[1078,2828,2830],{"className":1080,"code":2829,"language":680,"meta":1082,"style":1082},"{ \"checkpoint\": { \"name\": \"logged_in\", \"save_session\": \"portal-login\" } }\n",[1069,2831,2832],{"__ignoreMap":1082},[1086,2833,2834,2836,2839,2841,2843,2845,2847,2850,2852,2855,2857,2860],{"class":1088,"line":1089},[1086,2835,1685],{"class":1096},[1086,2837,2838],{"class":1103},"\"checkpoint\"",[1086,2840,1108],{"class":1107},[1086,2842,1111],{"class":1096},[1086,2844,1695],{"class":1103},[1086,2846,1108],{"class":1107},[1086,2848,2849],{"class":1092}," \"logged_in\"",[1086,2851,1122],{"class":1107},[1086,2853,2854],{"class":1103}," \"save_session\"",[1086,2856,1108],{"class":1107},[1086,2858,2859],{"class":1092}," \"portal-login\"",[1086,2861,1764],{"class":1096},[1025,2863,2864],{},"Bind the same session in the program's options and let the program start after that checkpoint\nwhenever the session is still valid:",[1078,2866,2868],{"className":1080,"code":2867,"language":680,"meta":1082,"style":1082},"\"options\": { \"max_tier\": \"browser\", \"session\": \"portal-login\", \"resume_from_session\": true }\n",[1069,2869,2870],{"__ignoreMap":1082},[1086,2871,2872,2875,2878,2881,2883,2886,2888,2891,2893,2895,2897,2900,2902,2904],{"class":1088,"line":1089},[1086,2873,2874],{"class":1092},"\"options\"",[1086,2876,2877],{"class":1096},": { ",[1086,2879,2880],{"class":1103},"\"max_tier\"",[1086,2882,1108],{"class":1107},[1086,2884,2885],{"class":1092}," \"browser\"",[1086,2887,1122],{"class":1107},[1086,2889,2890],{"class":1103}," \"session\"",[1086,2892,1108],{"class":1107},[1086,2894,2859],{"class":1092},[1086,2896,1122],{"class":1107},[1086,2898,2899],{"class":1103}," \"resume_from_session\"",[1086,2901,1108],{"class":1107},[1086,2903,1922],{"class":1202},[1086,2905,1156],{"class":1096},[1025,2907,2908,2909,2912,2913,2916,2917,2919,2920,2923,2924,2927],{},"Before each job, Kaabist checks the session against the program's ",[1069,2910,2911],{},"logged_in"," and ",[1069,2914,2915],{},"login_page","\nlandmarks. If the session is valid, the job starts at the step after the checkpoint, and the login\nsteps, the ",[1069,2918,592],{}," included, never run. If it has expired, the program runs from the top and\nsigns in again; ",[1069,2921,2922],{},"policies.on_session_expired"," (default ",[1069,2925,2926],{},"refresh",") decides what happens when a\nsession expires in the middle of a run.",[1029,2929,2931],{"id":2930},"worked-example","Worked example",[1025,2933,2934,2935,2938],{},"Take a customer portal at ",[1069,2936,2937],{},"https:\u002F\u002Fportal.example.com"," that asks for an e-mail address and a\npassword, then a six-digit code, then shows a report of 40 rows. The program below signs in, asks for the code only when the code form is\nactually shown, saves the session, and reads the report:",[1078,2940,2942],{"className":1080,"code":2941,"language":680,"meta":1082,"style":1082},"{\n  \"kaab\": \"1\",\n  \"name\": \"portal-report\",\n  \"inputs\": {\n    \"base_url\": { \"type\": \"string\", \"default\": \"https:\u002F\u002Fportal.example.com\" },\n    \"email\": { \"type\": \"string\", \"default\": \"dev@kaab.ist\" },\n    \"password\": { \"type\": \"secret\" },\n    \"report_id\": { \"type\": \"string\", \"default\": \"1\", \"pattern\": \"^[0-9]+$\" }\n  },\n  \"options\": { \"max_tier\": \"browser\", \"session\": \"portal-login\", \"resume_from_session\": true },\n  \"landmarks\": {\n    \"login_page\": { \"visible\": \"form[action$='\u002Flogin']\" },\n    \"logged_in\": { \"url\": \"**\u002Fdashboard\" }\n  },\n  \"steps\": [\n    { \"id\": \"open\", \"goto\": \"{{inputs.base_url}}\u002Flogin\", \"expect\": { \"landmark\": \"login_page\" } },\n    { \"id\": \"email\", \"fill\": \"input[name=email]\", \"value\": \"{{inputs.email}}\" },\n    { \"id\": \"password\", \"fill\": \"input[name=password]\", \"value\": \"{{inputs.password}}\" },\n    {\n      \"id\": \"submit\", \"click\": \"form button[type=submit]\", \"side_effect\": true,\n      \"expect\": { \"any\": [{ \"visible\": \"input[name=code]\" }, { \"landmark\": \"logged_in\" }] }\n    },\n    {\n      \"id\": \"second-factor\",\n      \"when\": { \"visible\": \"input[name=code]\" },\n      \"do\": [\n        { \"id\": \"ask-otp\", \"await_input\": { \"name\": \"otp\", \"prompt\": \"The code from your authenticator\", \"type\": \"string\",\n          \"pattern\": \"^[0-9]{6}$\", \"ttl\": \"5m\", \"expires\": \"24h\", \"collect\": \"api\" } },\n        { \"id\": \"fill-otp\", \"fill\": \"input[name=code]\", \"value\": \"{{vars.otp}}\" },\n        { \"id\": \"verify\", \"click\": \"form button[type=submit]\", \"side_effect\": true,\n          \"expect\": { \"landmark\": \"logged_in\" } }\n      ]\n    },\n    { \"id\": \"save\", \"checkpoint\": { \"name\": \"logged_in\", \"save_session\": \"portal-login\" } },\n    {\n      \"id\": \"report\", \"goto\": \"{{inputs.base_url}}\u002Freports\u002F{{inputs.report_id}}\",\n      \"expect\": { \"count\": { \"target\": \"#report tbody tr\", \"min\": 40 } }\n    },\n    {\n      \"id\": \"rows\",\n      \"extract\": {\n        \"rows\": {\n          \"selector\": \"#report tbody tr\", \"many\": true, \"min_items\": 40,\n          \"fields\": {\n            \"date\": { \"selector\": \"td:nth-child(1)\", \"type\": \"date\", \"date_format\": \"dd.MM.yyyy\" },\n            \"description\": \"td:nth-child(2)\",\n            \"amount\": { \"selector\": \"td:nth-child(3)\", \"type\": \"money\", \"locale\": \"tr\", \"currency\": \"TRY\" }\n          }\n        }\n      }\n    }\n  ],\n  \"policies\": { \"on_session_expired\": \"refresh\", \"screenshot\": \"on_failure\" }\n}\n",[1069,2943,2944,2948,2960,2972,2981,3009,3036,3055,3090,3096,3131,3140,3161,3180,3186,3196,3241,3276,3309,3314,3345,3384,3391,3395,3406,3425,3434,3479,3516,3548,3577,3594,3599,3605,3644,3649,3670,3706,3713,3718,3730,3740,3750,3780,3790,3831,3844,3892,3898,3904,3910,3916,3924,3954],{"__ignoreMap":1082},[1086,2945,2946],{"class":1088,"line":1089},[1086,2947,1537],{"class":1096},[1086,2949,2950,2953,2955,2958],{"class":1088,"line":1100},[1086,2951,2952],{"class":1103},"  \"kaab\"",[1086,2954,1108],{"class":1107},[1086,2956,2957],{"class":1092}," \"1\"",[1086,2959,1136],{"class":1107},[1086,2961,2962,2965,2967,2970],{"class":1088,"line":1139},[1086,2963,2964],{"class":1103},"  \"name\"",[1086,2966,1108],{"class":1107},[1086,2968,2969],{"class":1092}," \"portal-report\"",[1086,2971,1136],{"class":1107},[1086,2973,2974,2977,2979],{"class":1088,"line":1159},[1086,2975,2976],{"class":1103},"  \"inputs\"",[1086,2978,1108],{"class":1107},[1086,2980,1247],{"class":1096},[1086,2982,2983,2986,2988,2990,2992,2994,2996,2998,3000,3002,3005,3007],{"class":1088,"line":1239},[1086,2984,2985],{"class":1103},"    \"base_url\"",[1086,2987,1108],{"class":1107},[1086,2989,1111],{"class":1096},[1086,2991,1114],{"class":1103},[1086,2993,1108],{"class":1107},[1086,2995,1119],{"class":1092},[1086,2997,1122],{"class":1107},[1086,2999,1125],{"class":1103},[1086,3001,1108],{"class":1107},[1086,3003,3004],{"class":1092}," \"https:\u002F\u002Fportal.example.com\"",[1086,3006,1133],{"class":1096},[1086,3008,1136],{"class":1107},[1086,3010,3011,3014,3016,3018,3020,3022,3024,3026,3028,3030,3032,3034],{"class":1088,"line":1250},[1086,3012,3013],{"class":1103},"    \"email\"",[1086,3015,1108],{"class":1107},[1086,3017,1111],{"class":1096},[1086,3019,1114],{"class":1103},[1086,3021,1108],{"class":1107},[1086,3023,1119],{"class":1092},[1086,3025,1122],{"class":1107},[1086,3027,1125],{"class":1103},[1086,3029,1108],{"class":1107},[1086,3031,1130],{"class":1092},[1086,3033,1133],{"class":1096},[1086,3035,1136],{"class":1107},[1086,3037,3038,3041,3043,3045,3047,3049,3051,3053],{"class":1088,"line":1275},[1086,3039,3040],{"class":1103},"    \"password\"",[1086,3042,1108],{"class":1107},[1086,3044,1111],{"class":1096},[1086,3046,1114],{"class":1103},[1086,3048,1108],{"class":1107},[1086,3050,1153],{"class":1092},[1086,3052,1133],{"class":1096},[1086,3054,1136],{"class":1107},[1086,3056,3057,3060,3062,3064,3066,3068,3070,3072,3074,3076,3078,3080,3083,3085,3088],{"class":1088,"line":1303},[1086,3058,3059],{"class":1103},"    \"report_id\"",[1086,3061,1108],{"class":1107},[1086,3063,1111],{"class":1096},[1086,3065,1114],{"class":1103},[1086,3067,1108],{"class":1107},[1086,3069,1119],{"class":1092},[1086,3071,1122],{"class":1107},[1086,3073,1125],{"class":1103},[1086,3075,1108],{"class":1107},[1086,3077,2957],{"class":1092},[1086,3079,1122],{"class":1107},[1086,3081,3082],{"class":1103}," \"pattern\"",[1086,3084,1108],{"class":1107},[1086,3086,3087],{"class":1092}," \"^[0-9]+$\"",[1086,3089,1156],{"class":1096},[1086,3091,3092,3094],{"class":1088,"line":1311},[1086,3093,1306],{"class":1096},[1086,3095,1136],{"class":1107},[1086,3097,3098,3101,3103,3105,3107,3109,3111,3113,3115,3117,3119,3121,3123,3125,3127,3129],{"class":1088,"line":1585},[1086,3099,3100],{"class":1103},"  \"options\"",[1086,3102,1108],{"class":1107},[1086,3104,1111],{"class":1096},[1086,3106,2880],{"class":1103},[1086,3108,1108],{"class":1107},[1086,3110,2885],{"class":1092},[1086,3112,1122],{"class":1107},[1086,3114,2890],{"class":1103},[1086,3116,1108],{"class":1107},[1086,3118,2859],{"class":1092},[1086,3120,1122],{"class":1107},[1086,3122,2899],{"class":1103},[1086,3124,1108],{"class":1107},[1086,3126,1922],{"class":1202},[1086,3128,1133],{"class":1096},[1086,3130,1136],{"class":1107},[1086,3132,3133,3136,3138],{"class":1088,"line":1591},[1086,3134,3135],{"class":1103},"  \"landmarks\"",[1086,3137,1108],{"class":1107},[1086,3139,1247],{"class":1096},[1086,3141,3142,3145,3147,3149,3152,3154,3157,3159],{"class":1088,"line":1607},[1086,3143,3144],{"class":1103},"    \"login_page\"",[1086,3146,1108],{"class":1107},[1086,3148,1111],{"class":1096},[1086,3150,3151],{"class":1103},"\"visible\"",[1086,3153,1108],{"class":1107},[1086,3155,3156],{"class":1092}," \"form[action$='\u002Flogin']\"",[1086,3158,1133],{"class":1096},[1086,3160,1136],{"class":1107},[1086,3162,3163,3166,3168,3170,3173,3175,3178],{"class":1088,"line":1619},[1086,3164,3165],{"class":1103},"    \"logged_in\"",[1086,3167,1108],{"class":1107},[1086,3169,1111],{"class":1096},[1086,3171,3172],{"class":1103},"\"url\"",[1086,3174,1108],{"class":1107},[1086,3176,3177],{"class":1092}," \"**\u002Fdashboard\"",[1086,3179,1156],{"class":1096},[1086,3181,3182,3184],{"class":1088,"line":1624},[1086,3183,1306],{"class":1096},[1086,3185,1136],{"class":1107},[1086,3187,3188,3191,3193],{"class":1088,"line":1641},[1086,3189,3190],{"class":1103},"  \"steps\"",[1086,3192,1108],{"class":1107},[1086,3194,3195],{"class":1096}," [\n",[1086,3197,3198,3201,3204,3206,3209,3211,3214,3216,3219,3221,3224,3226,3228,3231,3233,3236,3239],{"class":1088,"line":1654},[1086,3199,3200],{"class":1096},"    { ",[1086,3202,3203],{"class":1103},"\"id\"",[1086,3205,1108],{"class":1107},[1086,3207,3208],{"class":1092}," \"open\"",[1086,3210,1122],{"class":1107},[1086,3212,3213],{"class":1103}," \"goto\"",[1086,3215,1108],{"class":1107},[1086,3217,3218],{"class":1092}," \"{{inputs.base_url}}\u002Flogin\"",[1086,3220,1122],{"class":1107},[1086,3222,3223],{"class":1103}," \"expect\"",[1086,3225,1108],{"class":1107},[1086,3227,1111],{"class":1096},[1086,3229,3230],{"class":1103},"\"landmark\"",[1086,3232,1108],{"class":1107},[1086,3234,3235],{"class":1092}," \"login_page\"",[1086,3237,3238],{"class":1096}," } }",[1086,3240,1136],{"class":1107},[1086,3242,3243,3245,3247,3249,3252,3254,3257,3259,3262,3264,3267,3269,3272,3274],{"class":1088,"line":1663},[1086,3244,3200],{"class":1096},[1086,3246,3203],{"class":1103},[1086,3248,1108],{"class":1107},[1086,3250,3251],{"class":1092}," \"email\"",[1086,3253,1122],{"class":1107},[1086,3255,3256],{"class":1103}," \"fill\"",[1086,3258,1108],{"class":1107},[1086,3260,3261],{"class":1092}," \"input[name=email]\"",[1086,3263,1122],{"class":1107},[1086,3265,3266],{"class":1103}," \"value\"",[1086,3268,1108],{"class":1107},[1086,3270,3271],{"class":1092}," \"{{inputs.email}}\"",[1086,3273,1133],{"class":1096},[1086,3275,1136],{"class":1107},[1086,3277,3278,3280,3282,3284,3287,3289,3291,3293,3296,3298,3300,3302,3305,3307],{"class":1088,"line":2138},[1086,3279,3200],{"class":1096},[1086,3281,3203],{"class":1103},[1086,3283,1108],{"class":1107},[1086,3285,3286],{"class":1092}," \"password\"",[1086,3288,1122],{"class":1107},[1086,3290,3256],{"class":1103},[1086,3292,1108],{"class":1107},[1086,3294,3295],{"class":1092}," \"input[name=password]\"",[1086,3297,1122],{"class":1107},[1086,3299,3266],{"class":1103},[1086,3301,1108],{"class":1107},[1086,3303,3304],{"class":1092}," \"{{inputs.password}}\"",[1086,3306,1133],{"class":1096},[1086,3308,1136],{"class":1107},[1086,3310,3311],{"class":1088,"line":2163},[1086,3312,3313],{"class":1096},"    {\n",[1086,3315,3316,3319,3321,3324,3326,3329,3331,3334,3336,3339,3341,3343],{"class":1088,"line":2170},[1086,3317,3318],{"class":1103},"      \"id\"",[1086,3320,1108],{"class":1107},[1086,3322,3323],{"class":1092}," \"submit\"",[1086,3325,1122],{"class":1107},[1086,3327,3328],{"class":1103}," \"click\"",[1086,3330,1108],{"class":1107},[1086,3332,3333],{"class":1092}," \"form button[type=submit]\"",[1086,3335,1122],{"class":1107},[1086,3337,3338],{"class":1103}," \"side_effect\"",[1086,3340,1108],{"class":1107},[1086,3342,1922],{"class":1202},[1086,3344,1136],{"class":1107},[1086,3346,3347,3350,3352,3354,3357,3359,3362,3364,3366,3369,3371,3373,3375,3377,3379,3381],{"class":1088,"line":2175},[1086,3348,3349],{"class":1103},"      \"expect\"",[1086,3351,1108],{"class":1107},[1086,3353,1111],{"class":1096},[1086,3355,3356],{"class":1103},"\"any\"",[1086,3358,1108],{"class":1107},[1086,3360,3361],{"class":1096}," [{ ",[1086,3363,3151],{"class":1103},[1086,3365,1108],{"class":1107},[1086,3367,3368],{"class":1092}," \"input[name=code]\"",[1086,3370,1133],{"class":1096},[1086,3372,1122],{"class":1107},[1086,3374,1111],{"class":1096},[1086,3376,3230],{"class":1103},[1086,3378,1108],{"class":1107},[1086,3380,2849],{"class":1092},[1086,3382,3383],{"class":1096}," }] }\n",[1086,3385,3386,3389],{"class":1088,"line":2650},[1086,3387,3388],{"class":1096},"    }",[1086,3390,1136],{"class":1107},[1086,3392,3393],{"class":1088,"line":2663},[1086,3394,3313],{"class":1096},[1086,3396,3397,3399,3401,3404],{"class":1088,"line":2672},[1086,3398,3318],{"class":1103},[1086,3400,1108],{"class":1107},[1086,3402,3403],{"class":1092}," \"second-factor\"",[1086,3405,1136],{"class":1107},[1086,3407,3408,3411,3413,3415,3417,3419,3421,3423],{"class":1088,"line":2677},[1086,3409,3410],{"class":1103},"      \"when\"",[1086,3412,1108],{"class":1107},[1086,3414,1111],{"class":1096},[1086,3416,3151],{"class":1103},[1086,3418,1108],{"class":1107},[1086,3420,3368],{"class":1092},[1086,3422,1133],{"class":1096},[1086,3424,1136],{"class":1107},[1086,3426,3427,3430,3432],{"class":1088,"line":2683},[1086,3428,3429],{"class":1103},"      \"do\"",[1086,3431,1108],{"class":1107},[1086,3433,3195],{"class":1096},[1086,3435,3436,3439,3441,3443,3446,3448,3451,3453,3455,3457,3459,3461,3463,3465,3467,3469,3471,3473,3475,3477],{"class":1088,"line":2718},[1086,3437,3438],{"class":1096},"        { ",[1086,3440,3203],{"class":1103},[1086,3442,1108],{"class":1107},[1086,3444,3445],{"class":1092}," \"ask-otp\"",[1086,3447,1122],{"class":1107},[1086,3449,3450],{"class":1103}," \"await_input\"",[1086,3452,1108],{"class":1107},[1086,3454,1111],{"class":1096},[1086,3456,1695],{"class":1103},[1086,3458,1108],{"class":1107},[1086,3460,1700],{"class":1092},[1086,3462,1122],{"class":1107},[1086,3464,1705],{"class":1103},[1086,3466,1108],{"class":1107},[1086,3468,1710],{"class":1092},[1086,3470,1122],{"class":1107},[1086,3472,1715],{"class":1103},[1086,3474,1108],{"class":1107},[1086,3476,1119],{"class":1092},[1086,3478,1136],{"class":1107},[1086,3480,3481,3484,3486,3488,3490,3492,3494,3496,3498,3500,3502,3504,3506,3508,3510,3512,3514],{"class":1088,"line":2731},[1086,3482,3483],{"class":1103},"          \"pattern\"",[1086,3485,1108],{"class":1107},[1086,3487,1731],{"class":1092},[1086,3489,1122],{"class":1107},[1086,3491,1736],{"class":1103},[1086,3493,1108],{"class":1107},[1086,3495,1741],{"class":1092},[1086,3497,1122],{"class":1107},[1086,3499,1746],{"class":1103},[1086,3501,1108],{"class":1107},[1086,3503,1751],{"class":1092},[1086,3505,1122],{"class":1107},[1086,3507,1756],{"class":1103},[1086,3509,1108],{"class":1107},[1086,3511,1761],{"class":1092},[1086,3513,3238],{"class":1096},[1086,3515,1136],{"class":1107},[1086,3517,3518,3520,3522,3524,3527,3529,3531,3533,3535,3537,3539,3541,3544,3546],{"class":1088,"line":2740},[1086,3519,3438],{"class":1096},[1086,3521,3203],{"class":1103},[1086,3523,1108],{"class":1107},[1086,3525,3526],{"class":1092}," \"fill-otp\"",[1086,3528,1122],{"class":1107},[1086,3530,3256],{"class":1103},[1086,3532,1108],{"class":1107},[1086,3534,3368],{"class":1092},[1086,3536,1122],{"class":1107},[1086,3538,3266],{"class":1103},[1086,3540,1108],{"class":1107},[1086,3542,3543],{"class":1092}," \"{{vars.otp}}\"",[1086,3545,1133],{"class":1096},[1086,3547,1136],{"class":1107},[1086,3549,3550,3552,3554,3556,3559,3561,3563,3565,3567,3569,3571,3573,3575],{"class":1088,"line":2745},[1086,3551,3438],{"class":1096},[1086,3553,3203],{"class":1103},[1086,3555,1108],{"class":1107},[1086,3557,3558],{"class":1092}," \"verify\"",[1086,3560,1122],{"class":1107},[1086,3562,3328],{"class":1103},[1086,3564,1108],{"class":1107},[1086,3566,3333],{"class":1092},[1086,3568,1122],{"class":1107},[1086,3570,3338],{"class":1103},[1086,3572,1108],{"class":1107},[1086,3574,1922],{"class":1202},[1086,3576,1136],{"class":1107},[1086,3578,3579,3582,3584,3586,3588,3590,3592],{"class":1088,"line":2760},[1086,3580,3581],{"class":1103},"          \"expect\"",[1086,3583,1108],{"class":1107},[1086,3585,1111],{"class":1096},[1086,3587,3230],{"class":1103},[1086,3589,1108],{"class":1107},[1086,3591,2849],{"class":1092},[1086,3593,1764],{"class":1096},[1086,3595,3596],{"class":1088,"line":2786},[1086,3597,3598],{"class":1096},"      ]\n",[1086,3600,3601,3603],{"class":1088,"line":2791},[1086,3602,3388],{"class":1096},[1086,3604,1136],{"class":1107},[1086,3606,3608,3610,3612,3614,3617,3619,3622,3624,3626,3628,3630,3632,3634,3636,3638,3640,3642],{"class":1088,"line":3607},34,[1086,3609,3200],{"class":1096},[1086,3611,3203],{"class":1103},[1086,3613,1108],{"class":1107},[1086,3615,3616],{"class":1092}," \"save\"",[1086,3618,1122],{"class":1107},[1086,3620,3621],{"class":1103}," \"checkpoint\"",[1086,3623,1108],{"class":1107},[1086,3625,1111],{"class":1096},[1086,3627,1695],{"class":1103},[1086,3629,1108],{"class":1107},[1086,3631,2849],{"class":1092},[1086,3633,1122],{"class":1107},[1086,3635,2854],{"class":1103},[1086,3637,1108],{"class":1107},[1086,3639,2859],{"class":1092},[1086,3641,3238],{"class":1096},[1086,3643,1136],{"class":1107},[1086,3645,3647],{"class":1088,"line":3646},35,[1086,3648,3313],{"class":1096},[1086,3650,3652,3654,3656,3659,3661,3663,3665,3668],{"class":1088,"line":3651},36,[1086,3653,3318],{"class":1103},[1086,3655,1108],{"class":1107},[1086,3657,3658],{"class":1092}," \"report\"",[1086,3660,1122],{"class":1107},[1086,3662,3213],{"class":1103},[1086,3664,1108],{"class":1107},[1086,3666,3667],{"class":1092}," \"{{inputs.base_url}}\u002Freports\u002F{{inputs.report_id}}\"",[1086,3669,1136],{"class":1107},[1086,3671,3673,3675,3677,3679,3682,3684,3686,3689,3691,3694,3696,3699,3701,3704],{"class":1088,"line":3672},37,[1086,3674,3349],{"class":1103},[1086,3676,1108],{"class":1107},[1086,3678,1111],{"class":1096},[1086,3680,3681],{"class":1103},"\"count\"",[1086,3683,1108],{"class":1107},[1086,3685,1111],{"class":1096},[1086,3687,3688],{"class":1103},"\"target\"",[1086,3690,1108],{"class":1107},[1086,3692,3693],{"class":1092}," \"#report tbody tr\"",[1086,3695,1122],{"class":1107},[1086,3697,3698],{"class":1103}," \"min\"",[1086,3700,1108],{"class":1107},[1086,3702,3703],{"class":1202}," 40",[1086,3705,1764],{"class":1096},[1086,3707,3709,3711],{"class":1088,"line":3708},38,[1086,3710,3388],{"class":1096},[1086,3712,1136],{"class":1107},[1086,3714,3716],{"class":1088,"line":3715},39,[1086,3717,3313],{"class":1096},[1086,3719,3721,3723,3725,3728],{"class":1088,"line":3720},40,[1086,3722,3318],{"class":1103},[1086,3724,1108],{"class":1107},[1086,3726,3727],{"class":1092}," \"rows\"",[1086,3729,1136],{"class":1107},[1086,3731,3733,3736,3738],{"class":1088,"line":3732},41,[1086,3734,3735],{"class":1103},"      \"extract\"",[1086,3737,1108],{"class":1107},[1086,3739,1247],{"class":1096},[1086,3741,3743,3746,3748],{"class":1088,"line":3742},42,[1086,3744,3745],{"class":1103},"        \"rows\"",[1086,3747,1108],{"class":1107},[1086,3749,1247],{"class":1096},[1086,3751,3753,3756,3758,3760,3762,3765,3767,3769,3771,3774,3776,3778],{"class":1088,"line":3752},43,[1086,3754,3755],{"class":1103},"          \"selector\"",[1086,3757,1108],{"class":1107},[1086,3759,3693],{"class":1092},[1086,3761,1122],{"class":1107},[1086,3763,3764],{"class":1103}," \"many\"",[1086,3766,1108],{"class":1107},[1086,3768,1922],{"class":1202},[1086,3770,1122],{"class":1107},[1086,3772,3773],{"class":1103}," \"min_items\"",[1086,3775,1108],{"class":1107},[1086,3777,3703],{"class":1202},[1086,3779,1136],{"class":1107},[1086,3781,3783,3786,3788],{"class":1088,"line":3782},44,[1086,3784,3785],{"class":1103},"          \"fields\"",[1086,3787,1108],{"class":1107},[1086,3789,1247],{"class":1096},[1086,3791,3793,3796,3798,3800,3803,3805,3808,3810,3812,3814,3817,3819,3822,3824,3827,3829],{"class":1088,"line":3792},45,[1086,3794,3795],{"class":1103},"            \"date\"",[1086,3797,1108],{"class":1107},[1086,3799,1111],{"class":1096},[1086,3801,3802],{"class":1103},"\"selector\"",[1086,3804,1108],{"class":1107},[1086,3806,3807],{"class":1092}," \"td:nth-child(1)\"",[1086,3809,1122],{"class":1107},[1086,3811,1715],{"class":1103},[1086,3813,1108],{"class":1107},[1086,3815,3816],{"class":1092}," \"date\"",[1086,3818,1122],{"class":1107},[1086,3820,3821],{"class":1103}," \"date_format\"",[1086,3823,1108],{"class":1107},[1086,3825,3826],{"class":1092}," \"dd.MM.yyyy\"",[1086,3828,1133],{"class":1096},[1086,3830,1136],{"class":1107},[1086,3832,3834,3837,3839,3842],{"class":1088,"line":3833},46,[1086,3835,3836],{"class":1103},"            \"description\"",[1086,3838,1108],{"class":1107},[1086,3840,3841],{"class":1092}," \"td:nth-child(2)\"",[1086,3843,1136],{"class":1107},[1086,3845,3847,3850,3852,3854,3856,3858,3861,3863,3865,3867,3870,3872,3875,3877,3880,3882,3885,3887,3890],{"class":1088,"line":3846},47,[1086,3848,3849],{"class":1103},"            \"amount\"",[1086,3851,1108],{"class":1107},[1086,3853,1111],{"class":1096},[1086,3855,3802],{"class":1103},[1086,3857,1108],{"class":1107},[1086,3859,3860],{"class":1092}," \"td:nth-child(3)\"",[1086,3862,1122],{"class":1107},[1086,3864,1715],{"class":1103},[1086,3866,1108],{"class":1107},[1086,3868,3869],{"class":1092}," \"money\"",[1086,3871,1122],{"class":1107},[1086,3873,3874],{"class":1103}," \"locale\"",[1086,3876,1108],{"class":1107},[1086,3878,3879],{"class":1092}," \"tr\"",[1086,3881,1122],{"class":1107},[1086,3883,3884],{"class":1103}," \"currency\"",[1086,3886,1108],{"class":1107},[1086,3888,3889],{"class":1092}," \"TRY\"",[1086,3891,1156],{"class":1096},[1086,3893,3895],{"class":1088,"line":3894},48,[1086,3896,3897],{"class":1096},"          }\n",[1086,3899,3901],{"class":1088,"line":3900},49,[1086,3902,3903],{"class":1096},"        }\n",[1086,3905,3907],{"class":1088,"line":3906},50,[1086,3908,3909],{"class":1096},"      }\n",[1086,3911,3913],{"class":1088,"line":3912},51,[1086,3914,3915],{"class":1096},"    }\n",[1086,3917,3919,3922],{"class":1088,"line":3918},52,[1086,3920,3921],{"class":1096},"  ]",[1086,3923,1136],{"class":1107},[1086,3925,3927,3930,3932,3934,3937,3939,3942,3944,3947,3949,3952],{"class":1088,"line":3926},53,[1086,3928,3929],{"class":1103},"  \"policies\"",[1086,3931,1108],{"class":1107},[1086,3933,1111],{"class":1096},[1086,3935,3936],{"class":1103},"\"on_session_expired\"",[1086,3938,1108],{"class":1107},[1086,3940,3941],{"class":1092}," \"refresh\"",[1086,3943,1122],{"class":1107},[1086,3945,3946],{"class":1103}," \"screenshot\"",[1086,3948,1108],{"class":1107},[1086,3950,3951],{"class":1092}," \"on_failure\"",[1086,3953,1156],{"class":1096},[1086,3955,3957],{"class":1088,"line":3956},54,[1086,3958,1162],{"class":1096},[1025,3960,3961],{},"Run it with the account's password:",[3963,3964,3965,3981,3993,4010],"ol",{},[1784,3966,3967,3968,3971,3972,2819,3974,3977,3978,1216],{},"Create the job with ",[1069,3969,3970],{},"inputs: { \"password\": \"\u003Cthe account password>\" }",". It runs the login and parks\n",[1069,3973,1770],{},[1069,3975,3976],{},"input_request.name"," set to ",[1069,3979,3980],{},"otp",[1784,3982,3983,3984,3986,3987,3989,3990,1216],{},"Post the code to ",[1069,3985,1827],{},", or return it from the ",[1069,3988,1876],{}," handler as in the\nsnippet above, for example ",[1069,3991,3992],{},"{ \"otp\": \"482913\" }",[1784,3994,3995,3996,3999,4000,4003,4004,2912,4007,1216],{},"The job verifies the code, saves the session ",[1069,3997,3998],{},"portal-login"," and reads the report. The envelope\nshows ",[1069,4001,4002],{},"status: \"succeeded\"",", 40 rows in ",[1069,4005,4006],{},"data.rows",[1069,4008,4009],{},"meta.session.saved: true",[1784,4011,4012,4013,4016,4017,4019],{},"Create a second job with the same inputs. Its session is valid, so it starts after the\ncheckpoint: ",[1069,4014,4015],{},"meta.steps"," has no ",[1069,4018,592],{}," step, and nobody is asked for a code.",[1029,4021,4023],{"id":4022},"pitfalls","Pitfalls",[1781,4025,4026,4040,4055,4061,4073,4083],{},[1784,4027,4028,4031,4032,4035,4036,1216],{},[1037,4029,4030],{},"Clicks that sign in are side effects."," Mark the submit buttons ",[1069,4033,4034],{},"side_effect: true",", as above,\nso that a retry never presses them twice; see ",[1049,4037,4039],{"href":4038},"\u002Fguides\u002Fside-effect-safety","side-effect safety",[1784,4041,4042,4045,4046,4048,4049,4051,4052,4054],{},[1037,4043,4044],{},"A second factor that only sometimes appears."," Wrap the ",[1069,4047,592],{}," in a ",[1069,4050,599],{},", as the worked\nexample does. An unconditional ",[1069,4053,592],{}," asks for a code even when the site trusted the\ndevice and skipped it.",[1784,4056,4057,4060],{},[1037,4058,4059],{},"One session, one job at a time."," A session is exclusive by default: a second job that binds it\nwaits until the first one ends. Run parallel work under different sessions.",[1784,4062,4063,4066,4067,4069,4070,4072],{},[1037,4064,4065],{},"The browser window is short."," ",[1069,4068,1788],{}," is at most 15 minutes. A late answer still works, until\n",[1069,4071,1794],{},", but costs a few seconds while the job restores its checkpoint.",[1784,4074,4075,4078,4079,4082],{},[1037,4076,4077],{},"Login programs are rate limited and gated."," A program that fills a password field or a secret\ninput runs at most 60 times an hour per organisation (",[1069,4080,4081],{},"429 login_flow_rate_limited","), and needs a\nverified payment method on your organisation. Reusing a session keeps you well under the limit.",[1784,4084,4085,4091],{},[1037,4086,4087,4088,1216],{},"Never put a password in ",[1069,4089,4090],{},"default"," A default is stored with the program version; a secret is\ngiven per job.",[1029,4093,155],{"id":4094},"reference",[1781,4096,4097,4114,4136,4146,4157,4164],{},[1784,4098,4099,1362,4104,1136,4109],{},[1049,4100,4102],{"href":4101},"\u002Freference\u002Fdsl\u002Factions\u002Fawait-input",[1069,4103,592],{},[1049,4105,4107],{"href":4106},"\u002Freference\u002Fdsl\u002Factions\u002Fcheckpoint",[1069,4108,595],{},[1049,4110,4112],{"href":4111},"\u002Freference\u002Fdsl\u002Factions\u002Fwhen",[1069,4113,599],{},[1784,4115,4116,2912,4119,4122,4123,1136,4125,4128,4129,4122,4132,4135],{},[1049,4117,527],{"href":4118},"\u002Freference\u002Fdsl\u002Finputs",[1049,4120,531],{"href":4121},"\u002Freference\u002Fdsl\u002Foptions"," (",[1069,4124,504],{},[1069,4126,4127],{},"resume_from_session","), ",[1049,4130,534],{"href":4131},"\u002Freference\u002Fdsl\u002Fpolicies",[1069,4133,4134],{},"on_session_expired",")",[1784,4137,4138,1362,4142],{},[1049,4139,4141],{"href":4140},"\u002Freference\u002Fapi\u002Fjobs\u002Fsubmit-job-input","Submit a job's input",[1049,4143,4145],{"href":4144},"\u002Freference\u002Fapi\u002Fjobs\u002Fget-job","get a job",[1784,4147,4148,4152,4153],{},[1049,4149,4151],{"href":4150},"\u002Freference\u002Fapi\u002Fsessions\u002Fcreate-session","create a session"," and the ",[1049,4154,4156],{"href":4155},"\u002Freference\u002Fapi\u002Fschemas\u002Fsession","session schema",[1784,4158,4159],{},[1049,4160,4162],{"href":4161},"\u002Freference\u002Fcli\u002Fkaab-jobs-input",[1069,4163,887],{},[1784,4165,4166,4167,1362,4169],{},"Concepts: ",[1049,4168,42],{"href":2826},[1049,4170,4172],{"href":4171},"\u002Fconcepts\u002Fhuman-in-the-loop","human in the loop",[4174,4175,4176],"style",{},"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 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 .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 .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)}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)}",{"title":1082,"searchDepth":1139,"depth":1139,"links":4178},[4179,4180,4186,4187,4188],{"id":1031,"depth":1100,"text":1032},{"id":1058,"depth":1100,"text":1059,"children":4181},[4182,4183,4184,4185],{"id":1063,"depth":1139,"text":1064},{"id":1668,"depth":1139,"text":1669},{"id":1820,"depth":1139,"text":1821},{"id":2812,"depth":1139,"text":2813},{"id":2930,"depth":1100,"text":2931},{"id":4022,"depth":1100,"text":4023},{"id":4094,"depth":1100,"text":155},false,null,"Sign in with a password and a one-time code, save the session, and let the next job start already signed in.","md",{},"\u002Fguides\u002Fauthenticated-flows",{"title":89,"description":4191},"3.guides\u002F01.authenticated-flows","-kMe0GfUFKpjqRTJmzLSStu_O8igNVNjsrDbMoC68pM",[4199,4202],{"title":27,"path":84,"stem":4200,"description":4201,"children":-1},"3.guides\u002Findex","Step-by-step guides for the tasks Kaabist is used for, from logins with a one-time code to schedules, webhooks and testing.",{"title":92,"path":1051,"stem":4203,"description":4204,"children":-1},"3.guides\u002F02.hosted-resolve","Let your own end users finish a parked job on a page with no account: type a one-time code, apply a fix, or take over.",1793593414511]