qpilot 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +16 -16
  3. package/.next/standalone/.next/app-path-routes-manifest.json +3 -3
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +12 -12
  6. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  8. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  9. package/.next/standalone/.next/server/app/api/run/[id]/answer/route_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/api/run/[id]/pause/route_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/api/run/[id]/shot/[num]/route_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/api/run/[id]/stream/route_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/api/run/route.js +58 -68
  14. package/.next/standalone/.next/server/app/api/run/route_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/api/runs/route_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/api/settings/models/route.js +1 -1
  17. package/.next/standalone/.next/server/app/api/settings/models/route_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/api/settings/route.js +1 -1
  19. package/.next/standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/index.html +1 -1
  21. package/.next/standalone/.next/server/app/index.rsc +2 -2
  22. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/run/[id]/page.js +1 -1
  24. package/.next/standalone/.next/server/app/run/[id]/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/settings.html +1 -1
  27. package/.next/standalone/.next/server/app/settings.rsc +2 -2
  28. package/.next/standalone/.next/server/app-paths-manifest.json +3 -3
  29. package/.next/standalone/.next/server/chunks/12.js +1 -1
  30. package/.next/standalone/.next/server/chunks/864.js +1 -1
  31. package/.next/standalone/.next/server/functions-config-manifest.json +4 -4
  32. package/.next/standalone/.next/server/middleware-manifest.json +1 -1
  33. package/.next/standalone/.next/server/pages/404.html +1 -1
  34. package/.next/standalone/.next/server/pages/500.html +1 -1
  35. package/.next/standalone/.next/static/chunks/677-25363eac0e2b4fd1.js +1 -0
  36. package/.next/standalone/.next/static/chunks/app/run/[id]/page-6a54cc9b02a39151.js +1 -0
  37. package/.next/standalone/package.json +1 -1
  38. package/.next/static/chunks/677-25363eac0e2b4fd1.js +1 -0
  39. package/.next/static/chunks/app/run/[id]/page-6a54cc9b02a39151.js +1 -0
  40. package/README.md +3 -0
  41. package/package.json +1 -1
  42. package/.next/standalone/.next/static/chunks/677-f779c1efc6740046.js +0 -1
  43. package/.next/standalone/.next/static/chunks/app/run/[id]/page-f257e38c4222e3f4.js +0 -1
  44. package/.next/static/chunks/677-f779c1efc6740046.js +0 -1
  45. package/.next/static/chunks/app/run/[id]/page-f257e38c4222e3f4.js +0 -1
  46. /package/.next/standalone/.next/static/{Qhl1G-NOwSotT_4T7tz8a → bkJayQnTQRf05bk-k7JdG}/_buildManifest.js +0 -0
  47. /package/.next/standalone/.next/static/{Qhl1G-NOwSotT_4T7tz8a → bkJayQnTQRf05bk-k7JdG}/_ssgManifest.js +0 -0
  48. /package/.next/static/{Qhl1G-NOwSotT_4T7tz8a → bkJayQnTQRf05bk-k7JdG}/_buildManifest.js +0 -0
  49. /package/.next/static/{Qhl1G-NOwSotT_4T7tz8a → bkJayQnTQRf05bk-k7JdG}/_ssgManifest.js +0 -0
@@ -1,77 +1,67 @@
1
- "use strict";(()=>{var a={};a.id=569,a.ids=[569],a.modules={261:a=>{a.exports=require("next/dist/shared/lib/router/utils/app-paths")},3295:a=>{a.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},4803:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{J:()=>B});var e=c(47168),f=c(31421),g=c(83237),h=c(41228),i=c(92628),j=c(11499),k=c(86606),l=c(6260),m=a([g]);g=(m.then?(await m)():m)[0];let C=`You are a QA agent. Execute the test case in the browser strictly using tools.
2
-
3
- Order:
4
- 1. set_plan — first call. groups=[{title?,steps}], one group per TC. steps without leading numbers.
5
- 2. navigate to the URL from the test case. Browser starts at about:blank — no page until you navigate.
6
- 3. Preconditions (login, opening a section) — execute after navigate, do not include in plan, do not call report_step. If precondition fails — step 1 = fail, then finish immediately.
7
- 4. Each step: act → read the snapshot returned BY that action → report_step(num=sequential, expected=the step's expected result copied from the test case, evidence=what you actually observed).
8
- 5. Each step exactly once. finish — after the last step.
9
-
10
- EFFICIENCY — you have a limited number of steps, do not waste them:
11
- - navigate/click/fill/select/hover/press/scroll/scroll_to/wait/dismiss/upload_file ALREADY return a fresh snapshot in their result. Do NOT call snapshot after them — just read what they returned.
12
- - Call snapshot only for the FIRST page read, or to zoom into a block with near=.
13
- - Batch independent actions in ONE turn: e.g. emit several fill calls together to fill a form, then report. Fewer round-trips = more budget for real work.
14
-
15
- LANGUAGE — match the test case. Every human-readable string you write (plan step text, report_step description and evidence, finish summary, and any text you emit) MUST be in the SAME language the test case is written in. A Russian test case gets Russian descriptions, a Spanish one gets Spanish. This is what the person reading the report sees. Quotes taken from the page keep the page's own wording. Status values, tool names and refs stay as they are.
16
-
17
- Statuses: pass | fail | warn.
18
- Critical fail (login, form open, navigate without loading): finish immediately, do not report the rest.
19
-
20
- DO NOT HALLUCINATE:
21
- - pass only if the expected result is actually present in the snapshot.
22
- - evidence — verbatim quote from the snapshot.
23
- - No element → fail, do not invent.
24
-
25
- SIDE EFFECTS — never repeat a submitting action. Buttons that save, create, submit, send, pay, delete or confirm change data on the server: click such a button ONCE per step. If the page then shows an error, a timeout, "session expired" or no confirmation, do NOT click it again — report the step as fail with the page's message as evidence. The request may have gone through even though the UI says it failed, and every retry can create a duplicate record. Repeat a submit only if the test case explicitly tells you to.
26
-
27
- Elements: ref=[eN] is required for click/fill/select/hover, taken from the MOST RECENT snapshot (including the one your last action returned). Older refs are stale. An element inside an iframe has a frame-prefixed ref like [ref=f1e2] instead of [ref=eN] — the snapshot already includes iframe content, use that ref exactly as shown, no special handling needed.
28
- For <select> dropdowns use select, not click.
29
- If a click fails with "intercepts pointer events", an open overlay (dropdown/popover) is covering the target: call dismiss to click an empty corner (closes it), then snapshot and retry. Custom dropdowns usually ignore Escape.
30
-
31
- Finding elements (IMPORTANT): the snapshot is the WHOLE loaded page, not just the visible part. Scrolling does NOT add elements to it — if a control exists it's already in the tree. So DO NOT scroll repeatedly to "find" a button.
32
- - To act on a control in a named section (e.g. "Show all" in the "Top ads" block), call snapshot with near='Top ads' — it returns just that block's tree with refs, never truncated, and disambiguates duplicate labels (there can be many "Show all"). Then click the ref. This is the right tool for "do X in section Y".
33
- - If a snapshot is truncated, use near=… to zoom in — never scroll to fix truncation.
34
- - Scroll only to: trigger lazy-loaded / infinite-scroll content that isn't in the DOM yet, or position something for a screenshot.
35
-
36
- Scrolling:
37
- - scroll_to(text or ref) — auto-scrolls whatever container holds the target (page, inner div, or sideways) until it's visible.
38
- - scroll(y, x?, ref?) for pixel scrolling. No ref = main window. To scroll a block INSIDE the page (list, panel, modal body with its own scrollbar), pass ref of ANY element inside that block — the scrollable container is found automatically. Use x for horizontal (carousels, wide tables).
39
- - scroll returns position and limits (e.g. "Vertical 800/2400px") and flags edges/no-movement — read it: if the window didn't move, content is in an inner block, retry with a ref inside it.
40
- Do not write [ref=eN] or [ref=f1eN] in description/evidence.
41
-
42
- Uploading files: when a step needs a file (photo, CSV, document), use upload_file with the name of a file attached to this run — never type a path into a text field. The <input type=file> is usually hidden and absent from the snapshot, so call upload_file WITHOUT ref first; pass ref (of the visible "Choose file" button or dropzone) only if that fails. Never ask_user for a file.
43
- You CANNOT see what is inside an attached file — you only hand it to the page. You know its name and size, nothing else. So:
44
- - Never say you read, parsed, checked or counted anything in the file. You did not.
45
- - Describe the step by what you actually did: "uploaded <name>".
46
- - For the result, quote what the PAGE reports after the upload (e.g. "Загружено 1 из 1", a file chip, an error). If the page reports nothing, say that — do not infer success from the file's content.
47
-
48
- Tabs: when an action opens a new browser tab you are switched to it automatically and told so; results list the open tabs while there is more than one. Use switch_tab(index) to go back.
49
- Dialogs: native alert/confirm/prompt dialogs are accepted (OK) automatically and their text is reported at the top of the action result — quote it as evidence when the step is about it. To press Cancel, or to type into a prompt, call handle_dialog BEFORE the action that opens the dialog.
50
-
51
- Network tools — use them ONLY when the test case asks to mock, intercept, break, slow down or inspect requests:
52
- - mock_request BEFORE the action that sends the request.
53
- - Response body: never guess field names when you can look them up. The test case gives the body → use it as is. Otherwise take the shape from the REAL response: if that request has not happened yet in this run, let it happen once without a mock, read it with get_requests, then mock with the same field names and your own values. To change a few fields of a real response prefer patch — it needs no shape at all. Invent a body from scratch only when the real request cannot be made.
54
- - Read what mock_request returns: it compares your body with the real response and names missing or wrong fields — fix the body before going on.
55
- - Mocks persist. Call clear_mocks once the test case no longer needs them (always before moving on to the next test case).
56
- - set_offline(true/false) for no-connection checks; turn the network back on afterwards.
57
- - get_requests is the Network tab: use it when the expected result is about a request (it was sent, its body, its status). Quote method, URL and status as evidence. If a mock matched 0 requests, the URL pattern is wrong — fix it instead of reporting pass.
58
- - get_console lists JS errors; use it when the test case asks about console errors.
59
-
60
- ask_user: only for OTP/captcha (not from the test case). secret=true for passwords/codes. One value at a time.
61
-
62
- TOOL CALLS ONLY. Do not write text.`,D=/^(?:f\d+)?e\d+$/;async function n(a,b){let c="string"==typeof b.ref?b.ref.trim():"";if(!D.test(c))throw Error("provide a ref from the latest snapshot (e.g. e12 or f1e2 for an element inside an iframe)");let d=a.locator(`aria-ref=${c}`);if(await d.count()===0)throw Error(`ref ${c} not found — take a fresh snapshot`);return d}let E=a=>a.replace(/\s*\[(?:ref=)?(?:f\d+)?e\d+\]/g,"");function o(a,b){let c=b;for(let b of a.secrets)b.length>=3&&(c=c.split(b).join("••••••"));return c}async function p(a,b){let c="string"==typeof b.ref?b.ref.trim():"";return!!D.test(c)&&a.locator(`aria-ref=${c}`).evaluate(a=>a instanceof HTMLInputElement&&("password"===a.type||/one-time-code|current-password|new-password|cc-csc/.test(a.autocomplete)),void 0,{timeout:1e3}).catch(()=>!1)}function q(a,b,c){a.notices.push(b),(0,i.Fj)(a.runId,{ts:Date.now(),kind:"info",text:b,info:c,stepNum:a.step.current})}function r(a){let b=a.context.pages();return b.length<2?"":"Tabs: "+b.map((b,c)=>`${c+1}) ${b.url()||"about:blank"}${b===a.page?" [active]":""}`).join(" ")+" — switch_tab(index) to change"}async function s(a){let b=a.incoming;b&&(a.incoming=null,b.isClosed()||(await b.waitForLoadState("domcontentloaded",{timeout:1e4}).catch(()=>{}),a.page=b,q(a,`A new browser tab opened (${b.url()}) — it is now the active tab.`,{type:"newTab",url:b.url()})))}function t(a,b){a.net.wirePage(b),b.on("dialog",async b=>{let c="beforeunload"===b.type()?null:a.dialogPolicy;"beforeunload"!==b.type()&&(a.dialogPolicy=null);let d=c?.action??"accept";try{"dismiss"===d?await b.dismiss():await b.accept("prompt"===b.type()?c?.text:void 0)}catch{return}if("beforeunload"===b.type())return;let e="prompt"===b.type()&&"accept"===d&&c?.text?` with "${c.text}"`:"";q(a,`Browser ${b.type()} dialog: "${b.message()}" — ${"accept"===d?`accepted (OK)${e}`:"dismissed (Cancel)"}.`,{type:"dialog",dialog:b.type(),message:b.message(),accepted:"accept"===d})}),b.on("close",()=>{if(a.page!==b)return;let c=a.context.pages().filter(a=>a!==b&&!a.isClosed()),d=c[c.length-1];d&&(a.page=d,q(a,`The active tab was closed — switched back to ${d.url()}.`,{type:"tabClosed",url:d.url()}))})}async function u(a,b){await s(a);let c=await (0,k.P9)(a.page).catch(()=>""),d=r(a);return{content:[b,d,c].filter(Boolean).join("\n\n"),observation:b}}async function v(a){try{await a()}catch(b){let a=b instanceof Error?b.message:String(b);if(/intercepts pointer events/i.test(a)){let b=a.match(/from <[^>]*class="([^"]+)"/)?.[1]?.split(/\s+/)[0];throw Error(`Click blocked: an open overlay${b?` (${b})`:""} is covering the target. Close it first — call dismiss (clicks an empty corner) or click the overlay's own trigger again, then take a fresh snapshot. Escape often doesn't work on custom dropdowns.`)}throw b}}async function w(a){try{return await a.screenshot({type:"jpeg",quality:55})}catch{return}}function x(a,b){let c=void 0===b?null:a,{x:d,y:e}=void 0===b?a:b,f=(a,b)=>{let c=a;for(;c&&c!==document.body&&c!==document.documentElement;){let a=getComputedStyle(c),d="x"===b?a.overflowX:a.overflowY,e="x"===b?c.scrollWidth>c.clientWidth+1:c.scrollHeight>c.clientHeight+1;if(/(auto|scroll|overlay)/.test(d)&&e)return c;c=c.parentElement}return null},g=Math.abs(e)>=Math.abs(d)?"y":"x",h=c?f(c,g)??f(c,"y"===g?"x":"y"):null;if(!h){let a=window.scrollX,b=window.scrollY;window.scrollBy(d,e);let c=document.documentElement;return{kind:"window",movedX:window.scrollX-a,movedY:window.scrollY-b,posY:Math.round(window.scrollY),maxY:Math.round(c.scrollHeight-window.innerHeight),posX:Math.round(window.scrollX),maxX:Math.round(c.scrollWidth-window.innerWidth)}}let i=h.scrollLeft,j=h.scrollTop;return h.scrollBy(d,e),{kind:"container",tag:h.tagName.toLowerCase(),movedX:h.scrollLeft-i,movedY:h.scrollTop-j,posY:Math.round(h.scrollTop),maxY:Math.round(h.scrollHeight-h.clientHeight),posX:Math.round(h.scrollLeft),maxX:Math.round(h.scrollWidth-h.clientWidth)}}async function y(a,b,c){let{page:d,runId:e}=c;switch(a){case"set_plan":{let a,d=a=>Array.isArray(a)?a.map(a=>String(a).trim()).filter(Boolean):"string"==typeof a?a.split("\n").map(a=>a.trim()).filter(Boolean):[];if(Array.isArray(b.groups))a=b.groups.map(a=>{let b=a??{};return{title:"string"==typeof b.title&&b.title.trim()?b.title.trim():void 0,steps:d(b.steps)}}).filter(a=>a.steps.length>0);else{let c=d(b.steps);a=c.length?[{steps:c}]:[]}if(0===a.length)return{content:'Error: set_plan received no steps. Call set_plan again with groups=[{title:"TC-01...", steps:["step one", "step two", ...]}] — steps must be a non-empty array of strings.'};(0,i.aM)(e,a),c.step.current=1;let f=[],g=0;for(let b of a)for(let a of(b.title&&f.push(b.title),b.steps))f.push(` ${++g}) ${a}`);return{content:`OK: plan set (${g} steps):
63
- ${f.join("\n")}`}}case"navigate":return await d.goto(String(b.url),{waitUntil:"domcontentloaded",timeout:2e4}),u(c,`OK: navigated to ${b.url}`);case"snapshot":{let a=await (0,k.P9)(d,"string"==typeof b.near?b.near:void 0);return{content:a,observation:`Page read (${a.length} chars)`}}case"click":{let a=await n(d,b);return await v(()=>a.click({timeout:5e3})),await d.waitForTimeout(150).catch(()=>{}),u(c,`OK: clicked ${b.name??b.ref}`)}case"fill":{let a=await n(d,b);return await v(()=>a.fill(String(b.value),{timeout:5e3})),u(c,`OK: filled "${b.value}" into ${b.name??b.ref}`)}case"select":{let a=await n(d,b),e=String(b.value);try{await a.selectOption(e,{timeout:5e3})}catch{await a.selectOption({label:e},{timeout:5e3})}return u(c,`OK: selected "${e}" in ${b.name??b.ref}`)}case"hover":{let a=await n(d,b);return await a.hover({timeout:5e3}),u(c,`OK: hovered ${b.name??b.ref}`)}case"scroll_to":{let a,e,f="string"==typeof b.ref?b.ref.trim():"",g=String(b.text??"");if(D.test(f)){if(a=d.locator(`aria-ref=${f}`),e=`ref ${f}`,await a.count()===0)return{content:`ref ${f} not found — take a fresh snapshot`}}else{if(!g)return{content:"Provide either text or ref to scroll to."};let b=await (0,k.t1)(d,g);if(!b)return{content:`Not found on page: "${g}" — try a shorter/unique substring, or it may not be loaded yet (scroll the page first to trigger lazy loading)`};a=b,e=`element containing "${g}"`}return await a.scrollIntoViewIfNeeded({timeout:5e3}),u(c,`OK: scrolled to ${e}`)}case"scroll":{let a,e=Number(b.x)||0,f=Number(b.y)||0,g="string"==typeof b.ref?b.ref.trim():"";if(D.test(g)){let b=d.locator(`aria-ref=${g}`);if(await b.count()===0)return{content:`ref ${g} not found — take a fresh snapshot`};a=await b.evaluate(x,{x:e,y:f})}else a=await d.evaluate(x,{x:e,y:f});return u(c,function(a,b,c){let d="window"===a.kind?"window":`<${a.tag}> block`,e=[`OK: scrolled ${d} by (${a.movedX}, ${a.movedY})px.`];if(0!==c||0!==a.movedY){let b=a.posY>=a.maxY-2?" (bottom reached)":a.posY<=2?" (top)":"";e.push(`Vertical ${a.posY}/${a.maxY}px${b}.`)}if(0!==b||0!==a.movedX){let b=a.posX>=a.maxX-2?" (rightmost)":a.posX<=2?" (leftmost)":"";e.push(`Horizontal ${a.posX}/${a.maxX}px${b}.`)}return 0===a.movedX&&0===a.movedY&&e.push("window"===a.kind&&(0!==b||0!==c)?"Window did not move — the content is likely inside a scrollable block; pass a ref of an element inside that block to scroll it.":"No movement — already at the edge in that direction."),e.push("Take a snapshot to see new content."),e.join(" ")}(a,e,f))}case"press":return await d.keyboard.press(String(b.key)),await d.waitForTimeout(150).catch(()=>{}),u(c,`OK: pressed ${b.key}`);case"dismiss":return await d.mouse.click(5,5),await d.waitForTimeout(150),u(c,"OK: clicked empty area to close any open overlay");case"wait":{let a=Math.min(Number(b.ms)||0,5e3);return await d.waitForTimeout(a),u(c,`OK: waited ${a}ms`)}case"upload_file":{let a=c.files;if(0===a.length)return{content:"Error: no files are attached to this run — nothing to upload."};let e=String(b.file??"").trim().toLowerCase(),f=a.find(a=>a.name.toLowerCase()===e)??a.find(a=>a.name.toLowerCase().includes(e)&&e.length>2);if(!f)return{content:`No attached file matches "${b.file}". Attached files: ${a.map(a=>a.name).join(", ")}`};let g="string"==typeof b.ref?b.ref.trim():"";if(D.test(g)){let a=d.locator(`aria-ref=${g}`);if(await a.count()===0)return{content:`ref ${g} not found — take a fresh snapshot`};if(await a.evaluate(a=>a instanceof HTMLInputElement&&"file"===a.type).catch(()=>!1))await a.setInputFiles(f.path,{timeout:5e3});else{let[b]=await Promise.all([d.waitForEvent("filechooser",{timeout:5e3}),a.click({timeout:5e3})]);await b.setFiles(f.path)}}else{let a=d.locator('input[type="file"]'),b=await a.count();if(0===b)return{content:"No file input found on the page. If uploading starts from a button that opens the file dialog, call upload_file again with ref of that button."};let c=a.first();if(b>1){let d=[];for(let c=0;c<b;c++)await a.nth(c).isVisible().catch(()=>!1)&&d.push(c);if(1!==d.length)return{content:`The page has ${b} file inputs and none is unambiguous. Call upload_file again with ref of the upload button/dropzone for the field you need.`};c=a.nth(d[0])}await c.setInputFiles(f.path,{timeout:5e3})}return u(c,`OK: attached ${f.name} to ${b.name??(g||"the upload field")}`)}case"switch_tab":{let a=c.context.pages()[Number(b.index)-1];if(!a)return{content:`No tab ${b.index}. ${r(c)||"Only one tab is open."}`};return c.page=a,await a.bringToFront().catch(()=>{}),u(c,`OK: switched to tab ${b.index} (${a.url()})`)}case"handle_dialog":{let a="dismiss"===b.action?"dismiss":"accept",d="string"==typeof b.text?b.text:void 0;return c.dialogPolicy={action:a,text:d},{content:`OK: the next dialog will be ${"dismiss"===a?"dismissed (Cancel)":`accepted (OK)${d?` with "${d}"`:""}`}. Now do the action that opens it.`}}case"mock_request":{let a=String(b.url??"").trim();if(!a)return{content:"Error: url is required — part of the request URL to intercept."};let d=void 0===b.body||null===b.body?void 0:"string"==typeof b.body?b.body:JSON.stringify(b.body),e=b.patch;if("string"==typeof e)try{e=JSON.parse(e)}catch{return{content:"Error: patch must be JSON (an object or a list)."}}let f=await c.net.addMock({url:a,method:"string"==typeof b.method?b.method:void 0,status:Number.isFinite(Number(b.status))&&void 0!==b.status?Number(b.status):void 0,body:d,contentType:"string"==typeof b.content_type?b.content_type:void 0,patch:e??void 0,abort:!0===b.abort,delayMs:Number(b.delay_ms)||void 0});return{content:`OK: ${f}`,observation:`OK: ${f.split("\n")[0]}`}}case"clear_mocks":{let a=c.net.describeMocks(),b=await c.net.clearMocks();return{content:`OK: removed ${b} mock(s).
64
- ${a}`,observation:`Removed ${b} mock(s)`}}case"set_offline":{let a=!1!==b.offline;return await c.context.setOffline(a),{content:`OK: the browser is now ${a?"OFFLINE — requests will fail":"online"}.`}}case"get_requests":{let a=c.net.requests({url:"string"==typeof b.url&&b.url.trim()?b.url.trim():void 0,method:"string"==typeof b.method?b.method:void 0,failedOnly:!0===b.failed_only,limit:Number(b.limit)||void 0}),d=c.net.describeMocks();return{content:"No active mocks."===d?a:`${a}
1
+ "use strict";(()=>{var a={};a.id=569,a.ids=[569],a.modules={261:a=>{a.exports=require("next/dist/shared/lib/router/utils/app-paths")},3295:a=>{a.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},4803:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{J:()=>B});var e=c(47168),f=c(31421),g=c(83237),h=c(41228),i=c(92628),j=c(11499),k=c(86606),l=c(6260),m=a([g]);g=(m.then?(await m)():m)[0];let C=new Set(["navigate","click","fill","select","hover","press","scroll","scroll_to","dismiss","wait","wait_for","upload_file","switch_tab"]),D=`You are a QA agent. You execute a manual test case in a real browser with tools and give a verdict for every step. Answer with tool calls; if you need to reason, one short sentence at most.
2
+
3
+ FLOW
4
+ 1. set_plan first: one group per test case, steps in the tester's words (action + expected result). Preconditions (login, opening a section) are not steps.
5
+ 2. navigate to the URL from the test case (the browser starts on about:blank) and do the preconditions.
6
+ 3. For each step, in order: do what it says → read the page tree returned by the action → report_step.
7
+ 4. finish after the last step.
8
+
9
+ SPEED — every turn is a slow round trip, so pack turns
10
+ - Every action (navigate, click, fill, select, hover, press, scroll, wait_for, upload_file…) returns the fresh page tree. Never call snapshot just to look at the page after an action.
11
+ - Put independent calls in ONE turn: all fills of a form plus its submit click; report_step for the step you have just verified plus the first action(s) of the next step; the last report_step plus finish.
12
+ - Only the LAST page action of a turn returns the page tree, so put last the action whose result you need to read.
13
+ - report_step is about results you have ALREADY seen: never in the same turn after an action of that step.
14
+
15
+ VERDICTS
16
+ - pass only when the expected result is literally in what you received. Otherwise fail. warn = done, but the outcome is unclear.
17
+ - report_step: num from the plan; expected = the step's expected result copied from the test case; evidence = what you saw, quoting the page verbatim, one or two sentences; status last, decided from that evidence. Never write refs (e12) in any text.
18
+ - Every result lists "Changes since the previous page tree" (− was, + is now). Use it for "changed / did not change" checks and quote the changed lines as evidence; "NONE" means the action changed nothing.
19
+ - A failed step does not end the run: go on with the next step. Only a failed precondition ends it.
20
+ - Each step is reported exactly once. A failed step is reported as fail at once — do not try variations to turn it into a pass.
21
+ - A precondition fails (cannot log in, the page does not load) → report step 1 as fail and finish.
22
+ - Write plan steps, evidence and the summary in the language of the test case; quotes keep the page's wording.
23
+
24
+ SCOPE — do exactly what the step says and nothing else
25
+ - No extra checks, no exploring, no cleanup. Do not undo what a step did (a switch you toggled stays toggled) unless the test case says so.
26
+ - Follow the wording literally: "click 400 px to the right of X" is a click with dx=400, not a click on X.
27
+ - A step cannot be done as written → report fail (or warn) and say why. Do not substitute another action.
28
+ - Never repeat a submitting action (save, create, send, pay, delete, confirm): one click per step. If the page then shows an error or nothing at all, report fail with the page's message — the request may have gone through, and a retry creates a duplicate.
29
+ - A step says to remember a value or to compare with an earlier state → save it with note BEFORE the page changes. Old page trees are dropped from your context.
30
+
31
+ ELEMENTS
32
+ - click/fill/select/hover need a ref from the MOST RECENT page tree; older refs are stale. Refs inside an iframe look like f1e2 — use them as shown.
33
+ - The tree is the WHOLE page, not just the visible part: scrolling never adds elements. To find a control in a named block, or when the tree is truncated, use snapshot(near="block title"). Scroll only for lazy-loaded content.
34
+ - <select> → select. Something that opens on hover (bell, avatar menu, tooltip, submenu) → hover, then act inside the opened panel; an icon-only trigger has no name — look for an unnamed button, link or image in the header.
35
+ - "intercepts pointer events" means an overlay covers the target: dismiss, then retry.
36
+ - The page still shows the old state, a loader or a spinner → wait_for(a text the new state must show, timeout_s up to 60). It is a failure only after wait_for times out.
37
+ - A new tab: you are moved to it automatically; switch_tab(index) goes back. Native dialogs are accepted (OK) automatically and their text is at the top of the result; to press Cancel or type into a prompt call handle_dialog BEFORE the action.
38
+
39
+ FILES
40
+ - A step needs a file → upload_file with the name of an attached file. You cannot see file contents: never say you read or checked them; quote what the page shows after the upload.
41
+
42
+ NETWORK — only when the test case asks to mock, break, slow down or inspect requests
43
+ - mock_request BEFORE the action that sends the request. Body: the one from the test case; otherwise let the real request happen once, read it with get_requests and reuse its field names — that is preparation, not the step: afterwards set the mock, repeat the step's action and judge the step by the mocked page. To change a few fields use patch. Invent a body only when the real request cannot be made. Read what mock_request returns: it names missing or wrong fields — fix them.
44
+ - Mocks persist: clear_mocks when the test case no longer needs them. set_offline(true) → check → set_offline(false).
45
+ - "The request was sent / with this body / returned this status" → get_requests(find=endpoint or method name). Quote method, URL and status as evidence. A mock that matched 0 requests has a wrong URL — fix it, do not report pass.
46
+
47
+ ask_user — only for a value the test case does not give and you cannot know (login, phone, OTP, captcha). secret=true for passwords and codes. One value per question.`,E=/^(?:f\d+)?e\d+$/;async function n(a,b){let c="string"==typeof b.ref?b.ref.trim():"";if(!E.test(c))throw Error("provide a ref from the latest snapshot (e.g. e12 or f1e2 for an element inside an iframe)");let d=a.locator(`aria-ref=${c}`);if(await d.count()===0)throw Error(`ref ${c} not found — take a fresh snapshot`);return d}let F=a=>a.replace(/\s*[[(](?:ref=)?(?:f\d+)?e\d+[\])]/g,"").replace(/(^|\s)(?:ref=)?(?:f\d+)?e\d{1,6}(?=[\s.,;:)]|$)/g,"");function o(a,b){let c=b;for(let b of a.secrets)b.length>=3&&(c=c.split(b).join("••••••"));return c}async function p(a,b){let c="string"==typeof b.ref?b.ref.trim():"";return!!E.test(c)&&a.locator(`aria-ref=${c}`).evaluate(a=>a instanceof HTMLInputElement&&("password"===a.type||/one-time-code|current-password|new-password|cc-csc/.test(a.autocomplete)),void 0,{timeout:1e3}).catch(()=>!1)}function q(a,b,c){a.notices.push(b),(0,i.Fj)(a.runId,{ts:Date.now(),kind:"info",text:b,info:c,stepNum:a.step.current})}function r(a){let b=a.context.pages();return b.length<2?"":"Tabs: "+b.map((b,c)=>`${c+1}) ${b.url()||"about:blank"}${b===a.page?" [active]":""}`).join(" ")+" — switch_tab(index) to change"}async function s(a){let b=a.incoming;b&&(a.incoming=null,b.isClosed()||(await b.waitForLoadState("domcontentloaded",{timeout:1e4}).catch(()=>{}),a.page=b,q(a,`A new browser tab opened (${b.url()}) — it is now the active tab.`,{type:"newTab",url:b.url()})))}function t(a,b){a.net.wirePage(b),b.on("dialog",async b=>{let c="beforeunload"===b.type()?null:a.dialogPolicy;"beforeunload"!==b.type()&&(a.dialogPolicy=null);let d=c?.action??"accept";try{"dismiss"===d?await b.dismiss():await b.accept("prompt"===b.type()?c?.text:void 0)}catch{return}if("beforeunload"===b.type())return;let e="prompt"===b.type()&&"accept"===d&&c?.text?` with "${c.text}"`:"";q(a,`Browser ${b.type()} dialog: "${b.message()}" — ${"accept"===d?`accepted (OK)${e}`:"dismissed (Cancel)"}.`,{type:"dialog",dialog:b.type(),message:b.message(),accepted:"accept"===d})}),b.on("close",()=>{if(a.page!==b)return;let c=a.context.pages().filter(a=>a!==b&&!a.isClosed()),d=c[c.length-1];d&&(a.page=d,q(a,`The active tab was closed — switched back to ${d.url()}.`,{type:"tabClosed",url:d.url()}))})}async function u(a,b){if(await s(a),await a.page.waitForLoadState("domcontentloaded",{timeout:5e3}).catch(()=>{}),!a.wantTree)return await a.net.waitForQuiet(a.actionStarted,1200),{content:`${b}
48
+ (the page tree comes with the last action of this turn)`,observation:b};await a.net.waitForQuiet(a.actionStarted,4e3);let c=await (0,k.P9)(a.page).catch(()=>""),d=r(a),e=c?function(a,b){if(null===a)return"";let c=a=>a.split("\n").map(a=>a.replace(/\s*\[ref=[^\]]+\]/g,"").trim()).filter(a=>a&&!a.startsWith("Page snapshot")),d=c(a),e=c(b);if(d[0]!==e[0])return`Page changed: ${d[0]} → ${e[0]}`;let f=a=>{let b=new Map;for(let c of a)b.set(c,(b.get(c)??0)+1);return b},g=f(d),h=f(e),i=[],j=[];for(let[a,b]of g)for(let c=h.get(a)??0;c<b;c++)i.push(a);for(let[a,b]of h)for(let c=g.get(a)??0;c<b;c++)j.push(a);if(0===i.length&&0===j.length)return"Changes since the previous page tree: NONE — the page looks exactly as before.";let k=[...i.map(a=>`− ${a}`),...j.map(a=>`+ ${a}`)],l=k.slice(0,40),m=k.length>l.length?`
49
+ … and ${k.length-l.length} more changed lines`:"";return`Changes since the previous page tree (− was, + is now):
50
+ ${l.join("\n")}${m}`}(a.lastTree,c):"";return c&&(a.lastTree=c),{content:[b,d,e,c].filter(Boolean).join("\n\n"),observation:b}}async function v(a){try{await a()}catch(b){let a=b instanceof Error?b.message:String(b);if(/intercepts pointer events/i.test(a)){let b=a.match(/from <[^>]*class="([^"]+)"/)?.[1]?.split(/\s+/)[0];throw Error(`Click blocked: an open overlay${b?` (${b})`:""} is covering the target. Close it first — call dismiss (clicks an empty corner) or click the overlay's own trigger again, then take a fresh snapshot. Escape often doesn't work on custom dropdowns.`)}throw b}}async function w(a){try{return await a.screenshot({type:"jpeg",quality:55})}catch{return}}function x(a,b){let c=void 0===b?null:a,{x:d,y:e}=void 0===b?a:b,f=(a,b)=>{let c=a;for(;c&&c!==document.body&&c!==document.documentElement;){let a=getComputedStyle(c),d="x"===b?a.overflowX:a.overflowY,e="x"===b?c.scrollWidth>c.clientWidth+1:c.scrollHeight>c.clientHeight+1;if(/(auto|scroll|overlay)/.test(d)&&e)return c;c=c.parentElement}return null},g=Math.abs(e)>=Math.abs(d)?"y":"x",h=c?f(c,g)??f(c,"y"===g?"x":"y"):null;if(!h){let a=window.scrollX,b=window.scrollY;window.scrollBy(d,e);let c=document.documentElement;return{kind:"window",movedX:window.scrollX-a,movedY:window.scrollY-b,posY:Math.round(window.scrollY),maxY:Math.round(c.scrollHeight-window.innerHeight),posX:Math.round(window.scrollX),maxX:Math.round(c.scrollWidth-window.innerWidth)}}let i=h.scrollLeft,j=h.scrollTop;return h.scrollBy(d,e),{kind:"container",tag:h.tagName.toLowerCase(),movedX:h.scrollLeft-i,movedY:h.scrollTop-j,posY:Math.round(h.scrollTop),maxY:Math.round(h.scrollHeight-h.clientHeight),posX:Math.round(h.scrollLeft),maxX:Math.round(h.scrollWidth-h.clientWidth)}}async function y(a,b,c){let{page:d,runId:e}=c;switch(a){case"set_plan":{let a,d=a=>Array.isArray(a)?a.map(a=>String(a).trim()).filter(Boolean):"string"==typeof a?a.split("\n").map(a=>a.trim()).filter(Boolean):[];if(Array.isArray(b.groups))a=b.groups.map(a=>{let b=a??{};return{title:"string"==typeof b.title&&b.title.trim()?b.title.trim():void 0,steps:d(b.steps)}}).filter(a=>a.steps.length>0);else{let c=d(b.steps);a=c.length?[{steps:c}]:[]}if(0===a.length)return{content:'Error: set_plan received no steps. Call set_plan again with groups=[{title:"TC-01...", steps:["step one", "step two", ...]}] — steps must be a non-empty array of strings.'};(0,i.aM)(e,a),c.step.current=1;let f=[],g=0;for(let b of a)for(let a of(b.title&&f.push(b.title),b.steps))f.push(` ${++g}) ${a}`);return{content:`OK: plan set (${g} steps):
51
+ ${f.join("\n")}`}}case"navigate":return await d.goto(String(b.url),{waitUntil:"domcontentloaded",timeout:6e4}),u(c,`OK: navigated to ${b.url}`);case"snapshot":{let a=await (0,k.P9)(d,"string"==typeof b.near?b.near:void 0);return"string"!=typeof b.near&&(c.lastTree=a),{content:a,observation:`Page read (${a.length} chars)`}}case"click":{let a=await n(d,b),e=Number(b.dx)||0,f=Number(b.dy)||0;if(0!==e||0!==f){await a.scrollIntoViewIfNeeded({timeout:5e3});let g=await a.boundingBox();if(!g)throw Error(`${b.ref} is not visible — cannot click next to it`);let h=Math.round(g.x+g.width/2+e),i=Math.round(g.y+g.height/2+f),j=d.viewportSize()??{width:1440,height:900};if(h<0||i<0||h>=j.width||i>=j.height)return{content:`Error: the point (${h}, ${i}) is outside the ${j.width}\xd7${j.height} viewport. The element's centre is at (${Math.round(g.x+g.width/2)}, ${Math.round(g.y+g.height/2)}) — use a smaller offset.`};return await d.mouse.click(h,i),await d.waitForTimeout(150).catch(()=>{}),u(c,`OK: clicked at (${h}, ${i}) — ${e}px right / ${f}px down from the centre of ${b.name??b.ref}`)}return await v(()=>a.click({timeout:5e3})),await d.waitForTimeout(150).catch(()=>{}),u(c,`OK: clicked ${b.name??b.ref}`)}case"fill":{let a=await n(d,b);return await v(()=>a.fill(String(b.value),{timeout:5e3})),u(c,`OK: filled "${b.value}" into ${b.name??b.ref}`)}case"select":{let a=await n(d,b),e=String(b.value);try{await a.selectOption(e,{timeout:5e3})}catch{await a.selectOption({label:e},{timeout:5e3})}return u(c,`OK: selected "${e}" in ${b.name??b.ref}`)}case"hover":{let a=await n(d,b);return await a.hover({timeout:5e3}),await d.waitForTimeout(450).catch(()=>{}),u(c,`OK: hovered ${b.name??b.ref}`)}case"scroll_to":{let a,e,f="string"==typeof b.ref?b.ref.trim():"",g=String(b.text??"");if(E.test(f)){if(a=d.locator(`aria-ref=${f}`),e=`ref ${f}`,await a.count()===0)return{content:`ref ${f} not found — take a fresh snapshot`}}else{if(!g)return{content:"Provide either text or ref to scroll to."};let b=await (0,k.t1)(d,g);if(!b)return{content:`Not found on page: "${g}" — try a shorter/unique substring, or it may not be loaded yet (scroll the page first to trigger lazy loading)`};a=b,e=`element containing "${g}"`}return await a.scrollIntoViewIfNeeded({timeout:5e3}),u(c,`OK: scrolled to ${e}`)}case"scroll":{let a,e=Number(b.x)||0,f=Number(b.y)||0,g="string"==typeof b.ref?b.ref.trim():"";if(E.test(g)){let b=d.locator(`aria-ref=${g}`);if(await b.count()===0)return{content:`ref ${g} not found — take a fresh snapshot`};a=await b.evaluate(x,{x:e,y:f})}else a=await d.evaluate(x,{x:e,y:f});return u(c,function(a,b,c){let d="window"===a.kind?"window":`<${a.tag}> block`,e=[`OK: scrolled ${d} by (${a.movedX}, ${a.movedY})px.`];if(0!==c||0!==a.movedY){let b=a.posY>=a.maxY-2?" (bottom reached)":a.posY<=2?" (top)":"";e.push(`Vertical ${a.posY}/${a.maxY}px${b}.`)}if(0!==b||0!==a.movedX){let b=a.posX>=a.maxX-2?" (rightmost)":a.posX<=2?" (leftmost)":"";e.push(`Horizontal ${a.posX}/${a.maxX}px${b}.`)}return 0===a.movedX&&0===a.movedY&&e.push("window"===a.kind&&(0!==b||0!==c)?"Window did not move — the content is likely inside a scrollable block; pass a ref of an element inside that block to scroll it.":"No movement — already at the edge in that direction."),e.push("Take a snapshot to see new content."),e.join(" ")}(a,e,f))}case"press":return await d.keyboard.press(String(b.key)),await d.waitForTimeout(150).catch(()=>{}),u(c,`OK: pressed ${b.key}`);case"dismiss":return await d.mouse.click(5,5),await d.waitForTimeout(150),u(c,"OK: clicked empty area to close any open overlay");case"wait_for":{let a=String(b.text??"").trim();if(!a)return{content:"Error: text is required — what should appear on the page."};let e=!0===b.gone,f=Math.min(Math.max(Number(b.timeout_s)||30,1),90),g=Date.now(),h=d.getByText(a,{exact:!1}).first(),i=await h.waitFor({state:e?"hidden":"visible",timeout:1e3*f}).then(()=>!0,()=>!1),j=Math.round((Date.now()-g)/1e3);return u(c,i?`OK: "${a}" ${e?"disappeared":"appeared"} after ${j}s`:`TIMEOUT: "${a}" ${e?"is still there":"did not appear"} after ${f}s — the page shown below is its current state`)}case"wait":{let a=Math.min(Number(b.ms)||0,1e4);return await d.waitForTimeout(a),u(c,`OK: waited ${a}ms`)}case"upload_file":{let a=c.files;if(0===a.length)return{content:"Error: no files are attached to this run — nothing to upload."};let e=String(b.file??"").trim().toLowerCase(),f=a.find(a=>a.name.toLowerCase()===e)??a.find(a=>a.name.toLowerCase().includes(e)&&e.length>2);if(!f)return{content:`No attached file matches "${b.file}". Attached files: ${a.map(a=>a.name).join(", ")}`};let g="string"==typeof b.ref?b.ref.trim():"";if(E.test(g)){let a=d.locator(`aria-ref=${g}`);if(await a.count()===0)return{content:`ref ${g} not found — take a fresh snapshot`};if(await a.evaluate(a=>a instanceof HTMLInputElement&&"file"===a.type).catch(()=>!1))await a.setInputFiles(f.path,{timeout:5e3});else{let[b]=await Promise.all([d.waitForEvent("filechooser",{timeout:5e3}),a.click({timeout:5e3})]);await b.setFiles(f.path)}}else{let a=d.locator('input[type="file"]'),b=await a.count();if(0===b)return{content:"No file input found on the page. If uploading starts from a button that opens the file dialog, call upload_file again with ref of that button."};let c=a.first();if(b>1){let d=[];for(let c=0;c<b;c++)await a.nth(c).isVisible().catch(()=>!1)&&d.push(c);if(1!==d.length)return{content:`The page has ${b} file inputs and none is unambiguous. Call upload_file again with ref of the upload button/dropzone for the field you need.`};c=a.nth(d[0])}await c.setInputFiles(f.path,{timeout:5e3})}return u(c,`OK: attached ${f.name} to ${b.name??(g||"the upload field")}`)}case"note":return{content:String(b.text??"").trim()?"OK: noted — it stays in your context.":"Error: text is required."};case"switch_tab":{let a=c.context.pages()[Number(b.index)-1];if(!a)return{content:`No tab ${b.index}. ${r(c)||"Only one tab is open."}`};return c.page=a,await a.bringToFront().catch(()=>{}),u(c,`OK: switched to tab ${b.index} (${a.url()})`)}case"handle_dialog":{let a="dismiss"===b.action?"dismiss":"accept",d="string"==typeof b.text?b.text:void 0;return c.dialogPolicy={action:a,text:d},{content:`OK: the next dialog will be ${"dismiss"===a?"dismissed (Cancel)":`accepted (OK)${d?` with "${d}"`:""}`}. Now do the action that opens it.`}}case"mock_request":{let a=String(b.url??"").trim();if(!a)return{content:"Error: url is required — part of the request URL to intercept."};let d=void 0===b.body||null===b.body?void 0:"string"==typeof b.body?b.body:JSON.stringify(b.body),e=b.patch;if("string"==typeof e)try{e=JSON.parse(e)}catch{return{content:"Error: patch must be JSON (an object or a list)."}}let f=await c.net.addMock({url:a,method:"string"==typeof b.method?b.method:void 0,status:Number.isFinite(Number(b.status))&&void 0!==b.status?Number(b.status):void 0,body:d,contentType:"string"==typeof b.content_type?b.content_type:void 0,patch:e??void 0,abort:!0===b.abort,delayMs:Number(b.delay_ms)||void 0});return{content:`OK: ${f}`,observation:`OK: ${f.split("\n")[0]}`}}case"clear_mocks":{let a=c.net.describeMocks(),b=await c.net.clearMocks();return{content:`OK: removed ${b} mock(s).
52
+ ${a}`,observation:`Removed ${b} mock(s)`}}case"set_offline":{let a=!1!==b.offline;return await c.context.setOffline(a),{content:`OK: the browser is now ${a?"OFFLINE — requests will fail":"online"}.`}}case"get_requests":{let a=c.net.requests({find:String(b.find??b.url??"").trim()||void 0,method:"string"==typeof b.method?b.method:void 0,failedOnly:!0===b.failed_only,limit:Number(b.limit)||void 0}),d=c.net.describeMocks();return{content:"No active mocks."===d?a:`${a}
65
53
 
66
54
  Active mocks:
67
55
  ${d}`,observation:a.split("\n")[0]}}case"get_console":{let a=c.net.allConsoleErrors();return{content:a.length?`${a.length} console error(s):
68
- ${a.map(a=>`- ${a}`).join("\n")}`:"No console errors so far.",observation:`${a.length} console error(s)`}}case"ask_user":{let a=String(b.prompt??""),d=!!b.secret,f=await (0,i.e$)(e,a,d);return d&&f&&c.secrets.add(f),{content:f,observation:d?"User entered a secret value":`User replied: ${f}`}}case"report_step":{let a,f=b.status,g=Number(b.num);if("fail"===f||"warn"===f){let b=await w(d);b&&((0,i.Se)(e,g,b),a=`/api/run/${e}/shot/${g}`)}let h=a=>o(c,E(String(a))).trim(),j=c.net.takeConsoleErrors().slice(0,5).map(a=>o(c,a)),k={num:g,description:h(b.description).replace(/^\s*\d+[.)]\s*/,""),status:f,expected:b.expected?h(b.expected):void 0,evidence:b.evidence?h(b.evidence):void 0,screenshot:a,consoleErrors:j.length?j:void 0,mockUnverified:c.net.takeUnverifiedMockHits()>0||void 0};return(0,i.Fj)(e,{ts:Date.now(),kind:"step",step:k,stepNum:g}),c.step.current=g+1,{content:`OK: step ${k.num} = ${k.status}`}}case"finish":{let a="passed"===b.status?"passed":"failed";return(0,i.Fj)(e,{ts:Date.now(),kind:"done",status:a,summary:o(c,E(String(b.summary??"")))}),{content:"OK: run finished",finished:!0}}default:return{content:`Unknown tool: ${a}`}}}let F=a=>new Promise(b=>setTimeout(b,a));async function z(a,b,c){let d;for(let e=0;e<5;e++)try{if("anthropic"===a.kind)return await b.messages.create({model:a.model,max_tokens:2048,system:[{type:"text",text:C,cache_control:{type:"ephemeral"}}],messages:c,tools:k.It,tool_choice:{type:"auto"}});return await (0,l.nz)(a,C,c,k.It)}catch(b){d=b;let a=b.status;if(a&&a>=400&&a<500&&429!==a||4===e)break;await F(function(a,b){let c=a?.retryAfterMs??(0,l.mu)(a?.headers?.get?.("retry-after")??null);return"number"==typeof c&&c>0?Math.min(c,3e4):Math.min(1e3*2**b,3e4)+Math.floor(500*Math.random())}(b,e))}throw d}function A(a,b){if(0===a.notices.length)return b;let c=a.notices.splice(0).map(a=>`NOTE: ${a}`).join("\n");return`${c}
56
+ ${a.map(a=>`- ${a}`).join("\n")}`:"No console errors so far.",observation:`${a.length} console error(s)`}}case"ask_user":{let a=String(b.prompt??""),d=!!b.secret,f=await (0,i.e$)(e,a,d);return d&&f&&c.secrets.add(f),{content:f,observation:d?"User entered a secret value":`User replied: ${f}`}}case"report_step":{let a,f=b.status,g=(0,i.Mh)(e)?.steps??[],h=Number(b.num);Number.isInteger(h)&&(!(g.length>0)||g.some(a=>a.num===h))||(h=c.step.current);let j=g.find(a=>a.num===h);if(g.length>0&&!j)return{content:`Error: the plan has ${g.length} steps and all of them are reported. Call finish.`};if(j&&"queued"!==j.status){let a=g.find(a=>"queued"===a.status);return{content:`Error: step ${h} is already reported as ${j.status} — each step is reported exactly once. ${a?`Go on with step ${a.num}: "${a.description}".`:"All steps are reported — call finish."}`}}if("fail"===f||"warn"===f){let b=await w(d);b&&((0,i.Se)(e,h,b),a=`/api/run/${e}/shot/${h}`)}let k=a=>o(c,F(String(a))).trim(),l=c.net.takeConsoleErrors().slice(0,5).map(a=>o(c,a)),m={num:h,description:(b.description?k(b.description).replace(/^\s*\d+[.)]\s*/,""):"")||j?.description||`Step ${h}`,status:f,expected:b.expected?k(b.expected):void 0,evidence:b.evidence?k(b.evidence):void 0,screenshot:a,consoleErrors:l.length?l:void 0,mockUnverified:c.net.takeUnverifiedMockHits()>0||void 0};(0,i.Fj)(e,{ts:Date.now(),kind:"step",step:m,stepNum:h});let n=g.find(a=>a.num!==h&&"queued"===a.status);return c.step.current=n?.num??h+1,{content:`OK: step ${m.num} = ${m.status}. ${n?`Next: step ${n.num} — "${n.description}".`:"That was the last step — call finish."}`}}case"finish":{let a="passed"===b.status?"passed":"failed";return(0,i.Fj)(e,{ts:Date.now(),kind:"done",status:a,summary:o(c,F(String(b.summary??"")))}),{content:"OK: run finished",finished:!0}}default:return{content:`Unknown tool: ${a}`}}}let G=a=>new Promise(b=>setTimeout(b,a));async function z(a,b,c){let d;for(let e=0;e<5;e++)try{if("anthropic"===a.kind)return await b.messages.create({model:a.model,max_tokens:2048,system:[{type:"text",text:D,cache_control:{type:"ephemeral"}}],messages:c,tools:k.It,tool_choice:{type:"auto"}});return await (0,l.nz)(a,D,c,k.It)}catch(b){d=b;let a=b.status;if(a&&a>=400&&a<500&&429!==a||4===e)break;await G(function(a,b){let c=a?.retryAfterMs??(0,l.mu)(a?.headers?.get?.("retry-after")??null);return"number"==typeof c&&c>0?Math.min(c,3e4):Math.min(1e3*2**b,3e4)+Math.floor(500*Math.random())}(b,e))}throw d}function A(a,b){if(0===a.notices.length)return b;let c=a.notices.splice(0).map(a=>`NOTE: ${a}`).join("\n");return`${c}
57
+
58
+ ${b}`}async function B(a,b,c=!0){let d=null,m=function(){try{if("darwin"===process.platform)return(0,f.spawn)("caffeinate",["-i"],{stdio:"ignore"});if("win32"===process.platform)return(0,f.spawn)("powershell",["-NonInteractive","-Command","Add-Type -Name K -Namespace W -MemberDefinition '[DllImport(\"kernel32.dll\")] public static extern uint SetThreadExecutionState(uint f);'; while($true){[W.K]::SetThreadExecutionState(0x80000003); Start-Sleep 30}"],{stdio:"ignore"});if("linux"===process.platform)return(0,f.spawn)("systemd-inhibit",["--what=sleep:idle","--who=qpilot","--why=Running test","--mode=block","sleep","infinity"],{stdio:"ignore"})}catch{}return null}(),n=(0,l.Kd)(),q="anthropic"===n.kind?new e.Ay({apiKey:n.apiKey,baseURL:n.baseURL,timeout:l.nC}):null;try{d=await g.chromium.launch({channel:"chrome",headless:c});let e=await d.newContext({viewport:{width:1440,height:900},ignoreHTTPSErrors:!0}),f=await e.newPage(),h=(0,i.oc)(a),l={runId:a,page:f,context:e,net:new j.z(e),step:{current:1},files:h,incoming:null,lastTree:null,wantTree:!0,actionStarted:Date.now(),dialogPolicy:null,notices:[],secrets:new Set};t(l,f),e.on("page",a=>{t(l,a),l.incoming=a});let m=(0,i.Mh)(a)?.language==="ru"?"The test case is written in Russian — write every step description, expected, evidence and the summary in Russian.":"Write every step description, expected, evidence and the summary in the language the test case above is written in — do not translate them into another language.",r=h.length?"\n\nFiles attached to this run — you can ONLY upload them (upload_file, exact name); their contents are not available to you:\n"+h.map(a=>`- ${a.name} (${Math.max(1,Math.round(a.size/1024))} KB)`).join("\n"):"",s=[{role:"user",content:"Test case(s):\n\n```\n"+b+"\n```"+r+"\n\n"+m}],u=0,v=l.step.current,w=[],x=l.step.current,B=0;for(let b=0;b<200;b++){await (0,i.F5)(a);let b=function(a){if(64e3>=a.reduce((a,b)=>{let c="string"==typeof b.content?b.content:JSON.stringify(b.content??"");return a+c.length},0))return a;let b=[];for(let c=0;c<a.length;c++){let d=a[c];if("user"===d.role&&Array.isArray(d.content))for(let a=0;a<d.content.length;a++)d.content[a]?.type==="tool_result"&&b.push([c,a])}let c=new Set(b.slice(0,-3).map(([a,b])=>`${a}-${b}`));return a.map((a,b)=>{if("user"!==a.role||!Array.isArray(a.content))return a;let d=a.content.map((a,d)=>{if(!c.has(`${b}-${d}`)||a?.type!=="tool_result")return a;let e="string"==typeof a.content?a.content:JSON.stringify(a.content??"");return e.length<400?a:{...a,content:`[…old tool output (page snapshot or request list), ${e.length} chars omitted]`}});return{...a,content:d}})}(s),c=Date.now(),d=await z(n,q,b);(0,i.FD)(a,{calls:1,modelMs:Date.now()-c,inputTokens:d.usage?.input_tokens??0,outputTokens:d.usage?.output_tokens??0});let e=d.content.flatMap(a=>"text"===a.type?[a.text]:[]).join(""),f=d.content.filter(a=>"tool_use"===a.type);if(e.trim()&&(0,i.Fj)(a,{ts:Date.now(),kind:"thought",text:o(l,F(e)),stepNum:l.step.current}),s.push({role:"assistant",content:d.content}),0===f.length){if((0,i.Fj)(a,{ts:Date.now(),kind:"observation",text:`[debug] no tool_calls \xb7 stop_reason=${d.stop_reason} \xb7 content=${JSON.stringify(e.slice(0,200))}`}),++u>=3){(0,i.Fj)(a,{ts:Date.now(),kind:"done",status:"failed",summary:"Agent stopped calling tools. Last response: "+(e.slice(0,300)||"(empty)")});break}s.push({role:"user",content:"You answered with text and no tool call. Go on with the test case using tool calls only; when every step is reported, call finish."});continue}u=0;let g=!1,h=!1,j=[],m=f.map(a=>C.has(a.name)).lastIndexOf(!0),r=!1;for(let[b,c]of f.entries()){let d=c.name,e=c.input??{};if(l.wantTree=b===m,l.actionStarted=Date.now(),"report_step"===d&&r){j.push({type:"tool_result",tool_use_id:c.id,content:"Error: not recorded. This turn also performed page actions whose result you have not seen yet. Read the page tree returned by the last action, then call report_step.",is_error:!0});continue}C.has(d)&&(r=!0),w.push(function(a,b){let c=b.name??b.near??b.text??b.ref??b.url??"",d=b.value??b.key??"";return`${a}:${c}:${d}`}(d,e)),l.step.current!==x&&(x=l.step.current,B=0),"report_step"!==d&&"set_plan"!==d&&"finish"!==d&&(15==++B||B>15&&B%10==0)&&l.notices.push(`You have spent ${B} actions on step ${l.step.current}. Do only what the step asks. If its expected result is not there by now, report the step as fail (or warn) with what you observed and go on — do not keep trying.`),"fill"===d&&"string"==typeof e.value&&e.value&&await p(l.page,e)&&l.secrets.add(e.value);let f="set_plan"===d?void 0:l.step.current;(0,i.Fj)(a,{ts:Date.now(),kind:"action",toolName:d,toolInput:function a(b,c){return 0===b.secrets.size?c:"string"==typeof c?o(b,c):Array.isArray(c)?c.map(c=>a(b,c)):c&&"object"==typeof c?Object.fromEntries(Object.entries(c).map(([c,d])=>[c,a(b,d)])):c}(l,e),stepNum:f});let n="ask_user"===d?0:Date.now();try{let b=await y(d,e,l);n&&(0,i.FD)(a,{browserMs:Date.now()-n}),j.push({type:"tool_result",tool_use_id:c.id,content:A(l,b.content)}),(0,i.Fj)(a,{ts:Date.now(),kind:"observation",text:o(l,b.observation??b.content),stepNum:f}),b.finished&&(g=!0),("navigate"===d||"ask_user"===d)&&(h=!0)}catch(g){let d=g instanceof Error?g.message:String(g),e=b===m?await (0,k.P9)(l.page).catch(()=>""):"";j.push({type:"tool_result",tool_use_id:c.id,content:A(l,e?`Error: ${d}
69
59
 
70
- ${b}`}async function B(a,b,c=!0){let d=null,k=function(){try{if("darwin"===process.platform)return(0,f.spawn)("caffeinate",["-i"],{stdio:"ignore"});if("win32"===process.platform)return(0,f.spawn)("powershell",["-NonInteractive","-Command","Add-Type -Name K -Namespace W -MemberDefinition '[DllImport(\"kernel32.dll\")] public static extern uint SetThreadExecutionState(uint f);'; while($true){[W.K]::SetThreadExecutionState(0x80000003); Start-Sleep 30}"],{stdio:"ignore"});if("linux"===process.platform)return(0,f.spawn)("systemd-inhibit",["--what=sleep:idle","--who=qpilot","--why=Running test","--mode=block","sleep","infinity"],{stdio:"ignore"})}catch{}return null}(),m=(0,l.Kd)(),n="anthropic"===m.kind?new e.Ay({apiKey:m.apiKey,baseURL:m.baseURL}):null;try{d=await g.chromium.launch({channel:"chrome",headless:c});let e=await d.newContext({viewport:{width:1440,height:900},ignoreHTTPSErrors:!0}),f=await e.newPage(),h=(0,i.oc)(a),k={runId:a,page:f,context:e,net:new j.z(e),step:{current:1},files:h,incoming:null,dialogPolicy:null,notices:[],secrets:new Set};t(k,f),e.on("page",a=>{t(k,a),k.incoming=a});let l=(0,i.Mh)(a)?.language==="ru"?"The test case is written in Russian — write every step description, expected, evidence and the summary in Russian.":"Write every step description, expected, evidence and the summary in the language the test case above is written in — do not translate them into another language.",q=h.length?"\n\nFiles attached to this run — you can ONLY upload them (upload_file, exact name); their contents are not available to you:\n"+h.map(a=>`- ${a.name} (${Math.max(1,Math.round(a.size/1024))} KB)`).join("\n"):"",r=[{role:"user",content:"Test case(s):\n\n```\n"+b+"\n```"+q+"\n\nFirst call set_plan — break into groups by test case (groups=[{title, steps}]) to show the plan. Then open the starting URL via navigate (browser starts at about:blank), handle login if needed, and execute steps in order, calling report_step with the sequential num for each. If an OTP is needed — ask_user. Finish with finish.\n\n"+l}],s=0,u=k.step.current,v=[];for(let b=0;b<200;b++){await (0,i.F5)(a);let b=function(a){if(64e3>=a.reduce((a,b)=>{let c="string"==typeof b.content?b.content:JSON.stringify(b.content??"");return a+c.length},0))return a;let b=[];for(let c=0;c<a.length;c++){let d=a[c];if("user"===d.role&&Array.isArray(d.content))for(let a=0;a<d.content.length;a++)d.content[a]?.type==="tool_result"&&b.push([c,a])}let c=new Set(b.slice(0,-3).map(([a,b])=>`${a}-${b}`));return a.map((a,b)=>{if("user"!==a.role||!Array.isArray(a.content))return a;let d=a.content.map((a,d)=>{if(!c.has(`${b}-${d}`)||a?.type!=="tool_result")return a;let e="string"==typeof a.content?a.content:JSON.stringify(a.content??"");return e.length<400?a:{...a,content:`[…old tool output (page snapshot or request list), ${e.length} chars omitted]`}});return{...a,content:d}})}(r),c=await z(m,n,b),d=c.content.flatMap(a=>"text"===a.type?[a.text]:[]).join(""),e=c.content.filter(a=>"tool_use"===a.type);if(d.trim()&&(0,i.Fj)(a,{ts:Date.now(),kind:"thought",text:o(k,E(d)),stepNum:k.step.current}),r.push({role:"assistant",content:c.content}),0===e.length){if((0,i.Fj)(a,{ts:Date.now(),kind:"observation",text:`[debug] no tool_calls \xb7 stop_reason=${c.stop_reason} \xb7 content=${JSON.stringify(d.slice(0,200))}`}),++s>=3){(0,i.Fj)(a,{ts:Date.now(),kind:"done",status:"failed",summary:"Agent stopped calling tools. Last response: "+(d.slice(0,300)||"(empty)")});break}r.push({role:"user",content:"You responded with text but did not call a tool. Continue executing the test case ONLY via tool calls (navigate/snapshot/click/fill/report_step). When all steps are done — call finish. Do not write plain text."});continue}s=0;let f=!1,g=!1,h=[];for(let b of e){let c=b.name,d=b.input??{};v.push(function(a,b){let c=b.name??b.near??b.text??b.ref??b.url??"",d=b.value??b.key??"";return`${a}:${c}:${d}`}(c,d)),"fill"===c&&"string"==typeof d.value&&d.value&&await p(k.page,d)&&k.secrets.add(d.value);let e="set_plan"===c?void 0:k.step.current;(0,i.Fj)(a,{ts:Date.now(),kind:"action",toolName:c,toolInput:function a(b,c){return 0===b.secrets.size?c:"string"==typeof c?o(b,c):Array.isArray(c)?c.map(c=>a(b,c)):c&&"object"==typeof c?Object.fromEntries(Object.entries(c).map(([c,d])=>[c,a(b,d)])):c}(k,d),stepNum:e});try{let j=await y(c,d,k);h.push({type:"tool_result",tool_use_id:b.id,content:A(k,j.content)}),(0,i.Fj)(a,{ts:Date.now(),kind:"observation",text:o(k,j.observation??j.content),stepNum:e}),j.finished&&(f=!0),("navigate"===c||"ask_user"===c)&&(g=!0)}catch(d){let c=d instanceof Error?d.message:String(d);h.push({type:"tool_result",tool_use_id:b.id,content:A(k,`Error: ${c}`),is_error:!0}),(0,i.Fj)(a,{ts:Date.now(),kind:"observation",text:o(k,`Error: ${c}`),stepNum:e})}}if(h.length>0&&r.push({role:"user",content:h}),f)break;if(k.step.current>u||g)u=k.step.current,v=[];else if(v.length>=24&&new Set(v).size<=4){(0,i.Fj)(a,{ts:Date.now(),kind:"done",status:"failed",summary:`Stuck: repeating the same few actions without progress — the agent is likely looping on a blocked action it can't resolve.`});break}}let w=(0,i.Mh)(a);w&&("running"===w.status||"waiting"===w.status||"paused"===w.status)&&(0,i.Fj)(a,{ts:Date.now(),kind:"done",status:"failed",summary:`Reached the 200-step limit before calling finish — the run is incomplete.`})}catch(c){let b=c instanceof Error?c.message:String(c);(0,i.Fj)(a,{ts:Date.now(),kind:"error",text:b})}finally{await d?.close().catch(()=>{}),k?.kill(),await (0,h.hP)(a)}}d()}catch(a){d(a)}})},6260:(a,b,c)=>{c.d(b,{D:()=>m,Kd:()=>i,Xs:()=>g,mu:()=>j,nz:()=>l,r4:()=>f,st:()=>k,xZ:()=>h});var d=c(47168),e=c(71011);let f="claude-haiku-4-5-20251001";function g(){let a=(0,e.RG)();if(a)return{config:a,source:"file"};let b=(process.env.QPILOT_PROVIDER||"anthropic").toLowerCase();if("custom"===b||"openai"===b)return process.env.QPILOT_API_KEY||process.env.QPILOT_BASE_URL?{source:"env",config:{provider:"custom",apiKey:process.env.QPILOT_API_KEY||"",model:process.env.QPILOT_MODEL||void 0,baseURL:process.env.QPILOT_BASE_URL||void 0}}:null;let c=process.env.ANTHROPIC_API_KEY||process.env.QPILOT_API_KEY||"";return c?{source:"env",config:{provider:"anthropic",apiKey:c,model:process.env.QPILOT_MODEL||void 0,baseURL:process.env.QPILOT_BASE_URL||void 0}}:null}function h(a){return"custom"===a.provider?{kind:"openai",baseURL:a.baseURL||"",apiKey:a.apiKey,model:a.model||""}:{kind:"anthropic",apiKey:a.apiKey,model:a.model||f,baseURL:a.baseURL||void 0}}function i(){let a=(0,e.RG)();if(a)return h(a);let b=(process.env.QPILOT_PROVIDER||"anthropic").toLowerCase();return"custom"===b||"openai"===b?{kind:"openai",baseURL:process.env.QPILOT_BASE_URL||"",apiKey:process.env.QPILOT_API_KEY||"",model:process.env.QPILOT_MODEL||""}:{kind:"anthropic",apiKey:process.env.ANTHROPIC_API_KEY||process.env.QPILOT_API_KEY||"",model:process.env.QPILOT_MODEL||f,baseURL:process.env.QPILOT_BASE_URL||void 0}}function j(a){if(!a)return;let b=Number(a);if(Number.isFinite(b))return Math.max(0,1e3*b);let c=Date.parse(a);if(!Number.isNaN(c))return Math.max(0,c-Date.now())}function k(a){let b="Open Settings (the gear on the home page) to set it.";return"anthropic"===a.kind?a.apiKey?null:`No Anthropic API key is configured. ${b}`:a.baseURL?a.apiKey?a.model?null:`Custom provider: the model id is not set. ${b}`:`Custom provider: the API token is not set. ${b}`:`Custom provider: the base URL is not set. ${b}`}async function l(a,b,c,d){let e,f=a.baseURL.replace(/\/+$/,"")+"/chat/completions";try{e=await fetch(f,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${a.apiKey}`},body:JSON.stringify({model:a.model,max_tokens:2048,messages:function(a,b){let c=[{role:"system",content:a}];for(let a of b){if("string"==typeof a.content){c.push({role:a.role,content:a.content});continue}if("user"===a.role){for(let b of a.content)if("tool_result"===b.type){let a="string"==typeof b.content?b.content:JSON.stringify(b.content??"");c.push({role:"tool",tool_call_id:b.tool_use_id,content:a})}else"text"===b.type&&c.push({role:"user",content:b.text});continue}let b="",d=[];for(let c of a.content)"text"===c.type?b+=c.text:"tool_use"===c.type&&d.push({id:c.id,type:"function",function:{name:c.name,arguments:JSON.stringify(c.input??{})}});c.push({role:"assistant",content:b||null,...d.length?{tool_calls:d}:{}})}return c}(b,c),tools:d.map(a=>({type:"function",function:{name:a.name,description:a.description,parameters:a.input_schema}})),tool_choice:"auto"})})}catch(c){let a=c.cause,b=a?.code??a?.message??c.message;throw Error(`Cannot reach the model endpoint ${f} (${b}). Check that the URL is right, the service is up, and you are on the network/VPN it needs. Run \`qpilot config\` to change it.`)}if(!e.ok){let a=await e.text().catch(()=>"");throw Object.assign(Error(`Model API ${e.status}: ${a.slice(0,300)}`),{status:e.status,retryAfterMs:j(e.headers.get("retry-after"))})}return function(a){let b=a?.choices?.[0],c=b?.message??{},d=[];for(let a of(c.content&&d.push({type:"text",text:c.content}),c.tool_calls??[])){let b=a.function.arguments,c={};if("string"==typeof b)try{c=JSON.parse(b||"{}")}catch{c={}}else b&&"object"==typeof b&&(c=b);d.push({type:"tool_use",id:a.id,name:a.function.name,input:c})}return{content:d,stop_reason:b?.finish_reason??"end_turn"}}(await e.json())}async function m(a){let b;if("anthropic"===a.provider){let b=new d.Ay({apiKey:a.apiKey,baseURL:a.baseURL||void 0,maxRetries:1}),c=[];try{for await(let a of b.models.list({limit:1e3}))c.push({id:a.id,name:a.display_name||a.id,created:a.created_at})}catch(a){throw Error(n(a))}return c}let c=(a.baseURL||"").replace(/\/+$/,"")+"/models";try{b=await fetch(c,{headers:{Authorization:`Bearer ${a.apiKey}`}})}catch(b){let a=b.cause;throw Error(`Cannot reach ${c} (${a?.code??a?.message??b.message})`)}if(!b.ok)throw Error(n({status:b.status,message:(await b.text().catch(()=>"")).slice(0,200)}));return((await b.json().catch(()=>({}))).data??[]).map(a=>"string"==typeof a.id?a.id:"").filter(Boolean).sort((a,b)=>a.localeCompare(b)).map(a=>({id:a,name:a}))}function n(a){return 401===a.status||403===a.status?"The API key was rejected — check that it is correct and active.":404===a.status?"This endpoint has no model list (404). Enter the model id by hand.":a.message||String(a)}},10846:a=>{a.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},11499:(a,b,c)=>{c.d(b,{z:()=>i});let d=/pass(word|wd)?|token|secret|authorization|cookie|session|otp|cvv|cvc|api[-_]?key|signature/i,e="•••";function f(a){if(!a.includes("*"))return b=>b.includes(a);let b=RegExp("^"+a.split("*").map(a=>a.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*")+"$"),c=/^https?:/.test(a)?b:new RegExp(b.source.replace(/^\^/,"").replace(/\$$/,""));return a=>c.test(a)}function g(a){if(!a)return;let b=a;try{b=JSON.stringify(function a(b){return Array.isArray(b)?b.map(a):b&&"object"==typeof b?Object.fromEntries(Object.entries(b).map(([b,c])=>d.test(b)&&null!=c&&"object"!=typeof c?[b,e]:[b,a(c)])):b}(JSON.parse(a)))}catch{b=a.replace(/([\w.-]+)=([^&\s]+)/g,(a,b)=>d.test(b)?`${b}=${e}`:a)}return(b=b.replace(/\beyJ[\w-]{8,}\.[\w-]{8,}\.[\w-]*/g,e).replace(/\bBearer\s+[\w.~+/-]+=*/gi,`Bearer ${e}`)).length>1200?`${b.slice(0,1200)}… (${b.length} chars total)`:b}function h(a,b="",c=0,d=[]){if(c>3||d.length>=80)return d;if(Array.isArray(a))a.length&&h(a[0],`${b}[]`,c+1,d);else if(a&&"object"==typeof a)for(let[e,f]of Object.entries(a)){let a=b?`${b}.${e}`:e;d.push(a),h(f,a,c+1,d)}return d}class i{constructor(a){this.mocks=[],this.nextMockId=1,this.routed=!1,this.log=[],this.byRequest=new WeakMap,this.mockedRequests=new WeakSet,this.seq=0,this.consoleErrors=[],this.consoleRead=0,this.unverifiedHits=0,this.handle=async a=>{let b=a.request(),c=[...this.mocks].reverse().find(a=>(!a.method||a.method===b.method())&&a.match(b.url()));if(!c)return a.fallback();c.hits++,c.unverified&&this.unverifiedHits++,this.mockedRequests.add(b);try{let d;if(c.delayMs&&await (d=c.delayMs,new Promise(a=>setTimeout(a,d))),c.abort)return await a.abort("failed");if(void 0!==c.patch){let b,d=await a.fetch();try{b=await d.json()}catch{return await a.fulfill({response:d})}return await a.fulfill({response:d,json:function a(b,c){let d=a=>!!a&&"object"==typeof a&&!Array.isArray(a);if(Array.isArray(b)&&d(c))return b.map(b=>a(b,c));if(!d(b)||!d(c))return c;let e={...b};for(let[d,f]of Object.entries(c))e[d]=a(b[d],f);return e}(b,c.patch),...void 0!==c.status?{status:c.status}:{}})}if(void 0!==c.status||void 0!==c.body){let d=c.body??"",e=/^\s*[[{]/.test(d),f=b.headers().origin;return await a.fulfill({status:c.status??200,contentType:c.contentType??(e?"application/json":"text/plain"),body:d,headers:f?{"access-control-allow-origin":f,"access-control-allow-credentials":"true"}:void 0})}return await a.continue()}catch{await a.continue().catch(()=>{})}},this.context=a,a.on("request",a=>this.onRequest(a)),a.on("response",a=>{let b=this.byRequest.get(a.request());if(!b||(b.status=a.status(),this.mockedRequests.has(a.request())&&(b.mocked=!0),"fetch"!==b.type&&"xhr"!==b.type))return;let c=a.headers()["content-type"]??"",d=Number(a.headers()["content-length"]??0);if(!/json|text|xml/.test(c)||d>2e5)return;let e=this.mockedRequests.has(a.request());a.text().then(a=>{if(b.resBody=g(a),!e)try{let c=JSON.parse(a);b.shape=h(c),b.isList=Array.isArray(c)}catch{}},()=>{})}),a.on("requestfailed",a=>{let b=this.byRequest.get(a);b&&(b.failed=a.failure()?.errorText??"failed")})}wirePage(a){let b=a=>{this.consoleErrors.length<100&&this.consoleErrors.push(a.length>300?`${a.slice(0,300)}…`:a)};a.on("console",a=>{"error"===a.type()&&b(a.text())}),a.on("pageerror",a=>b(`Uncaught: ${a.message}`))}onRequest(a){let b=a.resourceType();if("fetch"!==b&&"xhr"!==b&&"document"!==b)return;let c={n:++this.seq,method:a.method(),url:function(a){try{let b=new URL(a);for(let a of[...b.searchParams.keys()])d.test(a)&&b.searchParams.set(a,e);return b.toString()}catch{return a}}(a.url()),type:b,reqBody:g(a.postData())};this.byRequest.set(a,c),this.log.push(c),this.log.length>300&&this.log.shift()}checkAgainstReal(a){let b;if(void 0===a.body||a.abort||void 0!==a.patch||(a.status??200)>=400)return{verified:!0,advice:""};let c=f(a.url),d=a.method?.toUpperCase(),e=[...this.log].reverse().find(a=>a.shape&&!a.mocked&&(!d||a.method===d)&&c(a.url));if(!e)return{verified:!1,advice:'WARNING: no real response for this URL has been seen in this run, so the field names in your body are a guess. If the real request can be made, do it properly: clear_mocks → trigger the request once for real → get_requests to read the response → mock_request again with a body in that shape. Or use patch, which needs no shape. If you keep the guess and the page then shows empty/"undefined" values, that is the mock\'s fault — do not report it as a bug in the page.'};try{b=JSON.parse(a.body)}catch{return{verified:!0,advice:`Real response for this URL (${e.method} → ${e.status}): ${e.resBody??""}
60
+ ${e}`:`Error: ${d}`),is_error:!0}),(0,i.Fj)(a,{ts:Date.now(),kind:"observation",text:o(l,`Error: ${d}`),stepNum:f})}}if(j.length>0&&s.push({role:"user",content:j}),g)break;if(l.step.current>v||h)v=l.step.current,w=[];else if(w.length>=24&&new Set(w).size<=4){(0,i.Fj)(a,{ts:Date.now(),kind:"done",status:"failed",summary:`Stuck: repeating the same few actions without progress — the agent is likely looping on a blocked action it can't resolve.`});break}}let D=(0,i.Mh)(a);D&&("running"===D.status||"waiting"===D.status||"paused"===D.status)&&(0,i.Fj)(a,{ts:Date.now(),kind:"done",status:"failed",summary:`Reached the 200-step limit before calling finish — the run is incomplete.`})}catch(c){let b=c instanceof Error?c.message:String(c);(0,i.Fj)(a,{ts:Date.now(),kind:"error",text:b})}finally{await d?.close().catch(()=>{}),m?.kill(),await (0,h.hP)(a)}}d()}catch(a){d(a)}})},6260:(a,b,c)=>{c.d(b,{D:()=>n,Kd:()=>j,Xs:()=>h,mu:()=>k,nC:()=>g,nz:()=>m,r4:()=>f,st:()=>l,xZ:()=>i});var d=c(47168),e=c(71011);let f="claude-haiku-4-5-20251001",g=12e4;function h(){let a=(0,e.RG)();if(a)return{config:a,source:"file"};let b=(process.env.QPILOT_PROVIDER||"anthropic").toLowerCase();if("custom"===b||"openai"===b)return process.env.QPILOT_API_KEY||process.env.QPILOT_BASE_URL?{source:"env",config:{provider:"custom",apiKey:process.env.QPILOT_API_KEY||"",model:process.env.QPILOT_MODEL||void 0,baseURL:process.env.QPILOT_BASE_URL||void 0}}:null;let c=process.env.ANTHROPIC_API_KEY||process.env.QPILOT_API_KEY||"";return c?{source:"env",config:{provider:"anthropic",apiKey:c,model:process.env.QPILOT_MODEL||void 0,baseURL:process.env.QPILOT_BASE_URL||void 0}}:null}function i(a){return"custom"===a.provider?{kind:"openai",baseURL:a.baseURL||"",apiKey:a.apiKey,model:a.model||""}:{kind:"anthropic",apiKey:a.apiKey,model:a.model||f,baseURL:a.baseURL||void 0}}function j(){let a=(0,e.RG)();if(a)return i(a);let b=(process.env.QPILOT_PROVIDER||"anthropic").toLowerCase();return"custom"===b||"openai"===b?{kind:"openai",baseURL:process.env.QPILOT_BASE_URL||"",apiKey:process.env.QPILOT_API_KEY||"",model:process.env.QPILOT_MODEL||""}:{kind:"anthropic",apiKey:process.env.ANTHROPIC_API_KEY||process.env.QPILOT_API_KEY||"",model:process.env.QPILOT_MODEL||f,baseURL:process.env.QPILOT_BASE_URL||void 0}}function k(a){if(!a)return;let b=Number(a);if(Number.isFinite(b))return Math.max(0,1e3*b);let c=Date.parse(a);if(!Number.isNaN(c))return Math.max(0,c-Date.now())}function l(a){let b="Open Settings (the gear on the home page) to set it.";return"anthropic"===a.kind?a.apiKey?null:`No Anthropic API key is configured. ${b}`:a.baseURL?a.apiKey?a.model?null:`Custom provider: the model id is not set. ${b}`:`Custom provider: the API token is not set. ${b}`:`Custom provider: the base URL is not set. ${b}`}async function m(a,b,c,d){let e,f=a.baseURL.replace(/\/+$/,"")+"/chat/completions";try{e=await fetch(f,{method:"POST",signal:AbortSignal.timeout(g),headers:{"Content-Type":"application/json",Authorization:`Bearer ${a.apiKey}`},body:JSON.stringify({model:a.model,max_tokens:2048,messages:function(a,b){let c=[{role:"system",content:a}];for(let a of b){if("string"==typeof a.content){c.push({role:a.role,content:a.content});continue}if("user"===a.role){for(let b of a.content)if("tool_result"===b.type){let a="string"==typeof b.content?b.content:JSON.stringify(b.content??"");c.push({role:"tool",tool_call_id:b.tool_use_id,content:a})}else"text"===b.type&&c.push({role:"user",content:b.text});continue}let b="",d=[];for(let c of a.content)"text"===c.type?b+=c.text:"tool_use"===c.type&&d.push({id:c.id,type:"function",function:{name:c.name,arguments:JSON.stringify(c.input??{})}});c.push({role:"assistant",content:b||null,...d.length?{tool_calls:d}:{}})}return c}(b,c),tools:d.map(a=>({type:"function",function:{name:a.name,description:a.description,parameters:a.input_schema}})),tool_choice:"auto"})})}catch(c){if("TimeoutError"===c.name)throw Error(`The model did not answer in ${g/1e3} s (${f}).`);let a=c.cause,b=a?.code??a?.message??c.message;throw Error(`Cannot reach the model endpoint ${f} (${b}). Check that the URL is right, the service is up, and you are on the network/VPN it needs. Run \`qpilot config\` to change it.`)}if(!e.ok){let a=await e.text().catch(()=>"");throw Object.assign(Error(`Model API ${e.status}: ${a.slice(0,300)}`),{status:e.status,retryAfterMs:k(e.headers.get("retry-after"))})}return function(a){let b=a?.choices?.[0],c=b?.message??{},d=[];for(let a of(c.content&&d.push({type:"text",text:c.content}),c.tool_calls??[])){let b=a.function.arguments,c={};if("string"==typeof b)try{c=JSON.parse(b||"{}")}catch{c={}}else b&&"object"==typeof b&&(c=b);d.push({type:"tool_use",id:a.id,name:a.function.name,input:c})}let e=a?.usage;return{content:d,stop_reason:b?.finish_reason??"end_turn",usage:{input_tokens:e?.prompt_tokens??0,output_tokens:e?.completion_tokens??0}}}(await e.json())}async function n(a){let b;if("anthropic"===a.provider){let b=new d.Ay({apiKey:a.apiKey,baseURL:a.baseURL||void 0,maxRetries:1}),c=[];try{for await(let a of b.models.list({limit:1e3}))c.push({id:a.id,name:a.display_name||a.id,created:a.created_at})}catch(a){throw Error(o(a))}return c}let c=(a.baseURL||"").replace(/\/+$/,"")+"/models";try{b=await fetch(c,{headers:{Authorization:`Bearer ${a.apiKey}`}})}catch(b){let a=b.cause;throw Error(`Cannot reach ${c} (${a?.code??a?.message??b.message})`)}if(!b.ok)throw Error(o({status:b.status,message:(await b.text().catch(()=>"")).slice(0,200)}));return((await b.json().catch(()=>({}))).data??[]).map(a=>"string"==typeof a.id?a.id:"").filter(Boolean).sort((a,b)=>a.localeCompare(b)).map(a=>({id:a,name:a}))}function o(a){return 401===a.status||403===a.status?"The API key was rejected — check that it is correct and active.":404===a.status?"This endpoint has no model list (404). Enter the model id by hand.":a.message||String(a)}},10846:a=>{a.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},11499:(a,b,c)=>{c.d(b,{z:()=>j});let d=/pass(word|wd)?|token|secret|authorization|cookie|session|otp|cvv|cvc|api[-_]?key|signature/i,e="•••";function f(a){if(!a.includes("*"))return b=>b.includes(a);let b=RegExp("^"+a.split("*").map(a=>a.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*")+"$"),c=/^https?:/.test(a)?b:new RegExp(b.source.replace(/^\^/,"").replace(/\$$/,""));return a=>c.test(a)}function g(a){if(!a)return;let b=a;try{b=JSON.stringify(function a(b){return Array.isArray(b)?b.map(a):b&&"object"==typeof b?Object.fromEntries(Object.entries(b).map(([b,c])=>d.test(b)&&null!=c&&"object"!=typeof c?[b,e]:[b,a(c)])):b}(JSON.parse(a)))}catch{b=a.replace(/([\w.-]+)=([^&\s]+)/g,(a,b)=>d.test(b)?`${b}=${e}`:a)}return(b=b.replace(/\beyJ[\w-]{8,}\.[\w-]{8,}\.[\w-]*/g,e).replace(/\bBearer\s+[\w.~+/-]+=*/gi,`Bearer ${e}`)).length>1200?`${b.slice(0,1200)}… (${b.length} chars total)`:b}function h(a,b="",c=0,d=[]){if(c>3||d.length>=80)return d;if(Array.isArray(a))a.length&&h(a[0],`${b}[]`,c+1,d);else if(a&&"object"==typeof a)for(let[e,f]of Object.entries(a)){let a=b?`${b}.${e}`:e;d.push(a),h(f,a,c+1,d)}return d}let i=a=>new Promise(b=>setTimeout(b,a));class j{constructor(a){this.mocks=[],this.nextMockId=1,this.routed=!1,this.log=[],this.byRequest=new WeakMap,this.mockedRequests=new WeakSet,this.seq=0,this.consoleErrors=[],this.consoleRead=0,this.unverifiedHits=0,this.inflight=new Map,this.handle=async a=>{let b=a.request(),c=[...this.mocks].reverse().find(a=>(!a.method||a.method===b.method())&&a.match(b.url()));if(!c)return a.fallback();c.hits++,c.unverified&&this.unverifiedHits++,this.mockedRequests.add(b);try{if(c.delayMs&&await i(c.delayMs),c.abort)return await a.abort("failed");if(void 0!==c.patch){let b,d=await a.fetch();try{b=await d.json()}catch{return await a.fulfill({response:d})}return await a.fulfill({response:d,json:function a(b,c){let d=a=>!!a&&"object"==typeof a&&!Array.isArray(a);if(Array.isArray(b)&&d(c))return b.map(b=>a(b,c));if(!d(b)||!d(c))return c;let e={...b};for(let[d,f]of Object.entries(c))e[d]=a(b[d],f);return e}(b,c.patch),...void 0!==c.status?{status:c.status}:{}})}if(void 0!==c.status||void 0!==c.body){let d=c.body??"",e=/^\s*[[{]/.test(d),f=b.headers().origin;return await a.fulfill({status:c.status??200,contentType:c.contentType??(e?"application/json":"text/plain"),body:d,headers:f?{"access-control-allow-origin":f,"access-control-allow-credentials":"true"}:void 0})}return await a.continue()}catch{await a.continue().catch(()=>{})}},this.context=a,a.on("request",a=>this.onRequest(a)),a.on("response",a=>{let b=this.byRequest.get(a.request());if(!b||(b.status=a.status(),this.mockedRequests.has(a.request())&&(b.mocked=!0),"fetch"!==b.type&&"xhr"!==b.type))return;let c=a.headers()["content-type"]??"",d=Number(a.headers()["content-length"]??0);if(!/json|text|xml/.test(c)||d>2e5)return;let e=this.mockedRequests.has(a.request());a.text().then(a=>{if(b.resBody=g(a),!e)try{let c=JSON.parse(a);b.shape=h(c),b.isList=Array.isArray(c)}catch{}},()=>{})}),a.on("requestfailed",a=>{this.inflight.delete(a);let b=this.byRequest.get(a);b&&(b.failed=a.failure()?.errorText??"failed")}),a.on("requestfinished",a=>{this.inflight.delete(a)})}async waitForQuiet(a,b=4e3,c=300){let d=Date.now(),e=Date.now();for(;Date.now()-d<b;){let b=Date.now();if([...this.inflight.values()].some(c=>c>=a-50&&b-c<8e3))e=b;else if(b-e>=c)return;await i(80)}}wirePage(a){let b=a=>{this.consoleErrors.length<100&&this.consoleErrors.push(a.length>300?`${a.slice(0,300)}…`:a)};a.on("console",a=>{"error"===a.type()&&b(a.text())}),a.on("pageerror",a=>b(`Uncaught: ${a.message}`))}onRequest(a){let b=a.resourceType();if("fetch"!==b&&"xhr"!==b&&"document"!==b)return;let c={n:++this.seq,method:a.method(),url:function(a){try{let b=new URL(a);for(let a of[...b.searchParams.keys()])d.test(a)&&b.searchParams.set(a,e);return b.toString()}catch{return a}}(a.url()),type:b,reqBody:g(a.postData())};this.inflight.set(a,Date.now()),this.byRequest.set(a,c),this.log.push(c),this.log.length>300&&this.log.shift()}checkAgainstReal(a){let b;if(void 0===a.body||a.abort||void 0!==a.patch||(a.status??200)>=400)return{verified:!0,advice:""};let c=f(a.url),d=a.method?.toUpperCase(),e=[...this.log].reverse().find(a=>a.shape&&!a.mocked&&(!d||a.method===d)&&c(a.url));if(!e)return{verified:!1,advice:'WARNING: no real response for this URL has been seen in this run, so the field names in your body are a guess. If the real request can be made, do it properly: clear_mocks → trigger the request once for real → get_requests to read the response → mock_request again with a body in that shape. Or use patch, which needs no shape. If you keep the guess and the page then shows empty/"undefined" values, that is the mock\'s fault — do not report it as a bug in the page.'};try{b=JSON.parse(a.body)}catch{return{verified:!0,advice:`Real response for this URL (${e.method} → ${e.status}): ${e.resBody??""}
71
61
  Your body is not JSON — make sure that is intended.`}}let g=`Real response seen for this URL (${e.method} → ${e.status}): ${e.resBody??""}`;if(Array.isArray(b)!==e.isList)return{verified:!0,advice:`${g}
72
62
  MISMATCH: the real response is ${e.isList?"a list":"an object"}, your body is ${Array.isArray(b)?"a list":"an object"}. Call mock_request again with a body in the real shape.`};let i=new Set(h(b)),j=Array.isArray(b)&&0===b.length?[]:e.shape.filter(a=>!i.has(a)),k=[...i].filter(a=>!e.shape.includes(a));if(0===j.length&&0===k.length)return{verified:!0,advice:"Your body matches the shape of the real response for this URL."};let l=[g];return j.length&&l.push(`Fields of the real response missing from your body: ${j.slice(0,20).join(", ")}`),k.length&&l.push(`Fields in your body that the real response does not have: ${k.slice(0,20).join(", ")}`),l.push("If the page needs those fields, call mock_request again with a corrected body."),{verified:!0,advice:l.join("\n")}}async addMock(a){let b=this.checkAgainstReal(a),c={unverified:!b.verified,...a,method:a.method?.toUpperCase(),delayMs:a.delayMs?Math.min(Math.max(0,a.delayMs),3e4):void 0,id:this.nextMockId++,hits:0,match:f(a.url)};b.verified&&void 0!==c.body&&(c.status??200)<400&&(this.unverifiedHits=0),this.mocks.push(c),this.routed||(await this.context.route("**/*",this.handle),this.routed=!0);let d=c.abort?"fail with a network error":void 0!==c.patch?"pass to the server, then patch the JSON response":void 0!==c.status||void 0!==c.body?`answer ${c.status??200} without hitting the server`:"pass through",e=c.delayMs?`, delayed by ${c.delayMs}ms`:"",g=`mock #${c.id}: ${c.method??"any method"} "${c.url}" → ${d}${e}. It applies to requests sent from now on.`;return b.advice?`${g}
73
- ${b.advice}`:g}async clearMocks(){let a=this.mocks.length;return this.mocks=[],this.routed&&(await this.context.unroute("**/*",this.handle).catch(()=>{}),this.routed=!1),a}describeMocks(){return 0===this.mocks.length?"No active mocks.":this.mocks.map(a=>`mock #${a.id} ${a.method??"ANY"} "${a.url}" — matched ${a.hits} request(s)`).join("\n")}requests(a={}){let b=a.url?f(a.url):null,c=a.method?.toUpperCase(),d=Math.min(Math.max(1,a.limit??15),40),e=this.log.filter(d=>(!b||b(d.url))&&(!c||d.method===c)&&(!a.failedOnly||d.failed||(d.status??0)>=400));if(0===e.length)return`No matching requests (${this.log.length} recorded in total). Only XHR/fetch calls and page loads are recorded.`;let g=e.slice(-d),h=g.map(a=>{let b=a.failed?`FAILED (${a.failed})`:void 0!==a.status?String(a.status):"pending",c=[`#${a.n} ${a.method} ${a.url} → ${b}${a.mocked?" [mocked]":""}`];return a.reqBody&&c.push(` request body: ${a.reqBody}`),a.resBody&&c.push(` response body: ${a.resBody}`),c.join("\n")}),i=e.length>g.length?`
63
+ ${b.advice}`:g}async clearMocks(){let a=this.mocks.length;return this.mocks=[],this.routed&&(await this.context.unroute("**/*",this.handle).catch(()=>{}),this.routed=!1),a}describeMocks(){return 0===this.mocks.length?"No active mocks.":this.mocks.map(a=>`mock #${a.id} ${a.method??"ANY"} "${a.url}" — matched ${a.hits} request(s)`).join("\n")}requests(a={}){let b=a.find?f(a.find):null,c=a.method?.toUpperCase(),d=Math.min(Math.max(1,a.limit??15),40),e=this.log.filter(d=>(!b||b(d.url)||!!a.find&&!!d.reqBody?.includes(a.find))&&(!c||d.method===c)&&(!a.failedOnly||d.failed||(d.status??0)>=400));if(0===e.length)return`No matching requests (${this.log.length} recorded in total). Only XHR/fetch calls and page loads are recorded.`;let g=e.slice(-d),h=g.map(a=>{let b=a.failed?`FAILED (${a.failed})`:void 0!==a.status?String(a.status):"pending",c=[`#${a.n} ${a.method} ${a.url} → ${b}${a.mocked?" [mocked]":""}`];return a.reqBody&&c.push(` request body: ${a.reqBody}`),a.resBody&&c.push(` response body: ${a.resBody}`),c.join("\n")}),i=e.length>g.length?`
74
64
  (${e.length-g.length} earlier matches not shown — narrow the filter)`:"";return`${e.length} matching request(s), oldest first:
75
- ${h.join("\n")}${i}`}takeConsoleErrors(){let a=this.consoleErrors.slice(this.consoleRead);return this.consoleRead=this.consoleErrors.length,a}takeUnverifiedMockHits(){let a=this.unverifiedHits;return this.unverifiedHits=0,a}allConsoleErrors(){return[...this.consoleErrors]}}},11997:a=>{a.exports=require("punycode")},19121:a=>{a.exports=require("next/dist/server/app-render/action-async-storage.external.js")},27910:a=>{a.exports=require("stream")},28354:a=>{a.exports=require("util")},29021:a=>{a.exports=require("fs")},29294:a=>{a.exports=require("next/dist/server/app-render/work-async-storage.external.js")},31421:a=>{a.exports=require("node:child_process")},33873:a=>{a.exports=require("path")},37830:a=>{a.exports=require("node:stream/web")},41228:(a,b,c)=>{c.d(b,{BE:()=>g,gZ:()=>h,hP:()=>k,A4:()=>j});let d=require("node:fs/promises");var e=c(48161),f=c(76760);let g=10,h=0x1900000,i=(0,f.join)((0,e.tmpdir)(),"qpilot-uploads");async function j(a,b){if(0===b.length)return[];if(b.length>g)throw Error(`Too many attachments: ${b.length} (max ${g})`);let c=(0,f.join)(i,a);await (0,d.mkdir)(c,{recursive:!0});let e=new Set,j=[];try{for(let[a,g]of b.entries()){var l;if(g.size>h)throw Error(`Attachment "${g.name}" is ${Math.round(g.size/1024/1024)} MB — the limit is ${h/1024/1024} MB`);let b=(l=g.name,(l.split(/[/\\]/).pop()??"").trim().replace(/[^\p{L}\p{N}._\- ()[\]]+/gu,"_").replace(/^\.+/,"").slice(0,120)||`file-${a+1}`);for(let a=2;e.has(b);a++){let c=b.lastIndexOf(".");b=c>0?`${b.slice(0,c)}-${a}${b.slice(c)}`:`${b}-${a}`}e.add(b);let i=(0,f.join)(c,b);await (0,d.writeFile)(i,Buffer.from(await g.arrayBuffer())),j.push({name:b,path:i,size:g.size})}}catch(b){throw await k(a),b}return j}async function k(a){await (0,d.rm)((0,f.join)(i,a),{recursive:!0,force:!0}).catch(()=>{})}},44870:a=>{a.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},48161:a=>{a.exports=require("node:os")},55591:a=>{a.exports=require("https")},57075:a=>{a.exports=require("node:stream")},63033:a=>{a.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},71011:(a,b,c)=>{c.d(b,{I6:()=>m,RG:()=>i,o5:()=>j,ry:()=>l,s9:()=>k,tF:()=>h});var d=c(73024),e=c(48161),f=c(76760);let g=process.env.QPILOT_HOME||(0,f.join)((0,e.homedir)(),".qpilot"),h=(0,f.join)(g,"config.json");function i(){try{let a=JSON.parse((0,d.readFileSync)(h,"utf-8"));if(!a||"object"!=typeof a)return null;return{provider:"custom"===a.provider?"custom":"anthropic",apiKey:"string"==typeof a.apiKey?a.apiKey:"",model:"string"==typeof a.model&&a.model?a.model:void 0,baseURL:"string"==typeof a.baseURL&&a.baseURL?a.baseURL:void 0}}catch{return null}}function j(a){(0,d.mkdirSync)(g,{recursive:!0,mode:448});let b=`${h}.${process.pid}.tmp`;(0,d.writeFileSync)(b,JSON.stringify(a,null,2),{mode:384}),(0,d.renameSync)(b,h)}function k(a){return a?a.length>14?`${a.slice(0,7)}…${a.slice(-4)}`:"••••":""}function l(a,b,c){let d;return a&&a.provider===b&&(d=a.baseURL,(d??"").trim().replace(/\/+$/,"")===(c??"").trim().replace(/\/+$/,""))?a.apiKey:""}function m(a,b){let c=a=>"string"==typeof a?a.trim():"",d="custom"===a.provider?"custom":"anthropic",e=c(a.model),f=c(a.baseURL).replace(/\/+$/,""),g=c(a.apiKey)||l(b,d,f);if(!g){if(b?.apiKey&&b.provider===d)throw Error("Re-enter the API key to change the base URL — the saved key is only ever sent to the address it was saved with.");throw Error("custom"===d?"API token is required":"Anthropic API key is required")}if(f&&!/^https?:\/\/\S+$/.test(f))throw Error("Base URL must start with http:// or https://");if("custom"===d){if(!f)throw Error("Base URL is required for an OpenAI-compatible provider");if(!e)throw Error("Model id is required")}return{provider:d,apiKey:g,...e?{model:e}:{},...f?{baseURL:f}:{}}}},71151:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{handler:()=>x,patchFetch:()=>w,routeModule:()=>y,serverHooks:()=>B,workAsyncStorage:()=>z,workUnitAsyncStorage:()=>A});var e=c(95736),f=c(9117),g=c(4044),h=c(39326),i=c(32324),j=c(261),k=c(54290),l=c(85328),m=c(38928),n=c(46595),o=c(3421),p=c(17679),q=c(41681),r=c(63446),s=c(86439),t=c(51356),u=c(83505),v=a([u]);u=(v.then?(await v)():v)[0];let y=new e.AppRouteRouteModule({definition:{kind:f.RouteKind.APP_ROUTE,page:"/api/run/route",pathname:"/api/run",filename:"route",bundlePath:"app/api/run/route"},distDir:".next",relativeProjectDir:"",resolvedPagePath:"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/api/run/route.ts",nextConfigOutput:"standalone",userland:u}),{workAsyncStorage:z,workUnitAsyncStorage:A,serverHooks:B}=y;function w(){return(0,g.patchFetch)({workAsyncStorage:z,workUnitAsyncStorage:A})}async function x(a,b,c){var d;let e="/api/run/route";"/index"===e&&(e="/");let g=await y.prepare(a,b,{srcPage:e,multiZoneDraftMode:!1});if(!g)return b.statusCode=400,b.end("Bad Request"),null==c.waitUntil||c.waitUntil.call(c,Promise.resolve()),null;let{buildId:u,params:v,nextConfig:w,isDraftMode:x,prerenderManifest:z,routerServerContext:A,isOnDemandRevalidate:B,revalidateOnlyGenerated:C,resolvedPathname:D}=g,E=(0,j.normalizeAppPath)(e),F=!!(z.dynamicRoutes[E]||z.routes[D]);if(F&&!x){let a=!!z.routes[D],b=z.dynamicRoutes[E];if(b&&!1===b.fallback&&!a)throw new s.NoFallbackError}let G=null;!F||y.isDev||x||(G=D,G="/index"===G?"/":G);let H=!0===y.isDev||!F,I=F&&!H,J=a.method||"GET",K=(0,i.getTracer)(),L=K.getActiveScopeSpan(),M={params:v,prerenderManifest:z,renderOpts:{experimental:{cacheComponents:!!w.experimental.cacheComponents,authInterrupts:!!w.experimental.authInterrupts},supportsDynamicResponse:H,incrementalCache:(0,h.getRequestMeta)(a,"incrementalCache"),cacheLifeProfiles:null==(d=w.experimental)?void 0:d.cacheLife,isRevalidate:I,waitUntil:c.waitUntil,onClose:a=>{b.on("close",a)},onAfterTaskError:void 0,onInstrumentationRequestError:(b,c,d)=>y.onRequestError(a,b,d,A)},sharedContext:{buildId:u}},N=new k.NodeNextRequest(a),O=new k.NodeNextResponse(b),P=l.NextRequestAdapter.fromNodeNextRequest(N,(0,l.signalFromNodeResponse)(b));try{let d=async c=>y.handle(P,M).finally(()=>{if(!c)return;c.setAttributes({"http.status_code":b.statusCode,"next.rsc":!1});let d=K.getRootSpanAttributes();if(!d)return;if(d.get("next.span_type")!==m.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${d.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let e=d.get("next.route");if(e){let a=`${J} ${e}`;c.setAttributes({"next.route":e,"http.route":e,"next.span_name":a}),c.updateName(a)}else c.updateName(`${J} ${a.url}`)}),g=async g=>{var i,j;let k=async({previousCacheEntry:f})=>{try{if(!(0,h.getRequestMeta)(a,"minimalMode")&&B&&C&&!f)return b.statusCode=404,b.setHeader("x-nextjs-cache","REVALIDATED"),b.end("This page could not be found"),null;let e=await d(g);a.fetchMetrics=M.renderOpts.fetchMetrics;let i=M.renderOpts.pendingWaitUntil;i&&c.waitUntil&&(c.waitUntil(i),i=void 0);let j=M.renderOpts.collectedTags;if(!F)return await (0,o.I)(N,O,e,M.renderOpts.pendingWaitUntil),null;{let a=await e.blob(),b=(0,p.toNodeOutgoingHttpHeaders)(e.headers);j&&(b[r.NEXT_CACHE_TAGS_HEADER]=j),!b["content-type"]&&a.type&&(b["content-type"]=a.type);let c=void 0!==M.renderOpts.collectedRevalidate&&!(M.renderOpts.collectedRevalidate>=r.INFINITE_CACHE)&&M.renderOpts.collectedRevalidate,d=void 0===M.renderOpts.collectedExpire||M.renderOpts.collectedExpire>=r.INFINITE_CACHE?void 0:M.renderOpts.collectedExpire;return{value:{kind:t.CachedRouteKind.APP_ROUTE,status:e.status,body:Buffer.from(await a.arrayBuffer()),headers:b},cacheControl:{revalidate:c,expire:d}}}}catch(b){throw(null==f?void 0:f.isStale)&&await y.onRequestError(a,b,{routerKind:"App Router",routePath:e,routeType:"route",revalidateReason:(0,n.c)({isRevalidate:I,isOnDemandRevalidate:B})},A),b}},l=await y.handleResponse({req:a,nextConfig:w,cacheKey:G,routeKind:f.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:z,isRoutePPREnabled:!1,isOnDemandRevalidate:B,revalidateOnlyGenerated:C,responseGenerator:k,waitUntil:c.waitUntil});if(!F)return null;if((null==l||null==(i=l.value)?void 0:i.kind)!==t.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==l||null==(j=l.value)?void 0:j.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});(0,h.getRequestMeta)(a,"minimalMode")||b.setHeader("x-nextjs-cache",B?"REVALIDATED":l.isMiss?"MISS":l.isStale?"STALE":"HIT"),x&&b.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let m=(0,p.fromNodeOutgoingHttpHeaders)(l.value.headers);return(0,h.getRequestMeta)(a,"minimalMode")&&F||m.delete(r.NEXT_CACHE_TAGS_HEADER),!l.cacheControl||b.getHeader("Cache-Control")||m.get("Cache-Control")||m.set("Cache-Control",(0,q.getCacheControlHeader)(l.cacheControl)),await (0,o.I)(N,O,new Response(l.value.body,{headers:m,status:l.value.status||200})),null};L?await g(L):await K.withPropagatedContext(a.headers,()=>K.trace(m.BaseServerSpan.handleRequest,{spanName:`${J} ${a.url}`,kind:i.SpanKind.SERVER,attributes:{"http.method":J,"http.target":a.url}},g))}catch(b){if(b instanceof s.NoFallbackError||await y.onRequestError(a,b,{routerKind:"App Router",routePath:E,routeType:"route",revalidateReason:(0,n.c)({isRevalidate:I,isOnDemandRevalidate:B})}),F)throw b;return await (0,o.I)(N,O,new Response(null,{status:500})),null}}d()}catch(a){d(a)}})},73024:a=>{a.exports=require("node:fs")},73566:a=>{a.exports=require("worker_threads")},74075:a=>{a.exports=require("zlib")},76760:a=>{a.exports=require("node:path")},77598:a=>{a.exports=require("node:crypto")},78474:a=>{a.exports=require("node:events")},79551:a=>{a.exports=require("url")},81630:a=>{a.exports=require("http")},83237:a=>{a.exports=import("playwright")},83505:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{POST:()=>n,dynamic:()=>p,runtime:()=>o});var e=c(10641),f=c(77598),g=c.n(f),h=c(92628),i=c(4803),j=c(41228),k=c(6260),l=a([i]);i=(l.then?(await l)():l)[0];let o="nodejs",p="force-dynamic",q=j.BE*j.gZ;async function m(a){if((a.headers.get("content-type")??"").includes("multipart/form-data")){if(Number(a.headers.get("content-length")??0)>q)throw Error(`Attachments are too large (limit ${q/1024/1024} MB in total)`);let b=await a.formData();return{testCase:String(b.get("testCase")??"").trim(),headless:"false"!==b.get("headless"),files:b.getAll("files").filter(a=>a instanceof File)}}let b=await a.json();return{testCase:"string"==typeof b.testCase?b.testCase.trim():"",headless:!1!==b.headless,files:[]}}async function n(a){let b,c,d=(0,k.st)((0,k.Kd)());if(d)return e.NextResponse.json({error:d},{status:500});try{b=await m(a)}catch(b){let a=b instanceof Error?b.message:"invalid request body";return e.NextResponse.json({error:a},{status:400})}if(!b.testCase)return e.NextResponse.json({error:"testCase is required"},{status:400});let f=g().randomBytes(6).toString("hex");try{c=await (0,j.A4)(f,b.files)}catch(b){let a=b instanceof Error?b.message:"could not save attachments";return e.NextResponse.json({error:a},{status:400})}let l=function(a){for(let b of a.split("\n")){let a=b.trim();if(a)return a.slice(0,80)}return""}(b.testCase)||"Untitled test";return(0,h.ut)(f,l,b.testCase,c,b.headless),(0,i.J)(f,b.testCase,b.headless).catch(a=>{console.error("agent crashed",a)}),e.NextResponse.json({id:f})}d()}catch(a){d(a)}})},86439:a=>{a.exports=require("next/dist/shared/lib/no-fallback-error.external")},86606:(a,b,c)=>{async function d(a,b){for(let c of[a.getByRole("heading",{name:b,exact:!0}),a.getByRole("heading",{name:b}),a.getByText(b,{exact:!0}),a.getByText(b,{exact:!1})])if(await c.count().catch(()=>0)>0)return c.first();return null}c.d(b,{It:()=>e,P9:()=>f,t1:()=>d});let e=[{name:"set_plan",description:"CALL FIRST. Plan = array of groups, one per test case (TC-01, TC-02, …). If there is only one test case — one group. Put step text in steps WITHOUT leading numbers; do not split or add service sub-steps like 'open page'.",input_schema:{type:"object",properties:{groups:{type:"array",description:"One group per test case, in order.",items:{type:"object",properties:{title:{type:"string",description:"Test case title, e.g. 'TC-01. Missing section…'. Omit if unnamed."},steps:{type:"array",items:{type:"string"},description:"Steps of the test case, one action+check per item, no leading numbers."}},required:["steps"]}}},required:["groups"]}},{name:"navigate",description:"Open a URL in the browser.",input_schema:{type:"object",properties:{url:{type:"string"}},required:["url"]}},{name:"snapshot",description:"Get the page state: URL, title, and ARIA tree with ref=[eN] on each element — pass those refs to click/fill. The tree covers the WHOLE loaded page, not just the visible viewport — scrolling does NOT add elements to it. Call after every page change. If the tree is truncated or you need a specific section, pass `near` to zoom into just that block (e.g. near='Top ads') — this is unambiguous and never truncated, use it instead of scrolling to hunt for a control.",input_schema:{type:"object",properties:{near:{type:"string",description:"Optional: visible text of a section/heading to scope the snapshot to that block only, e.g. 'Top ads'. Returns the surrounding container's subtree with refs."}}}},{name:"click",description:"Click an element. ref from snapshot is required (e.g. e12).",input_schema:{type:"object",properties:{ref:{type:"string",description:"Element ref from snapshot, e.g. e12"},name:{type:"string",description:"Human-readable label for the log, e.g. 'Login button'"}},required:["ref"]}},{name:"fill",description:"Type text into a field. ref from snapshot is required (e.g. e7).",input_schema:{type:"object",properties:{ref:{type:"string",description:"Field ref from snapshot, e.g. e7"},value:{type:"string",description:"Text to type"},name:{type:"string",description:"Human-readable field label for the log, e.g. 'Username'"}},required:["ref","value"]}},{name:"press",description:"Press a key (Enter, Tab, Escape, ArrowDown, etc.)",input_schema:{type:"object",properties:{key:{type:"string"}},required:["key"]}},{name:"dismiss",description:"Close an open overlay (dropdown, popover, tooltip, multi-select panel) by clicking an empty spot in the page corner — i.e. a click OUTSIDE the overlay. Use this when a click fails with 'intercepts pointer events' (an overlay is covering your target) and Escape doesn't help. After calling, take a fresh snapshot.",input_schema:{type:"object",properties:{}}},{name:"wait",description:"Wait N milliseconds (use sparingly, max 3000).",input_schema:{type:"object",properties:{ms:{type:"number"}},required:["ms"]}},{name:"select",description:"Choose an option in a <select> dropdown. ref from snapshot is required.",input_schema:{type:"object",properties:{ref:{type:"string",description:"ref of the <select> element from snapshot, e.g. e9"},value:{type:"string",description:"Option value or visible label to select"},name:{type:"string",description:"Human-readable label for the log"}},required:["ref","value"]}},{name:"hover",description:"Hover the mouse over an element (to reveal tooltips, dropdowns, etc). ref from snapshot is required.",input_schema:{type:"object",properties:{ref:{type:"string",description:"ref of the element from snapshot, e.g. e5"},name:{type:"string",description:"Human-readable label for the log"}},required:["ref"]}},{name:"scroll_to",description:"Scroll until a target element is visible. PREFERRED over pixel scroll when you know what you're looking for. Automatically scrolls the right container (page, inner scrollable div, or sideways) to reveal it. Target by text OR by ref. After calling, take a snapshot to get a fresh ref.",input_schema:{type:"object",properties:{text:{type:"string",description:"Visible text of the target element or section heading, e.g. 'Top ads' or 'Show all'. Use a short, unique substring."},ref:{type:"string",description:"Alternatively, ref of the target from a snapshot (e.g. e14) — use for icons/unlabeled elements with no stable text."}}}},{name:"scroll",description:"Scroll by a pixel offset. Without ref — scrolls the main window. With ref — scrolls the nearest scrollable block CONTAINING that element (pass any ref inside the block you want to scroll; the actual scroll container is found automatically). Returns the new position and whether the end is reached. Prefer scroll_to when you know the target.",input_schema:{type:"object",properties:{y:{type:"number",description:"Vertical scroll in pixels (positive = down, negative = up). 0 for pure horizontal."},x:{type:"number",description:"Horizontal scroll in pixels (positive = right, negative = left). Default 0."},ref:{type:"string",description:"Optional ref of any element inside the block to scroll, e.g. e14. Omit to scroll the main window."}},required:["y"]}},{name:"upload_file",description:"Attach one of the run's files to a file-upload control on the page. This hands the file to the page — it does NOT reveal the file's contents to you. Only files listed as attached to this run can be used; give the file name exactly as listed. Works with a plain <input type=file> and with custom 'Choose file' buttons that open the OS file dialog. Omit ref if the page has just one upload control; pass ref when there are several, or the ref of the visible button/dropzone that opens the file dialog.",input_schema:{type:"object",properties:{file:{type:"string",description:"Name of an attached file, exactly as listed in the task, e.g. 'users.csv'"},ref:{type:"string",description:"Optional ref of the file input, or of the button/dropzone that opens the file dialog. Omit to use the only upload control on the page (file inputs are often hidden and absent from the snapshot)."},name:{type:"string",description:"Human-readable label for the log"}},required:["file"]}},{name:"switch_tab",description:"Switch to another open browser tab. When an action opens a new tab you are moved to it automatically; use this to go back (or forward). The list of open tabs with their numbers is shown in action results whenever more than one tab is open.",input_schema:{type:"object",properties:{index:{type:"number",description:"Tab number from the list, starting at 1."}},required:["index"]}},{name:"handle_dialog",description:"Decide what happens to the NEXT native browser dialog (alert / confirm / prompt). By default every dialog is accepted (OK) and its text is reported to you. Call this BEFORE the action that opens the dialog when the test case says to press Cancel, or to type a value into a prompt.",input_schema:{type:"object",properties:{action:{type:"string",enum:["accept","dismiss"],description:"accept = OK, dismiss = Cancel."},text:{type:"string",description:"Text to type into a prompt() dialog before accepting."}},required:["action"]}},{name:"mock_request",description:"Intercept network requests matching a URL and control the response, the way a tester does with Charles or DevTools. Call it BEFORE the action that triggers the request. Modes: (1) status and/or body — answer with a made-up response without hitting the server; invent realistic body data in the shape the page expects when the test case gives none; (2) patch — let the real request through and merge fields into the real JSON response (the most reliable way to change one field); (3) abort — fail the request with a network error. delay_ms slows the request down and can be combined with any mode or used alone. Mocks stay active until clear_mocks.",input_schema:{type:"object",properties:{url:{type:"string",description:"Part of the request URL ('/api/cart'), or a glob with * ('*/orders/*')."},method:{type:"string",description:"Only this HTTP method (GET, POST, …). Omit for any."},status:{type:"number",description:"HTTP status to answer with, e.g. 500. Defaults to 200 when body is given."},body:{type:"string",description:"Response body to answer with — usually a JSON string."},content_type:{type:"string",description:"Content-Type of body. Defaults to application/json for JSON, else text/plain."},patch:{type:"object",description:"JSON merged into the REAL response: objects merge recursively, lists and values are replaced. If the response is a list, the patch is applied to every item."},abort:{type:"boolean",description:"true = the request fails with a network error."},delay_ms:{type:"number",description:"Delay before the response, in ms (max 30000)."}},required:["url"]}},{name:"clear_mocks",description:"Remove all mocks installed with mock_request; requests go to the real server again. Also reports how many requests each mock matched.",input_schema:{type:"object",properties:{}}},{name:"set_offline",description:"Turn the browser's network off or back on, to check how the page behaves without a connection.",input_schema:{type:"object",properties:{offline:{type:"boolean"}},required:["offline"]}},{name:"get_requests",description:"List recent network requests the page made (XHR/fetch calls and page loads) — the Network tab: method, URL, status, request body and JSON response body. Use it to verify that a request was sent with the right data, or that the server answered with the expected status. Secrets are masked.",input_schema:{type:"object",properties:{url:{type:"string",description:"Only requests whose URL contains this text (or matches this glob)."},method:{type:"string",description:"Only this HTTP method."},failed_only:{type:"boolean",description:"Only requests that failed or returned 4xx/5xx."},limit:{type:"number",description:"How many of the latest matches to return (default 15)."}}}},{name:"get_console",description:"JavaScript errors from the browser console for the whole run (console.error and uncaught exceptions).",input_schema:{type:"object",properties:{}}},{name:"ask_user",description:"Ask the user for ONE specific value needed right now (OTP/SMS code, captcha, phone number for login). Use ONLY when the value is not in the test case and the agent cannot know it. prompt must describe exactly the field currently on screen (by its label/placeholder from the snapshot).",input_schema:{type:"object",properties:{prompt:{type:"string",description:"What to enter, by field label. Example: 'Enter phone number', 'Enter SMS code'."},secret:{type:"boolean",description:"true only for secret values: password, OTP/SMS code, CVV. false for phone, email, username."}},required:["prompt"]}},{name:"report_step",description:"Record the result of one test case step. Call AFTER executing and checking the expected result. Screenshot for fail/warn is taken automatically.",input_schema:{type:"object",properties:{num:{type:"number",description:"Sequential step number from the plan (across all groups, as returned by set_plan)."},description:{type:"string",description:"Brief description of what was checked."},status:{type:"string",enum:["pass","fail","warn"]},expected:{type:"string",description:"Expected result of this step, copied from the test case. Omit if the test case states none."},evidence:{type:"string",description:"Actual result — what was observed: verbatim text quote from the page, request status, dialog text."}},required:["num","description","status"]}},{name:"finish",description:"End the run after all steps are complete.",input_schema:{type:"object",properties:{status:{type:"string",enum:["passed","failed"]},summary:{type:"string",description:"1-3 sentences about the results, written in the same language as the test case."}},required:["status","summary"]}}];async function f(a,b){let c=a.url();if(!c||"about:blank"===c)return`URL: ${c||"about:blank"}
65
+ ${h.join("\n")}${i}`}takeConsoleErrors(){let a=this.consoleErrors.slice(this.consoleRead);return this.consoleRead=this.consoleErrors.length,a}takeUnverifiedMockHits(){let a=this.unverifiedHits;return this.unverifiedHits=0,a}allConsoleErrors(){return[...this.consoleErrors]}}},11997:a=>{a.exports=require("punycode")},19121:a=>{a.exports=require("next/dist/server/app-render/action-async-storage.external.js")},27910:a=>{a.exports=require("stream")},28354:a=>{a.exports=require("util")},29021:a=>{a.exports=require("fs")},29294:a=>{a.exports=require("next/dist/server/app-render/work-async-storage.external.js")},31421:a=>{a.exports=require("node:child_process")},33873:a=>{a.exports=require("path")},37830:a=>{a.exports=require("node:stream/web")},41228:(a,b,c)=>{c.d(b,{BE:()=>g,gZ:()=>h,hP:()=>k,A4:()=>j});let d=require("node:fs/promises");var e=c(48161),f=c(76760);let g=10,h=0x1900000,i=(0,f.join)((0,e.tmpdir)(),"qpilot-uploads");async function j(a,b){if(0===b.length)return[];if(b.length>g)throw Error(`Too many attachments: ${b.length} (max ${g})`);let c=(0,f.join)(i,a);await (0,d.mkdir)(c,{recursive:!0});let e=new Set,j=[];try{for(let[a,g]of b.entries()){var l;if(g.size>h)throw Error(`Attachment "${g.name}" is ${Math.round(g.size/1024/1024)} MB — the limit is ${h/1024/1024} MB`);let b=(l=g.name,(l.split(/[/\\]/).pop()??"").trim().replace(/[^\p{L}\p{N}._\- ()[\]]+/gu,"_").replace(/^\.+/,"").slice(0,120)||`file-${a+1}`);for(let a=2;e.has(b);a++){let c=b.lastIndexOf(".");b=c>0?`${b.slice(0,c)}-${a}${b.slice(c)}`:`${b}-${a}`}e.add(b);let i=(0,f.join)(c,b);await (0,d.writeFile)(i,Buffer.from(await g.arrayBuffer())),j.push({name:b,path:i,size:g.size})}}catch(b){throw await k(a),b}return j}async function k(a){await (0,d.rm)((0,f.join)(i,a),{recursive:!0,force:!0}).catch(()=>{})}},44870:a=>{a.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},48161:a=>{a.exports=require("node:os")},55591:a=>{a.exports=require("https")},57075:a=>{a.exports=require("node:stream")},63033:a=>{a.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},71011:(a,b,c)=>{c.d(b,{I6:()=>m,RG:()=>i,o5:()=>j,ry:()=>l,s9:()=>k,tF:()=>h});var d=c(73024),e=c(48161),f=c(76760);let g=process.env.QPILOT_HOME||(0,f.join)((0,e.homedir)(),".qpilot"),h=(0,f.join)(g,"config.json");function i(){try{let a=JSON.parse((0,d.readFileSync)(h,"utf-8"));if(!a||"object"!=typeof a)return null;return{provider:"custom"===a.provider?"custom":"anthropic",apiKey:"string"==typeof a.apiKey?a.apiKey:"",model:"string"==typeof a.model&&a.model?a.model:void 0,baseURL:"string"==typeof a.baseURL&&a.baseURL?a.baseURL:void 0}}catch{return null}}function j(a){(0,d.mkdirSync)(g,{recursive:!0,mode:448});let b=`${h}.${process.pid}.tmp`;(0,d.writeFileSync)(b,JSON.stringify(a,null,2),{mode:384}),(0,d.renameSync)(b,h)}function k(a){return a?a.length>14?`${a.slice(0,7)}…${a.slice(-4)}`:"••••":""}function l(a,b,c){let d;return a&&a.provider===b&&(d=a.baseURL,(d??"").trim().replace(/\/+$/,"")===(c??"").trim().replace(/\/+$/,""))?a.apiKey:""}function m(a,b){let c=a=>"string"==typeof a?a.trim():"",d="custom"===a.provider?"custom":"anthropic",e=c(a.model),f=c(a.baseURL).replace(/\/+$/,""),g=c(a.apiKey)||l(b,d,f);if(!g){if(b?.apiKey&&b.provider===d)throw Error("Re-enter the API key to change the base URL — the saved key is only ever sent to the address it was saved with.");throw Error("custom"===d?"API token is required":"Anthropic API key is required")}if(f&&!/^https?:\/\/\S+$/.test(f))throw Error("Base URL must start with http:// or https://");if("custom"===d){if(!f)throw Error("Base URL is required for an OpenAI-compatible provider");if(!e)throw Error("Model id is required")}return{provider:d,apiKey:g,...e?{model:e}:{},...f?{baseURL:f}:{}}}},71151:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{handler:()=>x,patchFetch:()=>w,routeModule:()=>y,serverHooks:()=>B,workAsyncStorage:()=>z,workUnitAsyncStorage:()=>A});var e=c(95736),f=c(9117),g=c(4044),h=c(39326),i=c(32324),j=c(261),k=c(54290),l=c(85328),m=c(38928),n=c(46595),o=c(3421),p=c(17679),q=c(41681),r=c(63446),s=c(86439),t=c(51356),u=c(83505),v=a([u]);u=(v.then?(await v)():v)[0];let y=new e.AppRouteRouteModule({definition:{kind:f.RouteKind.APP_ROUTE,page:"/api/run/route",pathname:"/api/run",filename:"route",bundlePath:"app/api/run/route"},distDir:".next",relativeProjectDir:"",resolvedPagePath:"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/api/run/route.ts",nextConfigOutput:"standalone",userland:u}),{workAsyncStorage:z,workUnitAsyncStorage:A,serverHooks:B}=y;function w(){return(0,g.patchFetch)({workAsyncStorage:z,workUnitAsyncStorage:A})}async function x(a,b,c){var d;let e="/api/run/route";"/index"===e&&(e="/");let g=await y.prepare(a,b,{srcPage:e,multiZoneDraftMode:!1});if(!g)return b.statusCode=400,b.end("Bad Request"),null==c.waitUntil||c.waitUntil.call(c,Promise.resolve()),null;let{buildId:u,params:v,nextConfig:w,isDraftMode:x,prerenderManifest:z,routerServerContext:A,isOnDemandRevalidate:B,revalidateOnlyGenerated:C,resolvedPathname:D}=g,E=(0,j.normalizeAppPath)(e),F=!!(z.dynamicRoutes[E]||z.routes[D]);if(F&&!x){let a=!!z.routes[D],b=z.dynamicRoutes[E];if(b&&!1===b.fallback&&!a)throw new s.NoFallbackError}let G=null;!F||y.isDev||x||(G=D,G="/index"===G?"/":G);let H=!0===y.isDev||!F,I=F&&!H,J=a.method||"GET",K=(0,i.getTracer)(),L=K.getActiveScopeSpan(),M={params:v,prerenderManifest:z,renderOpts:{experimental:{cacheComponents:!!w.experimental.cacheComponents,authInterrupts:!!w.experimental.authInterrupts},supportsDynamicResponse:H,incrementalCache:(0,h.getRequestMeta)(a,"incrementalCache"),cacheLifeProfiles:null==(d=w.experimental)?void 0:d.cacheLife,isRevalidate:I,waitUntil:c.waitUntil,onClose:a=>{b.on("close",a)},onAfterTaskError:void 0,onInstrumentationRequestError:(b,c,d)=>y.onRequestError(a,b,d,A)},sharedContext:{buildId:u}},N=new k.NodeNextRequest(a),O=new k.NodeNextResponse(b),P=l.NextRequestAdapter.fromNodeNextRequest(N,(0,l.signalFromNodeResponse)(b));try{let d=async c=>y.handle(P,M).finally(()=>{if(!c)return;c.setAttributes({"http.status_code":b.statusCode,"next.rsc":!1});let d=K.getRootSpanAttributes();if(!d)return;if(d.get("next.span_type")!==m.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${d.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let e=d.get("next.route");if(e){let a=`${J} ${e}`;c.setAttributes({"next.route":e,"http.route":e,"next.span_name":a}),c.updateName(a)}else c.updateName(`${J} ${a.url}`)}),g=async g=>{var i,j;let k=async({previousCacheEntry:f})=>{try{if(!(0,h.getRequestMeta)(a,"minimalMode")&&B&&C&&!f)return b.statusCode=404,b.setHeader("x-nextjs-cache","REVALIDATED"),b.end("This page could not be found"),null;let e=await d(g);a.fetchMetrics=M.renderOpts.fetchMetrics;let i=M.renderOpts.pendingWaitUntil;i&&c.waitUntil&&(c.waitUntil(i),i=void 0);let j=M.renderOpts.collectedTags;if(!F)return await (0,o.I)(N,O,e,M.renderOpts.pendingWaitUntil),null;{let a=await e.blob(),b=(0,p.toNodeOutgoingHttpHeaders)(e.headers);j&&(b[r.NEXT_CACHE_TAGS_HEADER]=j),!b["content-type"]&&a.type&&(b["content-type"]=a.type);let c=void 0!==M.renderOpts.collectedRevalidate&&!(M.renderOpts.collectedRevalidate>=r.INFINITE_CACHE)&&M.renderOpts.collectedRevalidate,d=void 0===M.renderOpts.collectedExpire||M.renderOpts.collectedExpire>=r.INFINITE_CACHE?void 0:M.renderOpts.collectedExpire;return{value:{kind:t.CachedRouteKind.APP_ROUTE,status:e.status,body:Buffer.from(await a.arrayBuffer()),headers:b},cacheControl:{revalidate:c,expire:d}}}}catch(b){throw(null==f?void 0:f.isStale)&&await y.onRequestError(a,b,{routerKind:"App Router",routePath:e,routeType:"route",revalidateReason:(0,n.c)({isRevalidate:I,isOnDemandRevalidate:B})},A),b}},l=await y.handleResponse({req:a,nextConfig:w,cacheKey:G,routeKind:f.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:z,isRoutePPREnabled:!1,isOnDemandRevalidate:B,revalidateOnlyGenerated:C,responseGenerator:k,waitUntil:c.waitUntil});if(!F)return null;if((null==l||null==(i=l.value)?void 0:i.kind)!==t.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==l||null==(j=l.value)?void 0:j.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});(0,h.getRequestMeta)(a,"minimalMode")||b.setHeader("x-nextjs-cache",B?"REVALIDATED":l.isMiss?"MISS":l.isStale?"STALE":"HIT"),x&&b.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let m=(0,p.fromNodeOutgoingHttpHeaders)(l.value.headers);return(0,h.getRequestMeta)(a,"minimalMode")&&F||m.delete(r.NEXT_CACHE_TAGS_HEADER),!l.cacheControl||b.getHeader("Cache-Control")||m.get("Cache-Control")||m.set("Cache-Control",(0,q.getCacheControlHeader)(l.cacheControl)),await (0,o.I)(N,O,new Response(l.value.body,{headers:m,status:l.value.status||200})),null};L?await g(L):await K.withPropagatedContext(a.headers,()=>K.trace(m.BaseServerSpan.handleRequest,{spanName:`${J} ${a.url}`,kind:i.SpanKind.SERVER,attributes:{"http.method":J,"http.target":a.url}},g))}catch(b){if(b instanceof s.NoFallbackError||await y.onRequestError(a,b,{routerKind:"App Router",routePath:E,routeType:"route",revalidateReason:(0,n.c)({isRevalidate:I,isOnDemandRevalidate:B})}),F)throw b;return await (0,o.I)(N,O,new Response(null,{status:500})),null}}d()}catch(a){d(a)}})},73024:a=>{a.exports=require("node:fs")},73566:a=>{a.exports=require("worker_threads")},74075:a=>{a.exports=require("zlib")},76760:a=>{a.exports=require("node:path")},77598:a=>{a.exports=require("node:crypto")},78474:a=>{a.exports=require("node:events")},79551:a=>{a.exports=require("url")},81630:a=>{a.exports=require("http")},83237:a=>{a.exports=import("playwright")},83505:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{POST:()=>n,dynamic:()=>p,runtime:()=>o});var e=c(10641),f=c(77598),g=c.n(f),h=c(92628),i=c(4803),j=c(41228),k=c(6260),l=a([i]);i=(l.then?(await l)():l)[0];let o="nodejs",p="force-dynamic",q=j.BE*j.gZ;async function m(a){if((a.headers.get("content-type")??"").includes("multipart/form-data")){if(Number(a.headers.get("content-length")??0)>q)throw Error(`Attachments are too large (limit ${q/1024/1024} MB in total)`);let b=await a.formData();return{testCase:String(b.get("testCase")??"").trim(),headless:"false"!==b.get("headless"),files:b.getAll("files").filter(a=>a instanceof File)}}let b=await a.json();return{testCase:"string"==typeof b.testCase?b.testCase.trim():"",headless:!1!==b.headless,files:[]}}async function n(a){let b,c,d=(0,k.st)((0,k.Kd)());if(d)return e.NextResponse.json({error:d},{status:500});try{b=await m(a)}catch(b){let a=b instanceof Error?b.message:"invalid request body";return e.NextResponse.json({error:a},{status:400})}if(!b.testCase)return e.NextResponse.json({error:"testCase is required"},{status:400});let f=g().randomBytes(6).toString("hex");try{c=await (0,j.A4)(f,b.files)}catch(b){let a=b instanceof Error?b.message:"could not save attachments";return e.NextResponse.json({error:a},{status:400})}let l=function(a){for(let b of a.split("\n")){let a=b.trim();if(a)return a.slice(0,80)}return""}(b.testCase)||"Untitled test";return(0,h.ut)(f,l,b.testCase,c,b.headless),(0,i.J)(f,b.testCase,b.headless).catch(a=>{console.error("agent crashed",a)}),e.NextResponse.json({id:f})}d()}catch(a){d(a)}})},86439:a=>{a.exports=require("next/dist/shared/lib/no-fallback-error.external")},86606:(a,b,c)=>{async function d(a,b){for(let c of[a.getByRole("heading",{name:b,exact:!0}),a.getByRole("heading",{name:b}),a.getByText(b,{exact:!0}),a.getByText(b,{exact:!1})])if(await c.count().catch(()=>0)>0)return c.first();return null}c.d(b,{It:()=>g,P9:()=>h,t1:()=>d});let e=(a="Element")=>({type:"string",description:`${a} ref from the latest page tree, e.g. e12`}),f={type:"string",description:"Short human-readable name for the log, e.g. 'Login button'"},g=[{name:"set_plan",description:"First call of the run. One group per test case; each step is the tester's step (action and expected result) without a leading number. Preconditions are not steps.",input_schema:{type:"object",properties:{groups:{type:"array",items:{type:"object",properties:{title:{type:"string",description:"Test case title; omit if it has none."},steps:{type:"array",items:{type:"string"}}},required:["steps"]}}},required:["groups"]}},{name:"navigate",description:"Open a URL. Returns the page tree.",input_schema:{type:"object",properties:{url:{type:"string"}},required:["url"]}},{name:"snapshot",description:"Read the page tree again. Rarely needed: every action already returns it. Use near to get only the block around a text (never truncated, disambiguates repeated labels), or when a result came without a tree.",input_schema:{type:"object",properties:{near:{type:"string",description:"Visible text of a heading or block to zoom into, e.g. 'Top ads'."}}}},{name:"click",description:"Click an element (its centre). With dx/dy the click lands that many pixels away from the centre, on whatever is there — for clicking NEXT TO an element.",input_schema:{type:"object",properties:{ref:e(),name:f,dx:{type:"number",description:"Offset from the centre in px, positive = right."},dy:{type:"number",description:"Offset from the centre in px, positive = down."}},required:["ref"]}},{name:"fill",description:"Type text into a field, replacing what is there.",input_schema:{type:"object",properties:{ref:e("Field"),value:{type:"string"},name:f},required:["ref","value"]}},{name:"select",description:"Choose an option of a <select> dropdown, by its value or visible label.",input_schema:{type:"object",properties:{ref:e("<select>"),value:{type:"string"},name:f},required:["ref","value"]}},{name:"hover",description:"Move the mouse over an element — for anything that opens on hover (notification bell, avatar menu, tooltip, submenu). The result shows the opened panel.",input_schema:{type:"object",properties:{ref:e(),name:f},required:["ref"]}},{name:"press",description:"Press a key: Enter, Tab, Escape, ArrowDown…",input_schema:{type:"object",properties:{key:{type:"string"}},required:["key"]}},{name:"dismiss",description:"Close an open dropdown/popover by clicking an empty corner of the page. Use when a click fails with 'intercepts pointer events'.",input_schema:{type:"object",properties:{}}},{name:"wait_for",description:"Wait until a text appears (or, with gone=true, disappears) — for slow pages that still show the old state or a loader. Returns as soon as it happens, with the page tree.",input_schema:{type:"object",properties:{text:{type:"string",description:"Text the expected state must show, e.g. a heading."},gone:{type:"boolean"},timeout_s:{type:"number",description:"Default 30, max 90."}},required:["text"]}},{name:"wait",description:"Wait N ms (max 10000). Prefer wait_for when you know what should appear.",input_schema:{type:"object",properties:{ms:{type:"number"}},required:["ms"]}},{name:"scroll_to",description:"Scroll until an element is visible, whatever container holds it. Target by text or ref.",input_schema:{type:"object",properties:{text:{type:"string"},ref:e()}}},{name:"scroll",description:"Scroll by pixels. Without ref — the window; with ref of any element inside a scrollable block — that block. Returns position and limits. Only for lazy-loaded content: scrolling never adds elements to the page tree.",input_schema:{type:"object",properties:{y:{type:"number",description:"Positive = down."},x:{type:"number",description:"Positive = right."},ref:e("Any element inside the block to scroll")}}},{name:"upload_file",description:"Give one of the run's attached files to an upload control. Omit ref first (file inputs are usually hidden); pass ref of the file input or of the button/dropzone only if that fails. You cannot see the file's contents.",input_schema:{type:"object",properties:{file:{type:"string",description:"Name of an attached file, as listed."},ref:e("File input or upload button"),name:f},required:["file"]}},{name:"switch_tab",description:"Switch to another open tab by its number from the Tabs line. You are moved to a newly opened tab automatically.",input_schema:{type:"object",properties:{index:{type:"number"}},required:["index"]}},{name:"handle_dialog",description:"Set what happens to the NEXT native dialog (alert/confirm/prompt). Dialogs are accepted by default; call this BEFORE the action that opens one to press Cancel or to type into a prompt.",input_schema:{type:"object",properties:{action:{type:"string",enum:["accept","dismiss"]},text:{type:"string",description:"Text to type into a prompt()."}},required:["action"]}},{name:"note",description:"Save a fact you will need later: a value to compare, an id, a state before a change. Notes stay in your context for the whole run; old page trees do not.",input_schema:{type:"object",properties:{text:{type:"string"}},required:["text"]}},{name:"mock_request",description:"Intercept requests whose URL matches and control the response. Call BEFORE the action that sends the request. status/body = answer without hitting the server; patch = merge fields into the REAL JSON response; abort = network error; delay_ms = slow it down. Stays active until clear_mocks.",input_schema:{type:"object",properties:{url:{type:"string",description:"Part of the URL ('/api/cart') or a glob with * ('*/orders/*')."},method:{type:"string"},status:{type:"number"},body:{type:"string",description:"Response body, usually a JSON string."},content_type:{type:"string"},patch:{type:"object",description:"Merged into the real response; applied to every item if it is a list."},abort:{type:"boolean"},delay_ms:{type:"number"}},required:["url"]}},{name:"clear_mocks",description:"Remove all mocks; reports how many requests each one matched.",input_schema:{type:"object",properties:{}}},{name:"set_offline",description:"Turn the browser's network off (true) or back on (false).",input_schema:{type:"object",properties:{offline:{type:"boolean"}},required:["offline"]}},{name:"get_requests",description:"The Network tab: recent XHR/fetch calls and page loads with method, URL, status, request body and JSON response. `find` matches the URL or the request body, so an RPC method name works too.",input_schema:{type:"object",properties:{find:{type:"string",description:"Text in the URL or request body, e.g. 'orders' or 'getNotifications'."},method:{type:"string"},failed_only:{type:"boolean",description:"Only failed or 4xx/5xx."},limit:{type:"number",description:"Latest N matches, default 15."}}}},{name:"get_console",description:"JavaScript console errors of the whole run.",input_schema:{type:"object",properties:{}}},{name:"ask_user",description:"Ask the user for ONE value the test case does not give and you cannot know: a login, phone, OTP, captcha. Name the field on screen.",input_schema:{type:"object",properties:{prompt:{type:"string",description:"What to enter, e.g. 'Enter the SMS code'."},secret:{type:"boolean",description:"true for passwords and codes."}},required:["prompt"]}},{name:"report_step",description:"Record the verdict of one step, AFTER you have seen the result of its actions. Screenshot for fail/warn is automatic.",input_schema:{type:"object",properties:{num:{type:"number",description:"Step number from the plan."},expected:{type:"string",description:"Expected result of the step, copied from the test case."},evidence:{type:"string",description:"What you actually saw, one or two sentences: a verbatim quote from the page, a request and its status, a dialog text. For a 'changed / did not change' check give the value before and after for every element checked."},status:{type:"string",enum:["pass","fail","warn"],description:"Decided from the evidence you just wrote: pass only if it shows the expected result."},description:{type:"string",description:"Only if the step went differently from the plan: one line saying what was done."}},required:["num","evidence","status"]}},{name:"finish",description:"End the run after the last step is reported.",input_schema:{type:"object",properties:{status:{type:"string",enum:["passed","failed"]},summary:{type:"string",description:"1–2 sentences, in the language of the test case."}},required:["status","summary"]}}];async function h(a,b){let c=a.url();if(!c||"about:blank"===c)return`URL: ${c||"about:blank"}
76
66
 
77
67
  Page not opened yet. Call navigate with the starting URL from the test case first.`;let e=await a.title().catch(()=>""),f=a.locator("body"),g="",h=b?.trim();if(h){let b=await d(a,h);b?await b.evaluate((a,b)=>{let c=a,d=a;for(let a=0;a<b&&c;a++){let a=c.querySelectorAll("*").length;if(a>300||(d=c,a>=25))break;c=c.parentElement}return d.setAttribute("data-qa-scope","1"),!0},8).catch(()=>!1)&&(f=a.locator('[data-qa-scope="1"]').first(),g=` (scoped to the block around "${h}")`):g=` ("${h}" not found — showing full page)`}let i="";try{i=await f.ariaSnapshot({mode:"ai",timeout:5e3})}catch(a){i=`(snapshot failed: ${a instanceof Error?a.message:String(a)})`}finally{h&&await a.evaluate(()=>document.querySelectorAll('[data-qa-scope="1"]').forEach(a=>a.removeAttribute("data-qa-scope"))).catch(()=>{})}return i.length>16e3&&(i=i.slice(0,16e3)+"\n... (truncated. Elements past this point are NOT shown — including submit/footer buttons at the bottom of long forms. To act on something not listed here, use snapshot with `near='<text near it>'`, or scroll_to('<button text>') to bring it into a fresh snapshot. Scrolling alone won't reveal it.)"),[`URL: ${c}`,`Title: ${e}${g}`,"\nPage snapshot (pass [ref=…] of the target element to click/fill):",i].join("\n")}}};var b=require("../../../webpack-runtime.js");b.C(a);var c=b.X(0,[873,692,168,864],()=>b(b.s=71151));module.exports=c})();
@@ -1 +1 @@
1
- globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/api/run/route"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"622":{"*":{"id":"82146","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"31603","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"75170","name":"*","chunks":[],"async":false}},"4166":{"*":{"id":"24630","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"12263","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"78922","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"54160","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"68495","name":"*","chunks":[],"async":false}},"8036":{"*":{"id":"75142","name":"*","chunks":[],"async":false}},"8446":{"*":{"id":"26501","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"29234","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"77526","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/builtin/global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/builtin/global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/metadata/async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/metadata/async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/lib/framework/boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-sans\"}],\"variableName\":\"sans\"}":{"id":5728,"name":"*","chunks":["558","static/chunks/app/layout-662806276d567675.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist_Mono\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-mono\"}],\"variableName\":\"mono\"}":{"id":9678,"name":"*","chunks":["558","static/chunks/app/layout-662806276d567675.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/globals.css":{"id":1290,"name":"*","chunks":["558","static/chunks/app/layout-662806276d567675.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/page.tsx":{"id":4166,"name":"*","chunks":["628","static/chunks/628-c8e9b74cd568418b.js","677","static/chunks/677-f779c1efc6740046.js","974","static/chunks/app/page-c306a6ca88010f4b.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/settings/page.tsx":{"id":8036,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/run/[id]/page.tsx":{"id":8446,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/":[],"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/layout":[{"inlined":false,"path":"static/css/6a883a6c62470f9e.css"}],"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/page":[],"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/api/run/route":[]},"rscModuleMapping":{"622":{"*":{"id":"51384","name":"*","chunks":[],"async":false}},"1290":{"*":{"id":"82704","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"23597","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"89748","name":"*","chunks":[],"async":false}},"4166":{"*":{"id":"17742","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"73041","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"7184","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"81170","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"36893","name":"*","chunks":[],"async":false}},"8036":{"*":{"id":"45144","name":"*","chunks":[],"async":false}},"8446":{"*":{"id":"41688","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"69576","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"6060","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}}
1
+ globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/api/run/route"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"622":{"*":{"id":"82146","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"31603","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"75170","name":"*","chunks":[],"async":false}},"4166":{"*":{"id":"24630","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"12263","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"78922","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"54160","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"68495","name":"*","chunks":[],"async":false}},"8036":{"*":{"id":"75142","name":"*","chunks":[],"async":false}},"8446":{"*":{"id":"26501","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"29234","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"77526","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/builtin/global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/builtin/global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/metadata/async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/metadata/async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/lib/framework/boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-sans\"}],\"variableName\":\"sans\"}":{"id":5728,"name":"*","chunks":["558","static/chunks/app/layout-662806276d567675.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist_Mono\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-mono\"}],\"variableName\":\"mono\"}":{"id":9678,"name":"*","chunks":["558","static/chunks/app/layout-662806276d567675.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/globals.css":{"id":1290,"name":"*","chunks":["558","static/chunks/app/layout-662806276d567675.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/page.tsx":{"id":4166,"name":"*","chunks":["628","static/chunks/628-c8e9b74cd568418b.js","677","static/chunks/677-25363eac0e2b4fd1.js","974","static/chunks/app/page-c306a6ca88010f4b.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/settings/page.tsx":{"id":8036,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/run/[id]/page.tsx":{"id":8446,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/":[],"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/layout":[{"inlined":false,"path":"static/css/6a883a6c62470f9e.css"}],"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/page":[],"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/api/run/route":[]},"rscModuleMapping":{"622":{"*":{"id":"51384","name":"*","chunks":[],"async":false}},"1290":{"*":{"id":"82704","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"23597","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"89748","name":"*","chunks":[],"async":false}},"4166":{"*":{"id":"17742","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"73041","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"7184","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"81170","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"36893","name":"*","chunks":[],"async":false}},"8036":{"*":{"id":"45144","name":"*","chunks":[],"async":false}},"8446":{"*":{"id":"41688","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"69576","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"6060","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}}
@@ -1 +1 @@
1
- globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/api/runs/route"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"622":{"*":{"id":"82146","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"31603","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"75170","name":"*","chunks":[],"async":false}},"4166":{"*":{"id":"24630","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"12263","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"78922","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"54160","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"68495","name":"*","chunks":[],"async":false}},"8036":{"*":{"id":"75142","name":"*","chunks":[],"async":false}},"8446":{"*":{"id":"26501","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"29234","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"77526","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/builtin/global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/builtin/global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/metadata/async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/metadata/async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/lib/framework/boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-sans\"}],\"variableName\":\"sans\"}":{"id":5728,"name":"*","chunks":["558","static/chunks/app/layout-662806276d567675.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist_Mono\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-mono\"}],\"variableName\":\"mono\"}":{"id":9678,"name":"*","chunks":["558","static/chunks/app/layout-662806276d567675.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/globals.css":{"id":1290,"name":"*","chunks":["558","static/chunks/app/layout-662806276d567675.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/page.tsx":{"id":4166,"name":"*","chunks":["628","static/chunks/628-c8e9b74cd568418b.js","677","static/chunks/677-f779c1efc6740046.js","974","static/chunks/app/page-c306a6ca88010f4b.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/settings/page.tsx":{"id":8036,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/run/[id]/page.tsx":{"id":8446,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/":[],"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/layout":[{"inlined":false,"path":"static/css/6a883a6c62470f9e.css"}],"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/page":[],"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/api/runs/route":[]},"rscModuleMapping":{"622":{"*":{"id":"51384","name":"*","chunks":[],"async":false}},"1290":{"*":{"id":"82704","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"23597","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"89748","name":"*","chunks":[],"async":false}},"4166":{"*":{"id":"17742","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"73041","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"7184","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"81170","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"36893","name":"*","chunks":[],"async":false}},"8036":{"*":{"id":"45144","name":"*","chunks":[],"async":false}},"8446":{"*":{"id":"41688","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"69576","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"6060","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}}
1
+ globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/api/runs/route"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"622":{"*":{"id":"82146","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"31603","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"75170","name":"*","chunks":[],"async":false}},"4166":{"*":{"id":"24630","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"12263","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"78922","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"54160","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"68495","name":"*","chunks":[],"async":false}},"8036":{"*":{"id":"75142","name":"*","chunks":[],"async":false}},"8446":{"*":{"id":"26501","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"29234","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"77526","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/builtin/global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/builtin/global-error.js":{"id":7150,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/client-page.js":{"id":1959,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/client-segment.js":{"id":7989,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":3886,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/metadata/async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/metadata/async-metadata.js":{"id":5278,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/client/components/render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":8924,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/lib/framework/boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":4431,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":622,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-sans\"}],\"variableName\":\"sans\"}":{"id":5728,"name":"*","chunks":["558","static/chunks/app/layout-662806276d567675.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist_Mono\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-mono\"}],\"variableName\":\"mono\"}":{"id":9678,"name":"*","chunks":["558","static/chunks/app/layout-662806276d567675.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/globals.css":{"id":1290,"name":"*","chunks":["558","static/chunks/app/layout-662806276d567675.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/page.tsx":{"id":4166,"name":"*","chunks":["628","static/chunks/628-c8e9b74cd568418b.js","677","static/chunks/677-25363eac0e2b4fd1.js","974","static/chunks/app/page-c306a6ca88010f4b.js"],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/settings/page.tsx":{"id":8036,"name":"*","chunks":[],"async":false},"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/run/[id]/page.tsx":{"id":8446,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/":[],"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/layout":[{"inlined":false,"path":"static/css/6a883a6c62470f9e.css"}],"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/page":[],"/Users/muhammadmahmudov/Desktop/qa/qa-antropic/app/api/runs/route":[]},"rscModuleMapping":{"622":{"*":{"id":"51384","name":"*","chunks":[],"async":false}},"1290":{"*":{"id":"82704","name":"*","chunks":[],"async":false}},"1959":{"*":{"id":"23597","name":"*","chunks":[],"async":false}},"3886":{"*":{"id":"89748","name":"*","chunks":[],"async":false}},"4166":{"*":{"id":"17742","name":"*","chunks":[],"async":false}},"4431":{"*":{"id":"73041","name":"*","chunks":[],"async":false}},"5278":{"*":{"id":"7184","name":"*","chunks":[],"async":false}},"7150":{"*":{"id":"81170","name":"*","chunks":[],"async":false}},"7989":{"*":{"id":"36893","name":"*","chunks":[],"async":false}},"8036":{"*":{"id":"45144","name":"*","chunks":[],"async":false}},"8446":{"*":{"id":"41688","name":"*","chunks":[],"async":false}},"8924":{"*":{"id":"69576","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"6060","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}}